2012-02-22 93 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 

條件塊的用途是在兩種不同的情況下執行兩段不同的代碼。如果您以任一方式聲明相同的變量,則根本不需要條件塊。很有可能,它應該在條件式之前移動。