如何以编程方式确定VBA中Option Base的当前设置

时间:2015-04-01 12:25:21

标签: excel vba excel-vba

如何以编程方式确定VBA中Option Base的当前设置? Option Base可以设置为01,这可以确定数组索引是从0还是1开始(请参阅MSDN)。

但是,我无法找到任何简单的方法来了解当前的设置。我希望可能有一个Option()函数,我可以传递参数,如:

Debug.Print Option("Base")

它会告诉我,但它似乎并不存在。

3 个答案:

答案 0 :(得分:8)

虽然我同意@jonsharpe,如果您使用的是Lbound(arr)Ubound(arr),那么您不需要在运行时知道这一点,但我认为这是一个有趣的问题。

首先,正确循环数组的示例。

For i = LBound(arr) To Ubound(arr)
    ' do something
Next

现在,为了完全 您要求的内容,您需要访问使用VBIDE库。否则称为“Microsoft Visual Basic for Applications Extensibility”库。它提供对IDE及其代码的访问。您可以使用它来发现是否已声明Option Base 1。我不建议尝试在运行时执行此操作。这在开发过程中作为一种静态代码分析会更有用。

首先,您需要add a reference to the librarygrant the code access to itself。完成后,以下代码应该按照您的意愿执行。

Public Sub FindOptionBase1Declarations()

    Dim startLine As Long
    startLine = 1

    Dim startCol As Long
    startCol = 1

    Dim endLine As Long
    endLine = 1 ' 1 represents the last line of the module

    Dim endCol As Long
    endCol = 1 ' like endLine, 1 designates the last Col

    Dim module As CodeModule
    Dim component As VBComponent
    For Each component In Application.VBE.ActiveVBProject.VBComponents ' substitute with any VBProject you like
        Set module = component.CodeModule

        If module.Find("Option Base 1", startLine, startCol, endLine, endCol, WholeWord:=True, MatchCase:=True, PatternSearch:=False) Then

            Debug.Print "Option Base 1 turned on in module " & component.Name

            ' variables are passed by ref, so they tell us the exact location of the statement
            Debug.Print "StartLine: " & startLine
            Debug.Print "EndLine: " & endLine
            Debug.Print "StartCol: " & startCol
            Debug.Print "EndCol: " & endCol

            ' this also means we have to reset them before we look in the next module
            startLine = 1
            startCol = 1
            endLine = 1
            endCol = 1
        End If

    Next 

End Sub

有关详细信息,请参阅CodeModule.Find documentation


如果使用加载项是一个选项,@ Mat'sMug和我的开源项目Rubberduck都有一个Code Inspection,它将在整个活动项目中显示所有这些实例。

Option Base 1 Code Inspection

See this for more information on that particular inspection

答案 1 :(得分:3)

Function GetBaseOption() As Long

    Dim arr

    arr = Array("a")
    GetBaseOption = LBound(arr)

End Sub

答案 2 :(得分:1)

只需使用:

LBound(Array())

...返回当前的 Option Base 设置。


或者,作为功能:

Function optionBase() As Byte
  optionBase = LBound(Array())
End Function