2016-08-16 5 views
0

У меня есть код, который выглядит следующим образом:Доступ к VBA: Почему я получаю дублируемую декларацию объявления, если я уверен, чтобы установить объект в Nothing перед повторным использованием?

If BLAH=BLAH 

     Dim dbs As DAO.Database 
     Dim rst As DAO.Recordset 
     Dim qdf As DAO.QueryDef 

...rest of code... 

     'Close stuff 
     rst.Close 
     dbs.Close 
     Set dbs = Nothing 
     Set rst = Nothing 
     Set qdf = Nothing 

END IF 

If FOO=FOO 

     Dim dbs As DAO.Database 
     Dim rst As DAO.Recordset 
     Dim qdf As DAO.QueryDef 

...rest of code... 

     'Close stuff 
     rst.Close 
     dbs.Close 
     Set dbs = Nothing 
     Set rst = Nothing 
     Set qdf = Nothing 

END IF 

Но в разделе FOO=FOO, он подсвечивается dbs As DAO.Database и дал сообщение об ошибке всплывающее, что говорит

Compile error: duplicate declaration in current scope.

Что я делаю неправильно? Я думал, это будет нормально, потому что я отрицаю каждый объект перед повторным использованием. Основная задача состоит в том, чтобы запустить тонну IF операторов в событии Timer формы. Должен ли я просто объявить некоторые объекты только один раз в верхней части процедуры события, чтобы обойти эту ошибку?

+0

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

+0

Да, я возился с ним во время ожидания и просто комментировал другой «Дим», заставив ошибку уйти. Мне сейчас любопытно, почему использование кода в разделе «Закрыть материал» не отменяет инициализацию этих объектов. – whatwhatwhat

+2

Использование 'Dim' просто сообщает компилятору« Я буду использовать переменную с именем «X» типа «Y» - она ​​не зависит от фактического заполнения или очистки этой переменной (кроме случаев, когда вы используете «Dim X As New Y» ') Установка переменной в Nothing не удаляет сама переменная, она остается, но больше не указывает на какой-либо объект. –

ответ

3

Чтобы устранить эту проблему в случае VBA, объявления переменных являются глобальными для данной подпрограммы/функции или даже для данного модуля.

Для большинства здесь вопрос с плакатами кажется странным, но имейте в виду, что в vb.net значения переменных являются ЛОКАЛЬНЫМИ для блока if if then then code.

Это в VBA, это не помогает, но в vb.net, это perfectally правовая:

If True Then 
     Dim a As Long 
     a = 5 
    End If 

    If True Then 
     Dim a As Long 
     a = 6 
    End If 

И если вы хотите, переменная возможность использовать в обоих, если/то блоки, то вы будете использовать это:

Dim a As Long 
    If True Then 
     a = 5 
    End If 

    If True Then 
     a = 6 
    End If 

Так что в VBA переменная область локальна для функции/подпрограммы. В vb.net область действия локальна для блока if/then. Это означает, что на некоторых языках программирования вы можете объявлять переменную несколько раз в функции/подпрограмме и не получать никаких ошибок компиляции - даже если действует явная опция. Следует также отметить, что в приведенных выше примерах кода vb.net, когда код выпадает из блока if/then, данная переменная в первом примере кода выходит за пределы области видимости. Поэтому в VBA объявления переменных не являются локальными для блока if/then. Я также должен указать, что я использовал слово «локальная» область, поскольку код if/then скомпилирован, а if/then оператора «dim» НЕ происходит во время выполнения, но во время компиляции. Другими словами, «истина» или «ложь» не означает «тусклый» и объявление переменной не происходит, а только то, что переменная «локальна» для блока if/then. Оператор dim не работает условно и создается во время компиляции.