VBA Excel 接口实现和继承问题

VBA Excel Interface implementation and inheritance issues

我的任务有点复杂,首先我会告诉你问题所在,然后是我尝试过的以及我迷路的地方。

那么假设我有三部作品sheet(A、B、C)。这些 sheet 有一个 table。 table 的标题具有相似和不同的名称。还有标题的位置不一样,顺序很重要:

我的代码中有不同的模块(模块 1、模块 2、...)。这些模块分配给 sheets。所以:

As-is 功能是这些模块静态引用 table 标题的列名称 ->

我的问题是当我必须在任何 sheet 中添加一个新标题时,这是一种痛苦 ->

此时的 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