【问题标题】:vba/catvba class instantiationvba/catvba 类实例化
【发布时间】:2013-01-23 13:43:10
【问题描述】:

我想在全球范围内声明类 这是我的例子:

我想使用看起来像这样的类 clsIEError:

Option Explicit

Public Sub m(msg As String, Optional title As String = "Title:")

    'Attribute Value.VB_UserMemId = 0

    'this method will be used as defualt method
    'and here are attributes msg and title used to create some inteface
End Sub

这就是它的工作原理示例1:

Sub CATMain()

     Dim ie As clsIEError
     Set ie = New clsIEError

     ie "test", "title"

     Set ie = Nothing
End Sub

但我的问题是我想在全球范围内拥有它示例2:

Option Explicit

Public ie As clsIEError

Private Function Init()
    Set ie = New clsIEError
End Function

Sub CATMain()
    Call Init

'   and to use it same as in example 1    
    ie "test", "title" 

'   but i am able to use it only like:
'   ie.m "test", "title" 'works as expected 

    Set ie = Nothing
End Sub

为什么使用公共默认方法不起作用?

【问题讨论】:

  • 为什么首先创建classes
  • 我认为不重要,但在这种情况下,我有一些自定义用户界面,我想在不同的模块中使用。
  • 你能告诉我们你真正想使用的代码吗?
  • 而不是' ie.m "test", "title" '我想用它作为' ie "test", "title" ',公开声明,仅此而已
  • 我不知道 catia VBA 编辑器,但如果您在 MS office 中执行此操作或 Catia 类似,您不能仅在代码中提供属性 - 不幸的是,您需要导出类,使用 Attribute 行编辑文本文档,然后将其导入回来(该行隐藏在编辑器中) - 请参阅cpearson.com/excel/DefaultMember.aspx 虽然我同意示例一个也不应该工作......:-/

标签: vba catia


【解决方案1】:

我可以确认这并不像您描述的那样有效。我在运行时得到“预期的过程,而不是变量”,但没有编译错误。这一定是 VB 解析器中的错误,但这是我能想到的唯一解释。

我一直认为属性必须匹配元素名称。你在哪里

Attribute Value.VB_UserMemId = 0

我认为你应该有

Attribute m.VB_UserMemId = 0

但无论哪种方式,它似乎都可以工作(使用本地声明的变量)。这是一个糟糕的答案,但答案是显式调用该方法。对不起。

【讨论】:

  • 嗨,迪克,谢谢您的回答。属性元素名称将自动更改为传递给元素名称。如果您更改元素的名称,甚至类型,vba 编辑器会自动调整它。事实上,它不必在全局范围内工作,但我想至少在模块/类模块级别使用这个对象。
【解决方案2】:

我不确定它是否会明确回答您的问题,但是,就我而言,我想创建一个可以在整个项目中访问的类的实例。基本上我需要创建静态类或单例。我发现这个post 非常有用。

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多