Страницы: 1 2 След.
RSS
Загрузка несмежных столбцов Excel в переменную массива VBA, Как загрузить?
 
Всем доброго времени. Столкнулся с таким вопросом, как загрузить в переменную массива данные из несмежных столбцов екселя. Пробовал различные варианты: загружал циклами - долго (данные большие), Union - вещь хорошая, но таблицы разные и столбцы каждый раз нужны разные, не получилось. Пока временно написал макрос, который переносит нужные столбцы на темповый лист, там уж через объект Рандж грузит в массив. Но на мой взгляд не совсем хорошее решение. Если у кого-то есть идеи поделитесь, БУДУ ОЧЕНЬ ПРИЗНАТЕЛЕН!
 
Загружайте в массив НЕпрерывный диапазон, включая ненужные, промежуточные столбцы, а уже из него выбирайте данные из нужных столбцов
Согласие есть продукт при полном непротивлении сторон
 
Как вариант - массив массивов?
 
МММ ... стесняюсь спросить... а можно для особо одаренных на пальцах ...??

Цитата
Sanja написал: Загружайте в массив НЕпрерывный диапазон...
Да ранее так и делал, грузил в массив всю таблицу, НО... изменилась ситуация  данные стали гораздо больше и теперь при обработке ругается на т что не хватает памяти, вот поэтому вопрос и возник.
 
Цитата
HotShot написал: теперь при обработке ругается на т что не хватает памяти
Может в таком случае инструмент поменять? Запросы SQL, power query, pover pivot, power bi - в зависимости от задач.
Согласие есть продукт при полном непротивлении сторон
 
Да была идея ... однако по некоторым причинам ограничен в применении каких либо инструментов кроме штатного екселя  :(((
 
В один массив - один диапазон, в другой массив - второй диапазон, в третий массив - два созданных ранее массива.
Хотя... Зачем? Зачем вообще объединять диапазоны в одном массиве? Работайте с двумя.
 
Цитата
vikttur написал: в третий массив - два созданных ранее массива.
Общий принцип понял. Однако здесь ситуация такова - я получаю большое количество таблиц, с большими данными (200-500 тыс. строк) для руководства нужна особая "выжимка" ... т.е. из разных таблиц разные столбцы в обработанном виде ... обработчик написал ...но работать с ячейками не комильфо (долго)  с массивами быстрее ... вот как то так  
 
Я обычно так и делаю - гружу в массивы только нужные столбцы, хоть в 10 штук - т.к. обычно нужно выбирать данные одной строки этих параллельных массивов, то особо не напрягает в коде в разных местах брать не всюду из а(и,1), а где-то из б(и,1), где-то из в(и,1) и т.д.
 
Цитата
из разных таблиц разные столбцы в обработанном виде ...
Если памяти для загрузки всех данных мало, обрабатывать по очереди, перезаполняя массивы... без конкретных данных - только общие рекомендации.
Да и от названия темы в сторону уходим. Вам нужны были диапазоны в одном массиве.
 
Что касается темы, да мне грубо говоря, нужно два (3,4 и т.д.) несмежных столбца загнать в один массив. С Union это получается, но если номера столбцов каждый раз разные, то универсальную процедуру под Union написать не могу.
 
Хммм, странно, а у меня вот с Union  в один массив несмежные столбцы не получилось загнать. :( А что до определения диапазонов для Union, так это можно через диалоговые окна запрашивать.
Кому решение нужно - тот пример и рисует.
 
Пытливый - Union (Column(1),Column(3),Column(10)).Select
а потом Section в массив.
У меня вопрос в том как вот эти колумны через переменные в юнион загнать ... наверное нельзя т.к. функция будет переменную как текст воспринимать.
 
так текст-то можно преобразовать в целое, например:
Код
a=inputbox("введите номер столбца")
b=inputbox("введите номер столбца")
a=CInt(a): b=CInt(b)
Union(Columns(a), Columns(b))

А?
Кому решение нужно - тот пример и рисует.
 
Ладно наверно тема закрыта. Спасибо всем откликнувшимся.
 
Цитата
HotShot написал: т.к. функция будет переменную как текст воспринимать.
Ну это как запишите
Код
I = 3
J = 4
N = 10
Union(Columns(I), Columns(J), Columns(N)).Select
Согласие есть продукт при полном непротивлении сторон
 
Цитата
HotShot написал:
Union (Column(1),Column(3),Column(10)).Select
а потом Section в массив.
- сами пробовали?
 
Sanja -большое спасибо за неравнодушие, но это не спасает т.к. количество столбцов (в моём случае среда переменная) если бы данные были стандартны и требования начальства тоже тогда бы этот подход был бы очень кстати, но увы ... еще раз спасибо!
 
И что, нельзя на листе выделить диапазон, который при появлении начальства очищается, а при первых пожеланиях босса в ячейки лихоадочно вносятся номера или имена столбцов? А потом этот диапазон скармливается макросу обработки.
 
HotShot, есть функции листа, которые умеют синтезировать массив из несмежных столбцов. Например ЕСЛИ и ВЫБОР (может, и другие есть).
Заполните диапазон А1:Е11 чем-нибудь и попробуйте пройти по шагам (F8), наблюдая за переменной в окне Locals
Код
Sub bb()
Dim v()
  v = Evaluate("IF({1,0},A1:A9,C1:C10)")
  v = Evaluate("CHOOSE({1,2,3},A2:A10,E1:E5,C1:C11)")
End Sub
Первая размерность массива определяется самым длинным столбцом, недостающие элементы заполняются значением ошибки Error 2042 (#Н/Д).
Можно также провести предварительную обработку массивов функциями листа, например
Код
  v = Evaluate("CHOOSE({1,2,3},A2:A10*2,TRIM(E1:E5),MONTH(C1:C11))")
Разумеется, в строку с вычисляемой формулой можно подставить адреса, которые программа определит во время выполнения. Стиль адресов должен соответствовать текущему стилю ссылок. Примеры Вы можете найти так: https://www.google.ru/search?q=evaluate+referencestyle+site%3Aplanetaexcel.ru
Можно еще мой ник добавить :)
 
Доброе время суток.
Алексей, большое спасибо. Вариант
Код
v = Evaluate("CHOOSE({1,2,3},A1:A50000,C1:C500000,E1:E500000)")
отработал успешно.
 
Поэкспериментировал с различными переменными в строке для Evalute - все отработало.
Казанский,  спасибо
Заметил, что если диапазон предварительно обработан (Intersect()), то в массив добавляется не Error 2042, а 0
Код
Sub arrNotRelatedRange()
    Set iRng = Intersect(ActiveSheet.UsedRange, Columns("C"))
    iStr = "CHOOSE({1,2,3},A1:A15," & iRng.Address & ",H1:H" & Cells(Rows.Count, "H").End(xlUp).Row & ")"
    arr = Application.Evaluate(iStr)
End Sub
Изменено: Sanja - 25.11.2017 14:34:59
Согласие есть продукт при полном непротивлении сторон
 
Господа! Может немного не в тему, но оставлю здесь ссылки по Evaluate  - лично мне очень понравились и были полезными! [1]  [2]  [3]  [4]
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, ИМХО мы на этом форуме продвинулись дальше внешних источников  :D
1. Универсальность - в [1] нигде не упоминается стиль ссылок R1C1, а ведь некоторые предпочитают использовать такой стиль ссылок в Excel, и все приведенные в статье коды работать не будут;
2. Простота - заставить формулу работать как формулу массива с помощью INDEX(...,) проще, чем с помощью IF(ROW(2:99),...), т.к. не нужно вычислять и подставлять еще один фрагмент строки;
3. Удобство - чтобы не запутаться в нагромождении знаков & и " при подстановке адресов в формулу, мы используем Replace.
 
Казанский, ну я-то этого не знал)))) спасибо, что разъяснили - когда-нибудь и до Evaluate доберусь и разберу подробненько :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Андрей VG написал:
отработал успешно.
Поясните пожалуйста, как эта функция работает?
Почему работает макрос test1, а второй выдаёт "type mismatch".
Они идентичны, кроме столбца с условием.
IF(TTL[fasad]=""V"", 1,0) - работает
IF(TTL[fasad]=""V"", ""YES"",""NO"") - не работает
В чём может быть проблема?
Изменено: Мартын - 21.02.2020 12:52:05
 
Нет знатоков или проблема не имеет решения?
 
HotShot Вы бы задачу более детально описали, а лучше приложили файл с небольшим примером . Для чего вам такой массив и что вы с ним планируете делать дальше ? Возможно в Вашем случае и не нужны массивы, а можно использовать другие методы.
 
Цитата
Мартын написал:
В чём может быть проблема?
проблема в том, что Evaluate не воспринимает аргументы, длина которых более 255 символов. А у Вас во второй процедуре их аж 260.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
аж 260
Так вот где собака порылась!!!!
Огромное человеческое гранд мерси!!!
Вот истину говорят: "Век живи, век учись, но найдутся те, кто умнее"!
Страницы: 1 2 След.
Наверх