Во-первых, чтобы ответить на вопрос, который вы специально не задавали: создайте собственный класс и загрузите в него данные.Серьезно, вы поблагодарите меня позже.
Хорошо, на ваш вопрос.Я начинаю с максимально возможного ограничения области.Это означает, что я передаю переменные между процедурами.Когда все ваши переменные имеют максимально возможную ограничительную область действия, вы сталкиваетесь с наименьшим количеством проблем в дальнейшем.
Как только переменная проходит два уровня в глубину (вызов процедуры 1-го уровня, 1-го уровня до 2-го уровня), тогда яначать критический взгляд на мою структуру.Обычно (но не всегда), если все три процедуры находятся в одном модуле, я создаю переменную уровня модуля (используйте ключевое слово Private вместо Dim).Если вы разделяете свои модули правильно (не произвольно), вы можете иметь переменные уровня модуля без особого риска.
Есть некоторые переменные, которые всегда глобальны с самого начала: переменная, которая содержит имя приложения и версию приложения;модуль класса верхнего уровня, который никогда не должен терять область действия, пока приложение работает;константы (я знаю, что они не переменные), которые содержат такие вещи, как имена командных панелей.Я знаю, что хочу эти глобальные, чтобы они начинались именно так.
Я собираюсь выйти на конечность и сказать, что переменные уровня модуля никогда не переносятся в глобальные переменные.Глобальные переменные начинаются таким образом из-за их природы.Если использование переменной уровня модуля кажется громоздким, это, вероятно, связано с тем, что я разделил модуль без веской причины или мне нужно переосмыслить всю структуру.
Это не значит, что я никогда не обманывал и не использовалглобальный, когда я не должен был.Мы все сделали это, и вы не должны терять сон, если вы тоже это делаете.
Итак, чтобы правильно занести в посты этот пост: я перестаю использовать массивы, если меня не заставят.Я использую пользовательские классы, потому что
ActiveCell.Value = Invoice.LocalSalesTaxAmount
намного приятнее для отладки, чем
ActiveCell.Value = aInvoice(35,2)
На тот случай, если вы считаете, что вам нужно больше навыков для работы с пользовательскими классами - я тоже.укусила пулю, как и любой другой.