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组件以检索变量名称和值,但我不建议您这样做,因为这样做可能会非常棘手。
您可以更进一步,只需访问代码.
将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
Run Code Online (Sandbox Code Playgroud)
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
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)