打印变量的名称

时间:2014-06-11 21:42:39

标签: excel excel-vba vba

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

Sub TEST()
Dim sthstring as string
sthstring = "Hello World"
end sub

虽然我们都知道使用msgbox打印“Hello world”很容易,但是可以打印出变量的名称(在这种情况下,“sthstring”)以及如何?

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

Dim someotherstring as string  
someotherstring = "sthstring"

因为我打算找到一种打印变量'name'的方法,谢谢

4 个答案:

答案 0 :(得分: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
 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
        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

答案 1 :(得分:4)

阅读评论后,我认为你会发现这个答案很有用。

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

请考虑以下事项(将其粘贴在新工作簿' s 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

您的code变量现在存储Module1中的确切代码,您可以通过打开立即窗口 ctrl + g 来检查该代码

您可能希望编写/使用某种Find函数来反汇编String组件以检索变量名称和值,但我不建议这样做,因为它可以得到相当的棘手。

答案 2 :(得分:3)

这很难直接做,因为VBA没有反射,即不能直接引用自己。

然而;

因为在评论中提到您要编写引用自身的代码,所以可以通过在工具/引用对话框中引用Microsoft Visual Basic for Applications Extensibility 5.3来实现。这使您能够引用VBA代码,并从那里编写可以自行打印的代码。

答案 3 :(得分:1)

这可能是不可能的,因为变量名只是指向数据的指针。你可以有几个变量都指向同一个对象(尽管在VBA中我不相信字符串被视为对象,因此除了ByRef函数调用之外是不可能的)。