VBA Excel 接口实现和继承问题
VBA Excel Interface implementation and inheritance issues
我的任务有点复杂,首先我会告诉你问题所在,然后是我尝试过的以及我迷路的地方。
那么假设我有三部作品sheet(A、B、C)。这些 sheet 有一个 table。 table 的标题具有相似和不同的名称。还有标题的位置不一样,顺序很重要:
- A sheet table 标题:AA、BB、CC、DD、FF
- B sheet table 头衔:BB、AA、DD、EE
- C sheet table 标题:AA、DD、BB、CC
我的代码中有不同的模块(模块 1、模块 2、...)。这些模块分配给 sheets。所以:
- 模块 1、模块 2 -> A sheet
- 模块 3、模块 4 -> B sheet
- 模块 5、模块 6 -> C sheet
As-is 功能是这些模块静态引用 table 标题的列名称 ->
- 模块 1 和模块 2 'know' sheet 中的标题 'DD' 'A' 位于 'D'.
列
- 模块 3 和模块 4 'know' sheet 中的标题 'DD' 'B' 位于 'C'.
列
- 模块 5 和模块 6 'know' sheet 中的标题 'DD' 'C' 位于 'B'.
列
- 等等....
我的问题是当我必须在任何 sheet 中添加一个新标题时,这是一种痛苦 ->
- Sheet 新标题 -> AA、BB、XX、CC、DD、FF
此时的 As-is 功能是我必须调试与 Sheet 'A' 相关的所有模块以更改列引用,因为新标题。在上面的示例中,我必须更改每个模块(模块 1 和模块 2)中的标题 CC、DD、FF 列引用。
所以我尝试设计一些集中的列引用存储,其中我放置与每个 sheet 相关的标题的列引用。这些模块从该商店检索列信息,因此如果任何时候弹出一个新标题,我必须在这里更改标题的列引用。看来我真的很喜欢编码 :D
我最初的想法是为每个 sheet 创建一个 Class 模块。这个 class 模块会有 public 功能,标题栏的引用是什么 ->
Function titleDDinsheetA() As String
titleDDinsheetA = "D"
End Function
但是正如您在示例中看到的那样,有相似的标题名称,例如 'AA' 存在于所有 sheet 中。所以我计划创建一个界面,以确保每个常见的标题都会出现在每个 class 模块实现中。所以 ->
接口 调用了 ICommonTitles
Option Explicit
Public Function titleDD()
End Function
Class 模块到 Sheet A 称为 SheetATitles
Option Explicit
Implements ICommonTitles
Public Function ICommonTitles_titleDD()
ICommonTitles_titleDD = "D"
End Function
但是正如您在上面的标题结构中看到的那样,我 sheet 指定了标题,例如 sheet A 中的 FF。还有所有 [=147= 的子集中存在的标题]s -> 标题 CC 存在于 sheet A 和 C 中。所以我尝试将自定义 public 函数添加到 SheetATitles class 模块,例如 ->
Option Explicit
Implements ICommonTitles
Public Function ICommonTitles_titleDD()
ICommonTitles_titleDD = "D"
End Function
Public Function titleCC()
titleCC = "C"
End Function
此时我开始出现错误。上面的例子给出了这个:
Sub test()
Dim testcls As ICommonTitles
Set testcls = New SheetATitles
MsgBox testcls.titleDD
MsgBox testcls.titleCC
End Sub
此时我在 MsgBox testcls.titleCC 行收到类似 Method or data member not found 的错误。我试图将实例化更改为:
Sub test()
Dim test_cls As SheetATitles
Set test_cls = New SheetATitles
MsgBox testcls.titleDD
MsgBox testcls.titleCC
End Sub
此时我得到了同样的错误,但是在第 MsgBox test_cls.titleDD.
行
我尝试做一些类似接口继承的事情。所以我创建了一个 sheet 特定接口,并在 SheetATitles 中实现了它。所以:
接口 调用了 ICommonTitles
Option Explicit
Public Function titleDD()
End Function
接口调用了我SheetATitles
Option Explicit
Implements ICommonTitles
Public Function ICommonTitles_titleDD()
End Function
Public Function titleCC()
End Function
Class 模块到 Sheet A 称为 SheetATitles
Option Explicit
Implements ISheetATitles
Public Function ISheetATitles_ICommonTitles_titleDD()
ISheetATitles_ICommonTitles_titleDD = "D"
End Function
Public Function ISheetATitles_titleCC()
ISheetATitles_titleCC="C"
End Function
但是此时我遇到了编译错误,例如:Object 模块需要为接口 ISheetATitles 实现 ICommonTitles_titleDD。
所以我在这一点上迷路了 :D 首先,当我在 class 模块中实现一个接口时,我根本不明白为什么我不能在 class 模块创建自定义 public 函数=]模块。我也不明白为什么会出现上述错误。另外,我来自编程世界的 Java 方面,还没有深入 VBA,所以我可能会错过一些基本的东西。
大家有什么想法吗?
rgds,
'Child
更简单的方法:
Enum Sheet1Headers
AA = 1
BB = 2
CC = 3
End Enum
Enum Sheet2Headers
AA = 1
BB = 3
CC = 5
DD = 7
End Enum
Enum Sheet3Headers
AA = 1
BB = 3
XX = 4
DD = 7
End Enum
然后你可以这样做:
With Sheet1.Cells(2, Sheet1Headers.AA)
如果您还想要使用列字母的选项:
Function Letter(v As Long)
Letter = Replace(Cells(1, v).Address(False, False), "1", "")
End Function
然后:
? letter(Sheet2Headers.BB) 'C
我的任务有点复杂,首先我会告诉你问题所在,然后是我尝试过的以及我迷路的地方。
那么假设我有三部作品sheet(A、B、C)。这些 sheet 有一个 table。 table 的标题具有相似和不同的名称。还有标题的位置不一样,顺序很重要:
- A sheet table 标题:AA、BB、CC、DD、FF
- B sheet table 头衔:BB、AA、DD、EE
- C sheet table 标题:AA、DD、BB、CC
我的代码中有不同的模块(模块 1、模块 2、...)。这些模块分配给 sheets。所以:
- 模块 1、模块 2 -> A sheet
- 模块 3、模块 4 -> B sheet
- 模块 5、模块 6 -> C sheet
As-is 功能是这些模块静态引用 table 标题的列名称 ->
- 模块 1 和模块 2 'know' sheet 中的标题 'DD' 'A' 位于 'D'. 列
- 模块 3 和模块 4 'know' sheet 中的标题 'DD' 'B' 位于 'C'. 列
- 模块 5 和模块 6 'know' sheet 中的标题 'DD' 'C' 位于 'B'. 列
- 等等....
我的问题是当我必须在任何 sheet 中添加一个新标题时,这是一种痛苦 ->
- Sheet 新标题 -> AA、BB、XX、CC、DD、FF
此时的 As-is 功能是我必须调试与 Sheet 'A' 相关的所有模块以更改列引用,因为新标题。在上面的示例中,我必须更改每个模块(模块 1 和模块 2)中的标题 CC、DD、FF 列引用。
所以我尝试设计一些集中的列引用存储,其中我放置与每个 sheet 相关的标题的列引用。这些模块从该商店检索列信息,因此如果任何时候弹出一个新标题,我必须在这里更改标题的列引用。看来我真的很喜欢编码 :D
我最初的想法是为每个 sheet 创建一个 Class 模块。这个 class 模块会有 public 功能,标题栏的引用是什么 ->
Function titleDDinsheetA() As String
titleDDinsheetA = "D"
End Function
但是正如您在示例中看到的那样,有相似的标题名称,例如 'AA' 存在于所有 sheet 中。所以我计划创建一个界面,以确保每个常见的标题都会出现在每个 class 模块实现中。所以 ->
接口 调用了 ICommonTitles
Option Explicit
Public Function titleDD()
End Function
Class 模块到 Sheet A 称为 SheetATitles
Option Explicit
Implements ICommonTitles
Public Function ICommonTitles_titleDD()
ICommonTitles_titleDD = "D"
End Function
但是正如您在上面的标题结构中看到的那样,我 sheet 指定了标题,例如 sheet A 中的 FF。还有所有 [=147= 的子集中存在的标题]s -> 标题 CC 存在于 sheet A 和 C 中。所以我尝试将自定义 public 函数添加到 SheetATitles class 模块,例如 ->
Option Explicit
Implements ICommonTitles
Public Function ICommonTitles_titleDD()
ICommonTitles_titleDD = "D"
End Function
Public Function titleCC()
titleCC = "C"
End Function
此时我开始出现错误。上面的例子给出了这个:
Sub test()
Dim testcls As ICommonTitles
Set testcls = New SheetATitles
MsgBox testcls.titleDD
MsgBox testcls.titleCC
End Sub
此时我在 MsgBox testcls.titleCC 行收到类似 Method or data member not found 的错误。我试图将实例化更改为:
Sub test()
Dim test_cls As SheetATitles
Set test_cls = New SheetATitles
MsgBox testcls.titleDD
MsgBox testcls.titleCC
End Sub
此时我得到了同样的错误,但是在第 MsgBox test_cls.titleDD.
行我尝试做一些类似接口继承的事情。所以我创建了一个 sheet 特定接口,并在 SheetATitles 中实现了它。所以:
接口 调用了 ICommonTitles
Option Explicit
Public Function titleDD()
End Function
接口调用了我SheetATitles
Option Explicit
Implements ICommonTitles
Public Function ICommonTitles_titleDD()
End Function
Public Function titleCC()
End Function
Class 模块到 Sheet A 称为 SheetATitles
Option Explicit
Implements ISheetATitles
Public Function ISheetATitles_ICommonTitles_titleDD()
ISheetATitles_ICommonTitles_titleDD = "D"
End Function
Public Function ISheetATitles_titleCC()
ISheetATitles_titleCC="C"
End Function
但是此时我遇到了编译错误,例如:Object 模块需要为接口 ISheetATitles 实现 ICommonTitles_titleDD。
所以我在这一点上迷路了 :D 首先,当我在 class 模块中实现一个接口时,我根本不明白为什么我不能在 class 模块创建自定义 public 函数=]模块。我也不明白为什么会出现上述错误。另外,我来自编程世界的 Java 方面,还没有深入 VBA,所以我可能会错过一些基本的东西。
大家有什么想法吗?
rgds,
'Child
更简单的方法:
Enum Sheet1Headers
AA = 1
BB = 2
CC = 3
End Enum
Enum Sheet2Headers
AA = 1
BB = 3
CC = 5
DD = 7
End Enum
Enum Sheet3Headers
AA = 1
BB = 3
XX = 4
DD = 7
End Enum
然后你可以这样做:
With Sheet1.Cells(2, Sheet1Headers.AA)
如果您还想要使用列字母的选项:
Function Letter(v As Long)
Letter = Replace(Cells(1, v).Address(False, False), "1", "")
End Function
然后:
? letter(Sheet2Headers.BB) 'C