Страницы: 1 2 След.
RSS
Как изменить число строк двумерного массива?
 
Мне необходимо добавлять по мере нахождения нужных элементов списка соответствующие новые строки в двумерный массив.  
Думал использовать для этого ReDim Preserve , но оказывается, что изменять при ReDim Preserve можно только последнее измерение, т.е число столбцов...  
А мне нужно - строк... Переписывать процедуру вычисления значений не хочется, т.к. потеряется мнемоническое соответствие расположения ячеек строки в таблице, где ищется значение с элементами строки в массиве...  
Что-то я туплю, не соображу как это сделать попроще...  
Подскажите, пожалуйста, как увеличить или уменьшить число СТРОК двумерного массива?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Может, с помощью WorksheetFunction.Transpose транспонировать, потом Redim и обратно транспонировать?
 
WorksheetFunction.Transpose использовать крайне нежелательно, т.к. это прообраз возможной будущей БД в Access (если со временем сильно разбухнет и потребуется много пользователей с разными правами)...  
Можно, конечно, сделать транспонирование через временный массив, добавление или удаление в нём столбца и обратное транспонирование. Но как-то это всё коряво...  
Вместо одного Redim Preserv , необходимого для изменения числа столбцов, использовать для той же операции, но со строками процедуру с двухкратным прохождением циклом по элементам массива (сначала транспонировать "туда", а потом - "обратно")... Ну, совсем не красиво.  
Дмитрий,  
по поводу двух динамических массивов что-то я не понял...  
А уж что существует такая штука как Dictionary я услышал только здесь совсем недавно и в скользь... А "как его готовят" и "с чем его едят" даже посмотреть не знаю где...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Есть пример от слэна, отсюда. Там коллекция vs словарь соревнцются по отбору уникальных.
 
Кстати, Алекс, ты там тоже был :)  
http://www.planetaexcel.ru/forum.php?thread_id=16844&page_forum=2&allnum_forum=44
 
Игорь, быть-то я там был, но про Dictionary ничего не понял, т.к. никто ничего не объяснил также подробно как было в своё время объяснено про коллекции и даже не дал никуда ссылки
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Вообще-то я их тоже использую чисто интуитивно, по примерам и по справке. Тоже было бы интересно узнать тонкости применения.
 
Мне наверное надо извиниться перед ZVI - выложенный выше файл его производства, просто слэн его выкладывал, а я так на него и записал...
 
Про Dictionary много информации, достаточно набрать в поисковике: Scripting Dictionary  
 
Вот, например, ссылка по свойствам и методам:  
http://www.script-coding.info/WSH/Dictionary.html  
 
Примеров применения здесь на форуме хватает.
 
Спасибо за ссылку. Хорошо, что по-русски.  
Но там - свойства и методы объекта.  
А просто краткого описания что это такое за объект и чем он отличается от коллекции - нет.  
Пока для меня это звучит примерно как:  
"Объект Тримпампулька имеет уникальное имя, которое можно узнать или установить, обратившись к нему: Тримпампулька.Name ...  
Также имеется свойство "количество Загогулинок", которое можно узнать, ...  
К каждой Загогулинке можно обратиться как по её имени, так и по индексу...  
Методы объекта Тримпампулька:  
заколбасить  
утрампампусить  
...  
"  
Если вместо "Тримпампулька" "Загогулинка" вставить в текст названия объектов, которые себе представляешь в общих чертах, то информация о свойствах и методах становится весьма ценной.  
Если же нет, то - набор слов.  
Попробуйте вместо "Тримпампулька" вставить слово "автомобиль", вместо "Загогулинка" - кресло, вместо "заколбасить"-повернуть, "утрампампусить"-затормозить. И всё становится ясно.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=31.08.2010 05:09}{thema=}{post}Спасибо за ссылку. Хорошо, что по-русски.  
Но там - свойства и методы объекта.  
А просто краткого описания что это такое за объект и чем он отличается от коллекции - нет.  
Пока для меня это звучит примерно как:  
"Объект Тримпампулька имеет уникальное имя, которое можно узнать или установить, обратившись к нему: Тримпампулька.Name ...  
Также имеется свойство "количество Загогулинок", которое можно узнать, ...  
К каждой Загогулинке можно обратиться как по её имени, так и по индексу...  
Методы объекта Тримпампулька:  
заколбасить  
утрампампусить  
...  
"  
Если вместо "Тримпампулька" "Загогулинка" вставить в текст названия объектов, которые себе представляешь в общих чертах, то информация о свойствах и методах становится весьма ценной.  
Если же нет, то - набор слов.  
Попробуйте вместо "Тримпампулька" вставить слово "автомобиль", вместо "Загогулинка" - кресло, вместо "заколбасить"-повернуть, "утрампампусить"-затормозить. И всё становится ясно.{/post}{/quote}  
Алексей, cсылка была дана вместо VBA-справки, так как встроенной справки по Dictionary нет. Кто же знал, что справка по VBA, написанная аналогично, для Вас - "тримпампульки" и "загогулинки" :)  
Ссылка была "например", по маске Scripting Dictionary можно найти информации побольше, что будет непонятно - спрашивайте. Здесь же не форум психоаналитиков по теме вытягивания ассоциативных рядов из сознания :)
 
Нет сомнений, что справочная информация по Collection и Dictionary понятна.  
Опасение использовать эти объектов, чаще всего возникает из-за отсутствия опыта, а опыт нужно просто приобретать. На форуме приводились примеры эффективного использования и коллекций (Collection), и словарей (Dictionary). Полезно анализировать  код таких примеров.  
 
Для меня, несмотря на некоторую похожесть свойств и метолов, Collection  и Dictionary  – это совершенно разные объекты, хотя они часто и используются для схожих целей. По-крайней мере, таком подход исключает большую часть путаницы, когда по аналогии ждешь одного, а получается совершенно иное. Пока опыта недостаточно, лучше не ассоциировать Collection  и Dictionary  друг с другом.    
В коллекции можно добавлять элементы и без ключа. Добавлять можно как перед, так и после заданного элемента, чего нет в Dictionary. Пример использования этого для сортировки я приводил в NoDups. Но словари позволяют эффективнее работать по ключу (Key), выводить сразу весь массив значений или ключей, работают быстрее коллекций. Есть и другие отличия.  
 
Впрочем, для кого-то, например, для Charles Pearson, эти объекты скорее схожие, чем разные, почитайте, например (есть он-лайн переводчики, кому нужно) первый абзац его статьи Collection And Dictionary Procedures:  
http://www.cpearson.com/excel/CollectionsAndDictionaries.htm  
 
Вот здесь я пытался "на пальцах" объяснить использование коллекций и давал ссылки на примеры использования  Collection и Dictionary:  
http://www.planetaexcel.ru/forum.php?thread_id=12736  
Даже если кто-то там просто “был, мёд, пиво пил” – уже хорошо :-)  
 
Приложил еще один эффективный пример совместного использования Dictionary и Collections для рекурсивного развертывания таблицы Parent –Child в таблицу вложенности уровней (Tree). Пример не простой для понимания, можно не вникать, так как в данном случае я лишь хочу продемонстрировать эффективность кода.  
 
В любом случае, приведенная здесь информация не заменит опыта – его придется набирать самостоятельно. Но приобретенные умения работы с Collection  и Dictionary  дадут больше эффекта, чем можно и предполагать.  
 
P.S. 1 сентября, кто учится - с празником! :-)
 
спасибо, ZVI!  :)  
 
И Вас с праздником!
Живи и дай жить..
 
{quote}{login=слэн}{date=01.09.2010 08:38}{thema=}{post}спасибо, ZVI!  :)  
И Вас с праздником!{/post}{/quote} Вот уж не думал, что Вы со ZVI учащиеся. Я имею в виду не жизненное кредо, а общественный статус:-)И присоединяюсь к поздравлению.
Я сам - дурнее всякого примера! ...
 
Большое спасибо всем вам за ответы.  
Отдельное спасибо ZVI и :) за разъяснения и "посыл" меня на нужные ссылки.  
К сожалению, хоть Dictionary - новый для меня объект с неясными пока свойствами и методами, но работа не ждёт. И даже 1-го сентября учиться некогда...  
Я пока все данные мне здесь ссылки сохраню у себя в броузере в отдельной папке, а потом на досуге (когда он будет) буду учиться и разобраться с объектом Dictionary.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
А пока не разобрался с Dictionary слепил для себя на скорую руку пару функций для работы с 2D-массивами:  
Function TrArr(Arr)   'возвращает транспонированный массив Arr()  
  Dim L1&, U1&: L1 = LBound(Arr, 1): U1 = UBound(Arr, 1)  
  Dim L2&, U2&: L2 = LBound(Arr, 2): U2 = UBound(Arr, 2)  
  Dim tArr(): ReDim tArr(L2 To U2, L1 To U1)  
  Dim RR&, CC&  
  For RR = L1 To U1  
     For CC = L2 To U2  
        tArr(CC, RR) = Arr(RR, CC)  
     Next CC  
  Next RR  
  TrArr = tArr  
End Function  
 
Function ReDim2D(Arr, Optional dRow% = 1)   'возвращает 2D-массив с измененным на dRow числом СТРОК  
  Dim L1&, U1&: L1 = LBound(Arr, 1): U1 = UBound(Arr, 1)  
  Dim L2&, U2&: L2 = LBound(Arr, 2): U2 = UBound(Arr, 2)  
  Dim tArr(): ReDim tArr(L1 To U1 + dRow, L2 To U2)  
  Dim RR&, CC&  
  For RR = L1 To U1  
     For CC = L2 To U2  
        On Error Resume Next  
        tArr(RR, CC) = Arr(RR, CC)  
        On Error GoTo 0  
     Next CC  
  Next RR  
  ReDim2D = tArr  
End Function  
Проверил. Всё работает. Так что ЭТУ тему можно и закрыть.  
Ещё раз спасибо всем.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
а чем    
 
tArr=application.transpose(Arr) не нравится?
Живи и дай жить..
 
Мне это самое очевидное решение уже предлагал вчера Казанский и я ответил:  
"WorksheetFunction.Transpose использовать крайне нежелательно, т.к. это прообраз возможной будущей БД в Access (если со временем сильно разбухнет и потребуется много пользователей с разными правами)..."
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
А еще (на всякий случай) Transpose не переносит строки длиннее 255 символов.
KL
 
{quote}{login=KL}{date=01.09.2010 01:57}{thema=}{post}А еще (на всякий случай) Transpose не переносит строки длиннее 255 символов.{/post}{/quote}  
И ещё (на всякий случай) Transpose обрезает диапазон 65536 элементами.  
Проверьте в Excel 2007:  
 
Sub Test()  
   
 Dim Rng As Range, a  
   
 Set Rng = Range("A:B")  
 a = Rng  
 Debug.Print UBound(a, 1), UBound(a, 2)  
   
 a = Application.WorksheetFunction.Transpose(Rng)  
 Debug.Print UBound(a, 1), UBound(a, 2)  
   
End Sub  
 
Выдает:  
1048576       2    
2             65536    
 
А должно быть:  
1048576       2    
2             1048576  
 
Об этом, насколько я знаю, нигде не написано, то есть это баг.  
У кого Excel 2010 - проверьте, пожалуйста, присутствует ли такая же проблемаи и в нем.
 
И ещё ( хотя уже дело прошлое, но всёж) Transpose на 2000 офисе даёт сбой на массивах уже строк на 200 на некотором количестве столбцов (точно не помню, но больше 10-ти). По крайней мере в двух разных кодах недавно столкнулся с тем, что именно эта строка на 2000 давала сбой, а на 2003 отрабатывала.  
Причем при уменьшении диапазона до 100 строк работал код и на 2000 офисе.
 
{quote}{login=ZVI}{date=01.09.2010 02:27}{thema=}{post}{quote}{login=KL}{date=01.09.2010 01:57}{thema=}{post}А еще (на всякий случай) Transpose не переносит строки длиннее 255 символов.{/post}{/quote}  
И ещё (на всякий случай) Transpose обрезает диапазон 65536 элементами.  
......  
Об этом, насколько я знаю, нигде не написано, то есть это баг.  
У кого Excel 2010 - проверьте, пожалуйста, присутствует ли такая же проблемаи и в нем.{/post}{/quote}помнится у меня просто выдавал ошибку out of range (или что то типа этой), если массив был больше 65536. Не помню в какой версии, но скорее всего в 2010 (он у меня по умолчанию)
 
Выше был я.  
А ошибка такая (2010)
 
{quote}{login=ZVI}{date=01.09.2010 02:27}{thema=}{post}{quote}{login=KL}{date=01.09.2010 01:57}{thema=}{post}А еще (на всякий случай) Transpose не переносит строки длиннее 255 символов.{/post}{/quote}  
И ещё (на всякий случай) Transpose обрезает диапазон 65536 элементами.  
Проверьте в Excel 2007:  
 
Sub Test()  
   
 Dim Rng As Range, a  
   
 Set Rng = Range("A:B")  
 a = Rng  
 Debug.Print UBound(a, 1), UBound(a, 2)  
   
 a = Application.WorksheetFunction.Transpose(Rng)  
 Debug.Print UBound(a, 1), UBound(a, 2)  
   
End Sub  
 
Выдает:  
1048576       2    
2             65536    
 
А должно быть:  
1048576       2    
2             1048576  
 
Об этом, насколько я знаю, нигде не написано, то есть это баг.  
У кого Excel 2010 - проверьте, пожалуйста, присутствует ли такая же проблемаи и в нем.{/post}{/quote}  
Repro на XL 2010
KL
 
{quote}{login=KL}{date=01.09.2010 03:48}{thema=Re: }{post}  
Repro на XL 2010{/post}{/quote}  
Спасибо, Кирилл. Значит осталось, и что интересно - нет сообющения об ошибке.
 
Знатоки!  
Слепить-то функции, меняющие размерности массивов я смог...  
А вот как массив приравнять массиву? Ни простым равенством, ни через Set не получается...  
Ну не перебирать же по одному элементы... Ведь каждый из них будет рассчитываться по формуле...  
В голову приходят только варианты:  
1. Использовать глобальную переменную модуля - рабочий массив и сделать не формулу, а макрос, его заполняющий.  
2. Создать временный диапазон на временном листе, скинуть в него массив, возвращаемый формулой, в рабочий массив скинуть всё из временного диапазона, а потом убить временный лист...  
Но как-то это всё "не комильфо"...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Такой вариант приравнивания массивов работает, только что проверил:  
 
needArr = Range(ash.Cells(needrow, 1), ash.Cells(iLastRow, maxcol))  
testarr = needArr
 
Игорь, такой вариант у меня тоже проходит...  
А вот при попытке переопределить размерность Arr:  
Sub testArr()  
  Dim Arr(1 To 4, 1 To 2), i&  
  For i = LBound(Arr, 1) To UBound(Arr, 1)  
     Arr(i, 1) = i: Arr(i, 2) = 10 * i  
  Next  
  Dim tArr(): tArr = Arr   'временный массив  
  ReDim Arr(0)  
  Arr = ReDim2D(tArr)  
End Sub  
 
говорит, что размерность массива уже определена  
Что-то я туплю... Как стереть уже определённый массив?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
P.S. Функция ReDim2D(tArr) - в моём посте от 01.09.2010, 13:21
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
зачем? его стирать?  
 
последней строкой он и так переопределится..
Живи и дай жить..
Страницы: 1 2 След.
Читают тему
Наверх