Лучший вариант для потока управления в VBA?

Я обновляю макрос и мне нужна помощь с потоком управления. Я не программист по профессии, поэтому с потоком управления я раньше не сталкивался.

Текущая версия макроса работает следующим образом:

  1. Проверьте, присутствуют ли наборы данных A и B в 1-й книге. Если ни то, ни другое, выход.
  2. Извлеките набор данных A в массивы.
  3. Извлеките набор данных B в массивы.
  4. Создайте вторую книгу и отформатируйте ее, затем вставьте наборы данных A и B.
  5. Извлеките набор данных C (ежемесячная сумма A и B) в массив.
  6. Создайте третью книгу и отформатируйте ее, затем вставьте набор данных C.

Текущая версия работает только в том случае, если присутствуют оба A и B, но мне нужно, чтобы она работала, если присутствует только A или B. Сначала я подумал, что могу копировать/вставлять соответствующие разделы и просто переходить к ним, используя операторы GoTo, но, похоже, это плохая практика.

Как мне ориентироваться в коде, обрабатывающем 4 возможных сценария? (А+В, ни то, ни другое, только А, только В). Для контекста я вызываю отдельную подпрограмму для создания и форматирования 2-й и 3-й книг.

Я рассматривал эти варианты, но не уверен, что больше подходит:

  1. Операторы перехода
  2. Выберите оператор Case
  3. Имейте подпрограмму, чтобы проверить, какой сценарий применим, а затем вызовите отдельную подпрограмму для применимого сценария.

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

GoTo легко приводит к спагетти-коду, и, как вы заметили, его, как правило, следует избегать. Кроме того, похоже, что вы могли бы преобразовать это в несколько подпрограмм.
BigBen 13.04.2023 16:52

IF/ElseIF/Else — это один из вариантов. Лично (и это полностью личное дело), ​​если бы у меня было больше пары ElseIf, я бы переключился на Select/Case. Goto никогда не был бы вариантом, который я бы выбрал, за исключением маршрутизации захвата ошибок внутри подпрограммы.

JNevill 13.04.2023 16:58

Спасибо за быстрые ответы, я буду избегать GoTo, кроме ошибок.

David Vinnicombe 13.04.2023 17:09

Используйте 3 отдельных блока If и флаг (логический). Если набор данных A присутствует, извлеките его в массив, установите флаг = true. Если набор данных B присутствует, извлеките его в массив, установите флаг = true. Если flag = true, шаг 4-6.

CDP1802 13.04.2023 17:12

Goto — разумный выбор, если вам нужно выйти из двух или более вложенных циклов, когда (например) Exit For недостаточно.

Tim Williams 13.04.2023 17:27

ОТ: Доказано, что GoTo упрощает чтение кода и избавляет от путаницы, вместо того, чтобы иметь дополнительное «если» , которое для некоторых тоже не стоит . В конце концов, пока ваш код читаем, когда вы его объясняете, все должно быть в порядке. Единственное, о чем стоит беспокоиться при кодировании, — это утечки памяти, остальные мелочи — это просто стили кодирования. PS: Насчет того, когда использовать каждый, мое правило простое, слово это, IE: "в случае пожара: гидрант" "Если я поднимусь до 6 утра, то я"... и так далее. Что кажется более понятным по-человечески.

Sgdva 13.04.2023 17:46

Множественные мнения, изложенные в комментариях, демонстрируют, почему этот вопрос следует закрыть как основанный на мнениях. "Лучший" субъективен.

BigBen 13.04.2023 18:12
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
7
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если бы я был вами, я бы создал переменную «сценарий» и присвоил бы ей значение в зависимости от случая, в котором вы находитесь. Пример: если сценарий = 1, затем вызовите (например, ваша процедура для случая A + B)

Elseif Scenario = 2, затем Call (ваша процедура только для случая A и т. д.). Я настоятельно рекомендую избегать процедур GoTo, которые, на мой взгляд, не очень эффективны.

Другие вопросы по теме