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

标签 vba types user-defined-types

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

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

Type XYpointType
    x As Double
    y As Double
End Type

我传递类型为 XYpointType 的参数往返不同模块中的子和函数。

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

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

有什么建议么?

最佳答案

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

因此,首先,Eric Towers 是正确的,您只想将您的类型声明放在一个模块中。使用此类型的其他模块将取决于该模块是否可用,但这只是模块化带来的。所有软件开发都需要管理模块之间的依赖关系。不幸的是,在单个 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' 潜艇给出不同的输出。更糟糕的是,如果您从其中一个模块中删除类型声明之一,您会突然改变同一模块中的“useTyp”例程的行为!这种模棱两可是不可取的。

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

听到您将一个“XYpointType”的实例传递给具有不同“XYpointType”声明的模块,我感到有些惊讶。这不是那么重要,但是您可以发布代码吗?我对这种挑剔的东西很感兴趣...

关于vba - 跨各种模块管理用户定义的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3977994/

相关文章:

Excel 将工作表及其代码复制到新的 xls 文件

C# 数据类型与 MySql 数据类型

c - 原型(prototype)与函数定义不匹配,但确实匹配

java - 使用 JDBC 将用户定义的表类型传递给 SQL Server 存储过程

vba - 无法使用 Range.Sort 对 XLS 数据进行排序

arrays - For 循环返回错误的元素数组

vba - Excel VBA - 选择到列末尾减去两行

types - 任意类型说明符上的 Defmethod?

sql-server - 更改 SQL Server 中的用户定义表类型

sql-server-2008 - 存储过程中的表类型参数导致操作数类型冲突错误