Защо е необходимо цикълът arr_weekда се предименсира в процедурата Fill_ArrayWeekняколко пъти, вместо да се направи само веднъж предицикъла в процедурата Fill_Table, веднага следпреброяването на листовете в променливата sht_nu.
Здравейте, Румен. Процедурата Fill_Table попълва колони Процент и Комисионна за всеки лист от файла "Седмична справка" и изчислява сумите за тези колони. След това с процедурата Fill_ArrayWeek се попълват елементите на двумерния масив arr_week, които съхраняват изчислените суми за всеки лист. За да се запазят попълнените вече суми (елементи на масива), използвам Redim Preserve. Накрая елементите на масива arr_week попълват обобщаващата таблица на лист Седмица. "Предименсирането" в процедурата Fill_ArrayWeek има за цел да запази записаните в масива стойности и да добави следващите.
Разбира се, това е едно решение, но винаги могат да се намерят и други решения!
Имах предвид, че размерът на масива става ясен и не се променя след като се определи броят на листовете във файла и по време на изпълнението не се променя. Процедурата Redim се извиква неколкократно с едни и същи параметри.
Така е, размерът на динамичния масив не се променя след като се определи броя на листовете. Но следващата задача е да се попълни масива със сумите от всеки лист. За да се запазят въведените стойности (елементи на масива), използвам Redim Preserve и се добавя новия елемент. Вижте урок 11 от модул 4 и ще стане по-ясно.
Румене, благодаря за подробното описание.
Попълвам елементите на масива в процедурата Fill_ArrayWeek като използвам ReDim Preserve, а Вашето решение попълва елементите във Fill_Table. На практика няма разлика във времето на изпълнение.
Всяка една задача на VBA има повече от едно решение, а Вие сте отделили време и сте намерили различно и много добро решение, поздравления!
Здравейте, досега в уроците масив се попълва с посочването на колоните:
'попълва масива For i = 0 To 4
Arr1(i, 0) = wks.Range("A" & i + 2) Arr1(i, 1) = wks.Range("B" & i + 2) Arr1(i, 2) = wks.Range("C" & i + 2) Arr1(i, 3) = wks.Range("D" & i + 2) Arr1(i, 4) = wks.Range("E" & i + 2) Arr1(i, 5) = wks.Range("F" & i + 2) Next i
Има ли начин това да стане без да се упоменават колоните?
Опитах нещо такова:
Но, очевидно масива не се попълва, защото функцията Sum връща стойност 0. Благодаря предварително!
Супер е, че сама сте намерила решението!