![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Старожил
Регистрация: 15.05.2008
Сообщений: 2,058
|
![]()
Здравствуйте, Уважаемые!
Ну не могу я въехать в массивы, хоть убей ( Есть рабочий код прихода товара на склад, работатет на циклах. Пока объемы были небольшие, все устраивало, но с увеличением количества товара макрос стал заметно тормозить. Решил сделать все на циклах, просмотрел темы на форуме, взял примеры кода, вроде даже стало получаться). Но получается только треть задачи, а вот если принимается товар с другой ценой или такого товара вообще нет на складе - нужно добавить новые строки в массив и вот тут я потух! Пробовал разные варианты кодов с форума, но видимо я не могу понять логику массивов или синтаксис. Понимаю, что нужен где-то тут ReDim, а вот дальше... Подскажите, пожалуйста, как все это сделать, мне просто понять нужно. Спасибо.
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499 |
![]() |
![]() |
![]() |
#2 |
Новичок
СтарожилДжуниор
Регистрация: 05.02.2008
Сообщений: 9,487
|
![]()
ReDim Preserve ...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
|
![]() |
![]() |
![]() |
#3 | |
Старожил
Регистрация: 15.05.2008
Сообщений: 2,058
|
![]() Цитата:
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499 |
|
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 24.12.2012
Сообщений: 776
|
![]()
VictorM, если предполагается работать с большим количеством строк в VBA-массиве (количество не могу сказать - надо тестирование провести), то макрос будет долго работать, т.к. при добавлении новой строки в VBA-массив на самом деле создаётся новый массив, а прежний удаляется. Нигде об этом на написано (я так понял) - это кто-то где-то как-то узнал.
Если предполагается сделать VBA-массив, а его размер заранее не известен, то если есть возможность, нужно сразу создать массив с тем количеством строк, которое может быть максимально. После заполнения массива, можно перенести данные в другой массив для удобства написания кода, удалив таким образом пустые строки. |
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 31.12.2010
Сообщений: 2,133
|
![]()
VictorM, в двумерный массив нельзя добавить "строку", а можно только "столбец". Т.е. в Redim Preserve можно менять только верхнюю границу последней размерности многомерного массива.
В принципе, можно транспонировать массив при считывании с диапазона. Тогда строки станут вторым индексом и добавить их можно. Но Application.Transpose (функцию ТРАНСП) в серьезном проекте использовать нежелательно, у этой функции есть существенные ограничения. А перекладывать один массив в другой в цикле некрасиво ![]() Если нужно добавлять строки (записи), можно использовать Collection, Dictionary или Recordset. Для данной задачи можно добиться ускорения, если поиск Наименования на листе СкладГотПр производить методом Range.Find или функцией Application.Match (ПОИСКПОЗ). Это будет быстрее, чем перебор циклом в массиве.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
|
![]() |
![]() |
![]() |
#6 | |
Старожил
Регистрация: 15.05.2008
Сообщений: 2,058
|
![]()
Казанский, большое спасибо за толковое разьяснение.
Особенно вот это Цитата:
Методом Range.Find я пользуюсь в текущем варианте кода, но что-то мне казалось, что с массивами будет быстрее. Еще раз спасибо, думаю, вопрос снят.
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499 |
|
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,170
|
![]()
Я Redim Preserve практически не использую - всегда можно сделать иначе.
Например так - берём исходные данные в массив, создаём аналогичный такого же размера, перекладываем нужные данные (пустой "хвост" отбросим при выгрузке). Или при анализе собираем коллекцию номеров нужных строк, затем по полученной коллекции создаём массив, перекладываем (это если например нужно один огромный массив разложить по сотне маленьких массивов). С другой стороны, можно номера строк собирать в словарь, и затем просто из исходного массива выбирать данные из этих строк, не создавая другие массивы. А эту задачу я бы делал так (с учётом что данных много, копируемых мало, и чтоб не сложный код): 1. Старые в массив, его перебираем, заполняем словарь наименование & "|" & цена 2. Новые в массив, его перебираем, ищем в словаре наименование & "|" & цена 3. Если нет в словаре - добавляем новое в словарь, копируем строку (номер известен, куда можно сразу определить, затем двигать индекс, ну или каждый раз копировать вниз) Если же копируемых строк тысячи - тогда как выше: коллекция номеров, затем массив и переложить, затем выгрузить вниз. Формулы протянуть после выгрузки - адреса от/до ведь будут известны.
webmoney: E265281470651 Z422237915069 R418926282008
|
![]() |
![]() |
![]() |
#8 | |
Старожил
Регистрация: 31.12.2010
Сообщений: 2,133
|
![]()
F1 - ReDim Statement
Цитата:
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
|
|
![]() |
![]() |
![]() |
#9 | |
Старожил
Регистрация: 31.12.2010
Сообщений: 2,133
|
![]()
Однако, неточность в Справке есть:
Цитата:
![]() Код:
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
|
|
![]() |
![]() |
![]() |
#10 | |
Старожил
Регистрация: 15.05.2008
Сообщений: 2,058
|
![]() Цитата:
Остановлюсь, наверное, на том что есть, т.е. Range.Find
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499 |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Дан двумерный массив. начиная с 1 строки сдвинуть все строки на 2 вниз, а последние 2 переместить на место первых двух строк. | Proskurina | Помощь студентам | 5 | 03.03.2013 21:38 |
Как добавлять новые элементы (ключ=>значение) в ассоциативный массив программно. | SkAndrew | PHP | 38 | 09.04.2012 20:18 |
Из строки в массив | San4o | Помощь студентам | 13 | 11.09.2009 14:30 |
строки массив | Артэс | Общие вопросы C/C++ | 1 | 06.09.2009 20:31 |
Как сделать чтобы новые строки всегда были в области видимости? | neugadal | Microsoft Office Excel | 9 | 06.09.2008 12:23 |