代码之家  ›  专栏  ›  技术社区  ›  Jean-François Corbett

跨不同模块管理用户定义类型

  •  4
  • Jean-François Corbett  · 技术社区  · 14 年前

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

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

    Type XYpointType
        x As Double
        y As Double
    End Type
    

    我传递类型的参数 XYpointType

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

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

    3 回复  |  直到 14 年前
        1
  •  3
  •   jtolle    14 年前

    这很有趣,因为我从来不知道可以让两个模块同时声明一个同名的公共类型。现在我知道了,我吓坏了。

    首先,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会自动找到“正确”的类型并使用它。

        2
  •  3
  •   Eric Towers    14 年前

    使用第二种方法。关键是创建一个可重用类型blob。为了可重用,必须将其分离。然后,是的,使用这些类型的每个模块都必须引用该blob。但是对于模块之间的相互调用,需要它们调用的模块的表单,也可以这样说。

        3
  •  1
  •   Community CDub    6 年前

    还可以为XYPoints创建类。这将允许您拥有自定义函数,如果您需要沿着这条路走下去,则可以使用方法。与类相比,类型非常有限。

    http://www.cpearson.com/excel/Classes.aspx