打印变量的名称

Ale*_*lex 8 excel vba excel-vba

我可能在谷歌上搜索不好,因为我找不到下面问题的答案:

Sub TEST()
Dim sthstring as string
sthstring = "Hello World"
end sub
Run Code Online (Sandbox Code Playgroud)

虽然我们都知道使用msgbox打印"Hello world"很容易,但是可以打印出变量的名称(在本例中为"sthstring")以及如何?

编辑:请不要提供如下答案:

Dim someotherstring as string  
someotherstring = "sthstring"
Run Code Online (Sandbox Code Playgroud)

因为我想找到一种方法来打印变量的"名称",谢谢

小智 5

阅读评论后,我认为您可能会发现此答案有用。

VBA不像@Monty Wild所提到的那样支持反射,但是添加引用以Microsoft Visual Basic for Applications Extensibility 5.3授予您对VBE对象的访问权限。然后,您可以在VBA项目中迭代对象模块,并以String格式检索模块的整个代码。

请考虑以下内容(将其粘贴在新的工作簿中Module1

Sub Main()

    Dim code As String
    code = GetCodeModule("Module1")

    Debug.Print code

End Sub

Private Function GetCodeModule(ByVal codeModuleName As String) As String
    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.VBComponent
    Dim CodeMod As VBIDE.CodeModule

    Set VBProj = ThisWorkbook.VBProject
    Set VBComp = VBProj.VBComponents(codeModuleName)
    Set CodeMod = VBComp.CodeModule

    GetCodeModule = CodeMod.Lines(1, CodeMod.CountOfLines)
End Function
Run Code Online (Sandbox Code Playgroud)

code现在,您的变量将存储您所使用的确切代码,Module1您可以通过打开即时窗口ctrl+ 来进行检查g

您可能想要编写/使用某种Find函数来反汇编String组件以检索变量名称和值,但我不建议您这样做,因为这样做可能会非常棘手。


bre*_*tdj 5

您可以更进一步,只需访问代码.

Pearson的优秀代码更新为

  • 显示设置对Microsoft Visual Basic for Applications Extensibility 5.3的引用不是访问VBIDE的先决条件
  • 实际上Dim XX As String在任何代码模块中解析并报告它

样本输出

Dim sthstring As String(Module1 at:Line:2)
Dim strSub As String(Module2 at:Line:2)
Dim FindWhat As String(Module2 at:Line:11)
Dim ProcName As String(Module3 at:Line:9)

 Sub GetVariable()
 Dim strSub As String
 strSub = "As String"
 Call SearchCodeModule(strSub)
 End Sub
Run Code Online (Sandbox Code Playgroud)
 Function SearchCodeModule(ByVal strSub)
        Dim VBProj As Object
        Dim VBComp As Object
        Dim CodeMod As Object
        Dim FindWhat As String
        Dim SL As Long ' start line
        Dim EL As Long ' end line
        Dim SC As Long ' start column
        Dim EC As Long ' end column
        Dim Found As Boolean
Run Code Online (Sandbox Code Playgroud)
        Set VBProj = ActiveWorkbook.VBProject
        For Each VBComp In VBProj.VBComponents
        Set CodeMod = VBComp.CodeModule

        With CodeMod
            SL = 1
            EL = .CountOfLines
            SC = 1
            EC = 255
            Found = .Find(target:=strSub, StartLine:=SL, StartColumn:=SC, _
                EndLine:=EL, EndColumn:=EC, _
                wholeword:=False, MatchCase:=False, patternsearch:=False)
            Do Until Found = False
                If Left$(Trim(.Lines(SL, 1)), 3) = "Dim" Then Debug.Print Trim(.Lines(SL, 1) & " (" & CStr(VBComp.Name) & " at: Line: " & CStr(SL)) & ")"
                EL = .CountOfLines
                SC = EC + 1
                EC = 255
                Found = .Find(target:=strSub, StartLine:=SL, StartColumn:=SC, _
                    EndLine:=EL, EndColumn:=EC, _
                    wholeword:=True, MatchCase:=False, patternsearch:=False)
            Loop
        End With
        Next VBComp
    End Function
Run Code Online (Sandbox Code Playgroud)