VBA:有没有办法获取/读取模块属性?
Posted
技术标签:
【中文标题】VBA:有没有办法获取/读取模块属性?【英文标题】:VBA: is there a way to get/read the module attributes? 【发布时间】:2020-05-01 03:30:50 【问题描述】:在 Visual Basic for Applications (VBA) 中,您可以使用 Attribute 关键字设置模块或变量的属性。比如
' Header
Attribute VB_Name = "ClassOrModuleName"
Attribute VB_GlobalNameSpace = False ' ignored
Attribute VB_Creatable = False ' ignored
Attribute VB_PredeclaredId = False ' a Value of True creates a default global instance
Attribute VB_Exposed = True ' Controls how the class can be instanced.
'Module Scoped Variables
Attribute variableName.VB_VarUserMemId = 0 ' Zero indicates that this is the default member of the class.
Attribute variableName.VB_VarDescription = "some string" ' Adds the text to the Object Browser information for this variable.
'Procedures
Attribute procName.VB_Description = "some string" ' Adds the text to the Object Browser information for the procedure.
Attribute procName.VB_UserMemId = someInteger
' 0: Makes the function the default member of the class.
' -4: Specifies that the function returns an Enumerator.
关于他们的更多信息:https://christopherjmcclellan.wordpress.com/2015/04/21/vb-attributes-what-are-they-and-why-should-we-use-them/
我在想,有没有办法在代码中获取/读取这些属性?例如像
Sub BarMacroName()
'
' BarMacroName Macro
' Bar Macro Description
'
Dim var
MsgBox VB_Description 'display this module's description
MsgBox VB_Name 'display this module's description
End Sub
不只是描述和名称,一般情况下,我们真的可以读取代码本身内部的属性吗?
编辑:我特别想看看您是否可以在 VBA 脚本本身中提取属性值。我正在研究恶意软件漏洞,我很好奇是否有人可以在 VBA 模块的描述中嵌入恶意代码。
【问题讨论】:
我会尝试直接从vbaProject.bin提取它 @omegastripes 我特别想看看您是否可以在脚本本身中提取属性值,而不是想提取它们,我编辑了原始问题以反映这一点 据我所知不是直接的。您必须导出模块并读取 bas 文件。 @hyk 所以如果你正在研究嵌入恶意 VBA 模块属性的能力,那么问题标题不应仅限于获取/读取操作。 【参考方案1】:总之,是的,有一种方法可以读取 VBA 代码中的注释。您可以使用 Rubberduck(MS Office Visual Basic 编辑器的免费插件)查看和修改属性。
Rubberduck 显示通过向您的代码添加注释(基本上是特殊格式的注释)来显示现有属性。通过添加注释并单击同步按钮来添加属性。通过删除注释注释并单击同步按钮来删除属性。
这是代码模块中的注释示例。
'@Exposed
'@Folder("Class Libraries.Main.Book Sheet Range Project")
'@ModuleDescription("Class with functions and methods for working with Excel Workbooks.")
'@PredeclaredID
Option Explicit
当注释和属性不同步时,Rubberduck 会警告用户,并允许您将其同步到正确的那个。
插件的作用远不止管理注释,而且绝对值得一试。如果不出意外,它胜过其他选择:导出模块、在记事本中修改属性并将它们重新导入项目。
Rubberduck VBA: Annotations
【讨论】:
我还会将此链接添加到RubberDuck Features 页面。快速浏览一下,您就会明白我为什么喜欢 RubberDuck。以上是关于VBA:有没有办法获取/读取模块属性?的主要内容,如果未能解决你的问题,请参考以下文章
使用 python 记录未保存的 Excel 数据或使用 vba 自动保存
TypeError:无法读取未定义的属性“获取”(修复冲突导入不起作用)