2012-06-15 4 views
2

Итак, я создал форму в Access, которая имеет поле со списком и текстовое поле. Форма вычисляет некоторые вещи после нажатия кнопки, но либо поле со списком, и текстовое поле должно быть заполнено, либо ни один из них не может быть заполнен. То, что я хотел бы сделать, заключается в условии, что, если заполняется только одна из них, появится окно сообщений, объясняющее, что нужно заполнить оба поля, а затем продолжить, чтобы остановить код. Я понимаю, как сделать часть окна сообщения, но сейчас он показывает окно сообщения, а затем продолжает код, который вызывает ошибку.Как остановить код VBA условно?

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

У меня есть пара идей о том, как это сделать, но у меня проблемы с их исполнением, и, честно говоря, я даже не уверен, что они будут работать. Мой первый план состоял в том, чтобы скопировать и вставить все части вычисления из процедуры, создать с ними новую процедуру, создать оператор if в процедуре нажатия кнопки и вызвать новую процедуру, если она передает оператор if. Мой второй план немного более утомительный, но я уверен, что он сработает. Это просто окружает весь код с помощью оператора if, если он передает исполняемый код, если это не так, ничего не делать и довести до конца процедуру и завершить ее. Моя единственная проблема со вторым - у меня есть много кода заранее, и я бы предпочел не тратить много времени на повторные отступы, если я могу помочь, но у меня есть это как резервная копия, если я не могу найти лучший способ.

+0

Перейти к первому варианту :) – Fionnuala

ответ

3

У вас есть несколько вариантов доступны для вас:

  1. Как вы предложили, взять код в настоящее время привязанного к событию нажатия кнопки и переместить его в новую процедуру к югу. В событии нажатия кнопки выполните вашу проверку, и если все пройдет, вызовите процедуру sub. Если нет, покажите свое сообщение.
  2. Предполагая, что у вас есть правильная обработка ошибок в событии нажатия кнопки, поднимите сообщение об ошибке, а не покажите сообщение. Это приведет к перемещению потока управления в обработчик ошибок в процедуре.
  3. После отображения окна сообщения используйте Exit Sub или Exit Function, чтобы остановить выполнение кода.

Вариант 1, вероятно, лучший подход, поскольку он способствует лучшей практике кодирования. Если у вас длинные подпрограммы, это может быть признаком того, что вам нужно разбить подпрограмму на более мелкие единицы работы, что значительно упрощает повторное использование кода и отладки.

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

Лично я склонен избегать использования функции выхода и выхода (вариант 3) в большинстве случаев, потому что мне нравится иметь одну точку в подпрограмме, где процедура выходит и передает управление обратно вызывающей процедуре. Наличие нескольких точек выхода в рамках подпрограммы является признаком того, что вам нужно реорганизовать свой код \ переосмыслить используемую вами логику. Иногда это не может помочь, но часто вы создаете ситуацию, которую сложнее отлаживать.

+0

Спасибо за ответ! Сейчас проблема решена с вашим решением номер 3, хотя я собираюсь рассмотреть возможность его изменения, чтобы сделать его более эффективным. – KryptKeeper

+0

@KryptKeeper Я считаю, что у Тима был номер 3, потому что он не самый лучший. По его словам, почти всегда лучше иметь одну точку выхода. – Fionnuala

1

Когда вы открываете окно сообщения, вы должны иметь возможность использовать Exit Sub или Exit Function в зависимости от вашей процедуры. Он должен остановить выполнение кода и выйти из процедуры.

+0

Я пробовал это, но основная проблема заключается в том, что, поскольку всплывающее окно сообщения появляется только условно (то есть в выражении if), если после этого я выложу процедуру выхода, ошибка, потому что я не закрывал оператор if. – KryptKeeper

+1

@KryptKeeper: используйте 'Exit Sub', а не' End Sub'. 'Exit Sub' работает как обычный оператор и не должен давать вам неприятностей w.r.t. открытое выражение 'If' (конечно, вы должны закрыть его с помощью' End If' после 'Exit Sub'). – Heinzi

+0

Спасибо за решение Aharpe, это сработало! И спасибо, Хайнци, за то, что я это расчистил! Я даже не понял, что есть отдельная команда выхода. – KryptKeeper

0

Я знаю, что уже поздно, но я просто хотел добавить, что если вы хотите остановить какой-либо код VBA, вы можете просто использовать End в своем обработчике ошибок. Таким образом, он не вернется к функции sub/function, которая вызвала (если она есть).

Надеюсь, это поможет.