Дублированная декларация VBA в "if ... else" - PullRequest
3 голосов
/ 22 февраля 2012

Просто, как показано ниже:

If 1 = 2 Then
    Dim i As Integer  
Else
    Dim i As Integer
End If

Это выдаст ошибку как «дублированное объявление в текущей области». Почему?

Ответы [ 3 ]

8 голосов
/ 22 февраля 2012

Переменные являются локальными для подсистемы / функции (процедуры).В вашем случае «текущая сфера».VB, VBA и VBScript не имеют концепции блоков кода в процедуре.Если я правильно помню, единственными блоками кода являются модули, классы, формы (которые являются классами) и процедуры.

Вы можете объявить переменную в любом месте процедуры для удобства.Тем не менее, «текущая область» - это процедура.

Это было дизайнерское решение, чтобы упростить использование языка для B -eginners.


Дубликат объявления в текущей области действия

Указанное имя уже используется на этом уровне области действия.Например, две переменные могут иметь одно и то же имя, если они определены в разных процедурах, но не если они определены в одной и той же процедуре.

Вставлено из http://msdn.microsoft.com/en-us/library/gg251613.aspx

1 голос
/ 22 февраля 2012

В VBA объявления двух переменных с одинаковым именем не могут быть сделаны в одной и той же процедуре. См. Эту статью для получения дополнительной информации: Дубликат объявления в текущей области .

В вашем случае «текущая область» - это текущая процедура. Блоки if и else имеют общую область действия.

Например, следующее выдаст ту же ошибку, даже если второе объявление недоступно:

Sub ErrorSub()
    Dim i As Integer

    If False Then
        Dim i As Integer
    End If
End Sub

Но следующее совершенно правильно и будет работать нормально:

Sub MySub()
    Dim i As Integer
    i = 4
    MsgBox i
End Sub

Sub MyOtherSub()
    Dim i As Integer
    i = 3
    MsgBox i
End Sub

Sub CallSubs()
    MySub
    MyOtherSub
End Sub
0 голосов
/ 23 февраля 2012

Как уже упоминалось, вы не можете иметь более одного оператора Dim для переменной с одинаковой областью действия.Кроме этого, однако, почему вы хотите?Возьмем, к примеру, ваш код.

If 1 = 2 Then 
    Dim i As Integer   
Else 
    Dim i As Integer 
End If 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...