跨各种模块管理用户定义的类型

时间:2010-10-20 12:51:30

标签: vba types user-defined-types

跨VBA模块管理常见用户定义类型的最佳方法是什么?

我在不同的模块中使用相同的用户定义类型。例如,我经常需要表示(x,y)点,所以我最终在不同的模块中有这个Type

Type XYpointType
    x As Double
    y As Double
End Type

我将类型XYpointType的参数传递给不同模块中的子函数和函数。

但是,我怀疑这是管理用户定义类型的一种糟糕方式。完全相同的Type定义代码最终出现在许多不同的模块中。

或者,我可以在单个中央“类型”模块中使用此Type声明,并且需要此特定类型的所有其他模块应引用types模块。缺点是每个模块都失去了它的“模块性”,因为它必须伴随着“类型”模块,无论它在哪里。

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

使用第二种方法。关键是要制作一个可重复使用的类型blob。要可以重复使用,必须将其分开。然后,是的,使用这些类型的每个模块都必须引用该blob。但是关于相互调用的模块,需要他们调用的模块的表格,可以说同样的事情,等等。

答案 1 :(得分:3)

这很有意思,因为我从来不知道你可以有两个模块同时声明一个同名的公共类型。现在我知道了,我很害怕。

首先,Eric Towers是正确的,您只想将Type声明放在一个模块中。使用此类型的其他模块将取决于可用的模块,但这只是模块化带来的。管理模块之间的依赖关系的需求对于所有软件开发都是通用的。不幸的是,在单个VBA项目中(就像您在单个Excel工作簿中找到的那种),管理模块依赖项的唯一选择是手动。 (在VBA中,“模块”实际上是“源代码文件”。其他语言/环境具有各种更高级别的包装系统。)

现在是可怕的部分。如果你在不同的模块中声明了具有相同名称的类型,那么你就是在为自己设置问题。考虑两个VBA模块:

'Module1

Public Type typ
    x As String
End Type

Public Sub useTyp()
    Dim t As typ
    t.x = 42

    Debug.Print t.x + t.x
End Sub

'Module2

Public Type typ
    x As Long
End Type

Public Sub useTyp()
    Dim t As typ
    t.x = 42

    Debug.Print t.x + t.x
End Sub

在同一个项目中,您的代码将“编译”(至少在Excel VBA中)。但是两个'useTyp'潜艇提供不同的输出。更糟糕的是,如果从其中一个模块中删除其中一个Type声明,则会突然改变同一模块中'useTyp'例程的行为!这种含糊不清是不可取的。

正在发生的事情是VBA真正创建了两种不同的类型,'Module1.typ'和'Module2.typ'。当您在同一个模块中并且不符合类型名称时,VBA会静默找到“正确”类型并使用它。

听到您将一个'XYpointType'的实例传递给具有不同'XYpointType'声明的模块,我有点惊讶。它并不重要,但你可以发布代码吗?我对这样的挑剔事情很感兴趣......

答案 2 :(得分:1)

您还可以为XYPoints创建一个类。这将允许您拥有自定义功能,并且您需要走这条路。与类相比,类型非常有限。

这是一个很好的资源,可以帮助您入门:http://www.cpearson.com/excel/Classes.aspx