Rubberduck VBA 代码检查:成员 'x' 具有值为“-1”的 'VB_VarHelpID' 属性,但没有相应的注释

Rubberduck VBA Code Inspections: Member 'x' has a 'VB_VarHelpID' attribute with value '-1', but no corresponding annotation

我正在使用 "Worksheet abstraction\Worksheet Proxy" 技术开发一个 Excel VBA 项目,如 There is no worksheet article and followed-up in 中所述。我的 VBA 代码采用 MVP 设计模式构建,并且我编写了尽可能多的 OOP 代码。 Rubberduck 的 "Code Inspections" 功能一直以来都有很大的帮助,但是在最近的版本中(我认为自 v2.4.1.4*** 以来,但我无法准确指出确切的版本)我开始始终如一收到一些我无法理解的 "Rubberduck Opportunities" 和 "Code Quality Issues" 警告。

如标题所述,第一个是 Member 'x' has a 'VB_VarHelpID' attribute with value '-1', but no corresponding annotation Rubberduck 机会。每当我在 "WorksheetProxy" class 中声明 event-exposing 工作表(或其他 event-exposing object,即命令按钮)时,我都会得到这个。以下代码中的两行都会触发此错误:

' This code sits in my ProcessMasterProxy class
Private WithEvents sheet As Worksheet
Private WithEvents buttonHideOwnerToAvailability As CommandButton

然后,每当我声明 event-exposing "SheetProxy" class 或 "Presenter" class 的实例时,我都会在 "Presenter" class =55=] 用户表单:

' Here I am declaring an instance of the ProcessMasterProxy class from the above snippet
Private WithEvents assetPrx As ProcessMasterProxy
Private WithEvents view As ChecklistPopup

Rubberduck 的代码检查为我提供了两种针对此类错误的操作: 1. "Add attribute annotation" 在声明上方插入 '@MemberAttribute VB_VarHelpID, -1 行 AND 2. "Remove attribute"好像什么都没做,点了还是报错

我想知道 "Add attribute annotation" 修复程序对我的 VBA 项目有什么影响,我是否应该应用它,或者更愿意更改我的代码中的某些内容以避免完全出错.

同样,我担心 "Code Quality Issues" 部分中出现的相关错误:To the variable 'sheet' of declared type 'EXCEL.EXE:Excel.Worksheet' a value is set assigned with the incompatible declared type 'ProcessMgmt.ProcessMaster' 与 "ProcessMasterProxy" class 中的以下代码相关上面的第一个片段:

Private WithEvents sheet As Worksheet
Private WithEvents buttonHideOwnerToAvailability As CommandButton

Private Sub Class_Initialize()
    ***Set sheet = ProcessMaster***
    Set buttonHideOwnerToAvailability = ProcessMaster.btnHideAssetOwnerToAvailability
End Sub

其中 "ProcessMaster" 是实际 Excel 工作表的名称,上面的代码位于其对应的 "SheetProxy" Class.

Code Inspections 针对此错误提供的唯一选项是 "Ignore once",我想再次知道这样做是否安全。我之前在几个项目中出现过这个错误,但在那里一切正常。但是,在我最近的项目中,我在打开工作簿时开始随机收到“Run-time 错误 35010”,我的 Workbook_Open 事件中有以下代码:

Private pres As Presenter
If pres Is Nothing Then
    Set pres = New Presenter
End If

此问题是否与上述两个代码检查中的任何一个有关suggestions/errors?

这些检查的作用是揭示 VBE 可能添加的隐藏属性。通常这些属性会影响 class 的使用方式(VB_ExposedVB_PredeclaredId)或成员的行为方式(VB_UserMemId 等)。但它们在编辑器中也是完全不可见的,没有相应的 annotation/comment,通常无法分辨它们的存在。

在这种特殊情况下,Rubberduck 通知1 [=16= 上有一个隐藏的 VB_VarHelpId 属性]变量。

通过添加相应的注释注释,我们使隐藏代码在编辑器中可见并可修改:更改注释的参数值,Rubberduck 检查现在会说属性和注释不同步,这意味着隐藏代码说的是一回事,但可见的评论说的是另一回事。

删除属性 应该 具有将模块导出到临时文件、修改该文件以删除隐藏属性并将修改后的模块重新导入项目的效果。请注意,由于无法以这种方式将文档模块(例如 ThisWorkbook 或 sheet 模块)导入到项目中,因此这在文档模块中不起作用,因此 Rubberduck 不应在这些模块中发出有关去同步 annotations/attributes 的警告模块。如果 quickfix 没有做任何事情,请 report a bug,因为这绝对有效! (编辑:确认在 build 2.4.1.5229 中按预期工作)

底线,"Rubberduck Opportunities" 检查只是:利用 Rubberduck 特定功能的机会(例如管理隐藏属性的注释注释):它们并不表示代码有任何问题。


"incompatible type" 检查结果是一个已知问题:目前 Rubberduck 没有看到 worksheet 模块的 Worksheet 接口(也没有看到 Workbook 模块的 Workbook 接口ThisWorkbook),这会导致围绕文档模块出现大量误报。直到 Rubberduck 可以分辨出 ProcessMaster 不仅是一个 ProcessMaster 对象而且还是一个 Worksheet(我们将在 2.5.x 中对此进行修复),它可能是安全的在抱怨文档模块和 MSForms 接口(具有相同的潜在问题)时忽略该检查。

此检查背后的想法是,通常 VBA 只会在 运行 时意识到对象类型不兼容,但是(假设它看到所有类型的所有接口)Rubberduck可以在设计时告诉您一个问题,比执行早得多。


至于间歇性错误,我怀疑是因为您在对象实际可用之前访问它们。在 New Presenter 语句中 class 运行 的 Initialize 处理程序, 调用 returns 之前分配 pres.

我会尝试看看将代码从 Initialize 处理程序移到某些参数化的初始化程序中是否可以修复它。

If pres Is Nothing Then
    Set pres = New Presenter
    pres.Initialize ProcessMaster
End If

Initialize 过程可能如下所示(未经测试):

Public Sub Initialize(ByVal masterSheet As Worksheet)
    Set sheet = masterSheet
    Set buttonHideOwnerToAvailability = masterSheet.Buttons("btnHideAssetOwnerToAvailability")
End Sub

想法是,注入 worksheet 依赖而不是将其耦合到演示者 class(这是一件非常好的事情!),但主要是让 class 实例在我们开始访问主机文档之前完全初始化自身(它刚刚打开并且可能有一些尚未完成的异步初始化......只是在这里大声思考,这可能会或可能不是实际发生的事情)。


1每个单独检查的严重级别可以是configured in the settings.