Каковы плюсы и минусы пропущенных массивов по сравнению с глобальными массивами в Excel VBA - PullRequest
3 голосов
/ 03 февраля 2010

Хорошо, 2-я попытка написать вопрос о переполнении стека, так что простите, если это кажется знакомым.

Я переписываю макрос Excel, который был построен за 2,5 года, в стиле Франкенштейна (добавлен по частям). Одна из вещей, которые мне нужно сделать, это загрузить данные в массив один раз и только один раз для точности и скорости данных. Для моего уровня квалификации я собираюсь придерживаться методологии Array.

Мои два подхода:

  • Использовать глобальные затемненные динамические массивы
  • Уменьшите динамические массивы в моей основной процедуре и передайте их вызываемым процедурам

Итак, что же такое переполнение стека в отношении плюсов и минусов этих двух методов? Спасибо, Craig ...

Ответы [ 2 ]

9 голосов
/ 03 февраля 2010

Во-первых, чтобы ответить на вопрос, который вы специально не задавали: создайте собственный класс и загрузите в него данные.Серьезно, вы поблагодарите меня позже.

Хорошо, на ваш вопрос.Я начинаю с максимально возможного ограничения области.Это означает, что я передаю переменные между процедурами.Когда все ваши переменные имеют максимально возможную ограничительную область действия, вы сталкиваетесь с наименьшим количеством проблем в дальнейшем.

Как только переменная проходит два уровня в глубину (вызов процедуры 1-го уровня, 1-го уровня до 2-го уровня), тогда яначать критический взгляд на мою структуру.Обычно (но не всегда), если все три процедуры находятся в одном модуле, я создаю переменную уровня модуля (используйте ключевое слово Private вместо Dim).Если вы разделяете свои модули правильно (не произвольно), вы можете иметь переменные уровня модуля без особого риска.

Есть некоторые переменные, которые всегда глобальны с самого начала: переменная, которая содержит имя приложения и версию приложения;модуль класса верхнего уровня, который никогда не должен терять область действия, пока приложение работает;константы (я знаю, что они не переменные), которые содержат такие вещи, как имена командных панелей.Я знаю, что хочу эти глобальные, чтобы они начинались именно так.

Я собираюсь выйти на конечность и сказать, что переменные уровня модуля никогда не переносятся в глобальные переменные.Глобальные переменные начинаются таким образом из-за их природы.Если использование переменной уровня модуля кажется громоздким, это, вероятно, связано с тем, что я разделил модуль без веской причины или мне нужно переосмыслить всю структуру.

Это не значит, что я никогда не обманывал и не использовалглобальный, когда я не должен был.Мы все сделали это, и вы не должны терять сон, если вы тоже это делаете.

Итак, чтобы правильно занести в посты этот пост: я перестаю использовать массивы, если меня не заставят.Я использую пользовательские классы, потому что

ActiveCell.Value = Invoice.LocalSalesTaxAmount

намного приятнее для отладки, чем

ActiveCell.Value = aInvoice(35,2)

На тот случай, если вы считаете, что вам нужно больше навыков для работы с пользовательскими классами - я тоже.укусила пулю, как и любой другой.

2 голосов
/ 03 февраля 2010

Вы должны быть осторожны с глобальными переменными в Excel VBA, потому что, если ваше приложение обнаружит какую-либо ошибку и выполнит некоторый программный сброс (но приложение все еще работает), глобальные переменные будут удалены.

Мне пришлось отказаться от глобалов, так как я не пишу идеальные приложения.

...