Създаване на обобщаваща таблица с двумерен динамичен масив.

Безплатни 20 урока
регистрирай се и научи

Ако сте вече потребител - Регистриран съм
Видео

Тест за преминаване към следващия урок

 
Методът GetOpenFilename присвоява референцията на файла, който се отваря, на променлива.
Вярно
Не вярно
 
Динамичният многомерен масив променя многократно измерението си
Не вярно
Вярно

Въпроси и отговори

  • Защо се предименсира ar_week няколко пъти?

    Румен Драганов:

    Защо е необходимо цикълът 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 и ще стане по-ясно. 

    Румен Драганов:
    Разбира се, че кодът, който предлагате работи. 

    Масивът е дефиниран на модулно ниво и би трябвало да не се загуби, освен ако не се използва Redim без нужда.

    Бих предложил следния код  в процедурата Fill_Table(), вместо това да отпадне
    ReDim Preserve arr_week... в процедурата Fill_ArrayWeek.
    Димитринка Вълкова:

    Румене, благодаря за подробното описание.
    Попълвам елементите на масива в процедурата Fill_ArrayWeek като използвам ReDim Preserve, а Вашето решение попълва елементите във Fill_Table. На практика няма разлика във времето на изпълнение. 
    Всяка една задача на VBA има повече от едно решение, а Вие сте отделили време и сте намерили различно и много добро решение, поздравления!