我可能在谷歌上搜索不好,因为我找不到下面问题的答案:
Sub TEST()
Dim sthstring as string
sthstring = "Hello World"
end sub
虽然我们都知道使用msgbox打印“Hello world”很容易,但是可以打印出变量的名称(在这种情况下,“sthstring”)以及如何?
编辑:请不要提供以下答案:Dim someotherstring as string
someotherstring = "sthstring"
因为我打算找到一种打印变量'name'的方法,谢谢
答案 0 :(得分:5)
您可以更进一步,只需访问代码。
将优秀代码从Pearson更新为
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函数调用之外是不可能的)。