实现一个字符串

时间:2018-03-18 17:27:12

标签: vba excel-vba interface implements excel

我想创建一个看起来像String到VBA的类。也就是说,如果我使用字符串参数创建函数,并改为传递此对象,我将不会收到任何错误。

我认为Implements String会起作用,但显然它甚至不是一种选择!

为什么不可能,有什么方法可以获得我追求的行为? (当然我可以创建自己的IString接口并指定我的函数来请求,但我不想那样做)

我正在尝试创建一个文件选择对话框,我可以将其传递给任何需要字符串文件路径作为参数的函数。这将是一种巧妙的自包含方式,可以将文件选择改编为现有函数。

2 个答案:

答案 0 :(得分:2)

因为String不是"对象"与VBA一样,与Java或.NET等其他语言一样。如果你想要自定义行为,我可能只是创建一个包装字符串而不是实现它的自定义VBA类,并返回String输出,类似于字符串构建器类。

答案 1 :(得分:2)

归功于令人敬畏的Chip Pearson(http://www.cpearson.com/excel/DefaultMember.aspx):

您可以通过将.cls导出到文本文件来完成此操作;编辑它记事本添加默认属性;拯救它;然后将其重新导入VBA。让我们举个例子。

在课程模块中:

Property Get Value() As String
    Value = "Hello"
End Property

然后导出模块。我称之为Str.cls。然后我在记事本中打开了这个文件,并添加了以下行(标记为):

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "Str"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Property Get Value() As String
    Attribute Value.VB_UserMemId = 0 ' <-- THIS is the line I added.
    Value = "Hello"
End Property

在记事本中再次保存文件:然后在VBE中重新导入。但请注意,额外的行(以及所有其他周围的信息)不会出现在VBE中,因此看起来您的代码根本没有改变。但是,您现在可以执行以下操作(在常规模块中):

Sub ReturnSringClass()
    Dim S As New Str
    MsgBox S
End Sub

现在注意,不需要使用&#34; S&#34;命名属性。它的行为与字符串完全相同。您应该能够像这样在您的类中放置一个文件选择器。