2012-02-22 92 views
3

简单,如下:VBA在重复申报“如果...否则”

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

这会给一个错误“在当前范围内重复声明”。为什么?

+3

因为您在相同范围内复制了声明。 VBA中的if块不会创建局部范围。 – JohnFx 2012-02-22 04:38:23

+0

@ user614244如果答案解决了您的问题,您应该通过单击刻度标记来接受答案。 – Fionnuala 2012-02-22 09:56:15

回答

8

变量是子/函数(过程)的本地变量。在你的情况下,“当前范围”。 VB,VBA和VBScript在程序中没有代码块的概念。如果我没有记错,唯一的代码块是模块,类,表单(它们是类)和过程。

为方便起见,您可以在过程的任何位置声明变量。然而,“当前范围”是程序。

这是一个设计决定,使语言更容易使用B-创始人。在当前范围

指定的名称


重复申报已经被使用在这个级别的范围。例如,对于 示例,如果两个变量在 不同的过程中定义,则它们可以具有相同的名称,但如果它们在相同的 过程中定义,则它们的名称不能相同。

http://msdn.microsoft.com/en-us/library/gg251613.aspx

1

在VBA中插入具有相同名称的两个变量的声明不能在同一个程序作出。有关更多信息,请参阅此文章:Duplicate declaration in current scope

在你的情况下,“当前范围”是当前程序。 ifelse块共享相同的范围。

例如,下面将给出同样的错误,即使第二个声明是无法访问:

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

如前所述,对于具有相同范围的变量,您不能有多个Dim语句。除此之外,然而,你为什么想?以你的代码为例。

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

条件块的用途是在两种不同的情况下执行两段不同的代码。如果您以任一方式声明相同的变量,则根本不需要条件块。很有可能,它应该在条件式之前移动。