VBA类模块:如何在类级事件中获取类实例的属性值?
解决VBA类模块事件中获取实例属性的问题
首先,你的思路完全没问题——在类模块内部用Me.属性名确实是引用当前实例属性的正确方式,问题出在代码里一个很容易忽略的变量名笔误上。
问题根源分析
看你的类模块代码:
- 你声明了私有变量
Private AcnS用来存储Aircraft属性的值 - 但在
Property Get和Property Let过程中,你错误地使用了未声明的变量Acn,而非你定义的AcnS
因为VBA默认允许隐式声明变量(除非加了Option Explicit),Acn会被当作一个全新的空变量,导致你的属性读写完全没有关联到正确的存储变量,自然在img1_Click事件里用Me.Aircraft拿不到预期的值。
修复后的完整代码
我给你的代码加上了强制变量声明的Option Explicit(能避免这类笔误),并修正了变量名:
Option Explicit ' 必须放在模块最顶部,强制声明所有变量 Public WithEvents img1 As MSForms.Image Private AcnS As String ' 明确变量类型,代码更规范 Dim rng1 As Range, rng2 As Range, rng3 As Range ' Property Definitions Public Property Get Aircraft() As String Aircraft = AcnS ' 修正为正确的私有变量名 End Property Public Property Let Aircraft(Value As String) AcnS = Value ' 修正为正确的私有变量名 End Property ' Events Procedures Private Sub img1_Click() ' Showing Progress Form With ThisWorkbook.Sheets("Performance") Set rng1 = .Range("ProgCrit") Set rng2 = .Range("Progress") Set rng3 = .Range("op_log") End With frmprogress.LAc = Me.Aircraft ' 现在可以正确获取属性值了 rng1.Cells(2, 1) = Me.Aircraft rng3.AdvancedFilter xlFilterCopy, rng1, rng2 oprecord.Calculate frmprogress.Show End Sub
额外优化建议
- 坚持用
Option Explicit:它会帮你快速捕获变量名拼写错误、未声明变量这类低级问题,大幅减少调试时间。 - 给私有变量明确类型:比如
Private AcnS As String而非默认的Variant类型,让代码逻辑更清晰,避免潜在的类型不匹配问题。
内容的提问来源于stack exchange,提问作者Mahhdy




