Vba 实现字符串

Vba 实现字符串,vba,excel,interface,implements,Vba,Excel,Interface,Implements,我想创建一个类,它看起来像VBA的字符串。也就是说,如果我用一个字符串参数创建一个函数,并传递这个对象,我不会得到任何错误 我原以为字符串可以工作,但显然它甚至不是一个选项 为什么这是不可能的,有没有办法得到我想要的行为?当然,我可以创建自己的IString接口并指定我的函数来请求它,但我不想这样做 我试图创建一个文件选择对话框,我可以将它传递给任何需要字符串文件路径作为参数的函数。这将是一种将文件选择还原到现有函数的简洁的自包含方式。因为字符串不是VBA的对象,而不是Java或.NET等其他语

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

我原以为字符串可以工作,但显然它甚至不是一个选项

为什么这是不可能的,有没有办法得到我想要的行为?当然,我可以创建自己的IString接口并指定我的函数来请求它,但我不想这样做


我试图创建一个文件选择对话框,我可以将它传递给任何需要字符串文件路径作为参数的函数。这将是一种将文件选择还原到现有函数的简洁的自包含方式。

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

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

值得称赞的是,Pearson:

可以通过将.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

请注意,现在不需要使用S命名属性。它的行为与字符串完全相同。你应该能够像这样在你的课堂上放置一个文件选择器。

这归功于了不起的芯片Pearson:

可以通过将.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

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

据我所知,这在VBA中是不可能的,但@Mat'sMug是您的人!。你不能传递你的类的String属性吗?如果我用一个String参数创建一个函数,然后传递这个对象,我不会得到任何错误-你不能有错误-一个带有默认成员的类可以工作,但是你将传递默认成员的值,而不是对象本身。巧合的是,我的上一篇文章专门讨论了默认成员的陷阱:……明智地使用它们。@MathieuGuindon,现在我的知识更进一步了。希望我没有吵醒你!据我所知,这在VBA中是不可能的,但@Mat'sMug是你的人!。你不能传递你的类的String属性吗?如果我用一个String参数创建一个函数,然后传递这个对象,我不会得到任何错误-你不能有错误-一个带有默认成员的类可以工作,但是你将传递默认成员的值,而不是对象本身。巧合的是,我的上一篇文章专门讨论了默认成员的陷阱:……明智地使用它们。@MathieuGuindon,现在我的知识更进一步了。希望我没有吵醒你!我喜欢Chip Pearson的工作——但是说一个范围的默认成员是它的值,有点走捷径。默认成员是名为[_default]的隐藏成员。如果切换隐藏成员,则可以在对象浏览器中看到该成员,它似乎返回值。。。但如果情况始终如此,那么默认成员将是Value属性,而不是某个隐藏成员。很明显,事情远不止这些。。。这就是为什么默认成员是邪恶的:如果不深入了解实现细节,你就无法知道你的代码到底做了什么。Str对于类来说是个糟糕的名字,因为它隐藏了内置的Str函数。另外,As New将在初始化、状态和销毁方面给您带来意想不到的结果。有效的注释,Thunder-但我制作了一个快速而肮脏的示例来演示在文本编辑器中编辑属性的原理,因此使用了最短和最方便的方法。我不希望OP逐行复制我的代码!仅仅为了理解核心原则:我喜欢Chip Pearson的工作——但是说范围的默认成员是它的值,这有点走捷径。默认成员是名为[_default]的隐藏成员。如果切换隐藏成员,则可以在对象浏览器中看到该成员,它似乎返回值。。。但如果情况始终如此,那么默认成员将是Value属性,而不是某个隐藏成员。很明显,事情远不止这些。。。这就是默认memb的原因
ER是邪恶的:如果不深入了解实现细节,你就不可能知道你的代码到底做了什么。Str对于一个类来说是个糟糕的名字,因为它隐藏了内置的Str函数。另外,As New将在初始化、状态和销毁方面给您带来意想不到的结果。有效的注释,Thunder-但我制作了一个快速而肮脏的示例来演示在文本编辑器中编辑属性的原理,因此使用了最短和最方便的方法。我不希望OP逐行复制我的代码!只是为了理解核心原则: