You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

VBA类模块:如何在类级事件中获取类实例的属性值?

解决VBA类模块事件中获取实例属性的问题

首先,你的思路完全没问题——在类模块内部用Me.属性名确实是引用当前实例属性的正确方式,问题出在代码里一个很容易忽略的变量名笔误上。

问题根源分析

看你的类模块代码:

  • 你声明了私有变量 Private AcnS 用来存储Aircraft属性的值
  • 但在Property GetProperty 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

火山引擎 最新活动