VBA中能否通过存储变量名的字符串获取对应公共变量的实际值?
VBA根据变量名字符串读取对应公共变量值的实现方案
可以实现该需求,以下是两种常用的实现方法:
方案1:使用Application.Run(优先推荐,无需额外配置)
该方案仅要求公共变量定义在标准模块(非工作表/工作簿/类模块)中,无需修改信任设置或添加额外引用。
首先在标准模块中添加公共取值函数:
' 标准模块内的代码,例如模块命名为Module1 Public General As String ' 初始化变量的示例代码 Sub InitVar() General = 10 End Sub ' 公共调用函数,传入变量名返回对应值 Public Function GetVarByName(varName As String) As Variant GetVarByName = Application.Run(varName) End Function
需要写入单元格时调用即可:
Sub WriteValToCell() Dim CurrentValue As String CurrentValue = "General" ' 将变量值写入A1单元格 Range("A1").Value = GetVarByName(CurrentValue) End Sub
方案2:使用VBIDE对象库(适合多模块、复杂场景)
如果公共变量不在同一个标准模块中,可以调用VBA的开发接口实现,需要提前做两处配置:
- 开启VBA工程访问权限:文件 → 选项 → 信任中心 → 信任中心设置 → 宏设置 → 勾选「信任对VBA工程对象模型的访问」
- 添加引用:VBA编辑器菜单 → 工具 → 引用 → 勾选「Microsoft Visual Basic for Applications Extensibility 5.3」
实现代码示例:
Function GetVarValue(varName As String) As Variant Dim vbProj As VBIDE.VBProject Dim vbComp As VBIDE.VBComponent Dim codeMod As VBIDE.CodeModule Dim i As Long Set vbProj = ThisWorkbook.VBProject ' 遍历所有模块查找变量 For Each vbComp In vbProj.VBComponents Set codeMod = vbComp.CodeModule For i = 1 To codeMod.CountOfDeclarationLines If InStr(codeMod.Lines(i, 1), "Public " & varName) > 0 Then ' 找到匹配的公共变量后返回值 GetVarValue = Application.Run(vbComp.Name & "." & varName) Exit Function End If Next i Next vbComp End Function
注意事项
- 所有需要被读取的变量必须用
Public关键字声明,不可用Private修饰 - 如果变量仅在当前模块内使用,优先直接调用变量而非通过字符串反射读取,性能更高
内容的提问来源于stack exchange,提问作者Eduards
相关产品推荐
相关产品推荐

