VBA:可以在运行时configuration一组“常量”吗?

在编写处理电子表格的macros时,我喜欢在模块的顶部设置常量,并与我将要使用的各种列号相对应。 我最近有一个情况,我需要执行两个略有不同的文件格式完全相同的任务。 我的解决scheme是将常量变成variables,并调用一个configuration子来设置它们取决于要处理的文件。 我不喜欢这个解决scheme的唯一的东西是,那些不变的,并且不被粗心的用户(或者开发者(!))调整的代码,现在变成了一个variables。

有没有办法使这些configuration的值不可改变的主要子?

原创风格:

Const iColUser = 1 Const iColColor = 2 Const iColPet = 3 Sub Main() iColUser = 3 '<--This line will prevent sub from running. 

新风格:

 Dim iColUser As Integer Dim iColColor As Integer Dim iColPet As Integer Sub Config() Select Case SpreadsheetType Case a iColUser = 1 iColColor = 2 iColPet = 3 Case b iColUser = 3 iColColor = 2 iColPet = 1 End Select End Sub Sub Main() iColUser = 2 '<--This line will run, and cause major damage. 

封装它们

添加一个类模块,并对这些进行抽象 。 将列编号逻辑抽象出来,为列Property Get访问器,然后为“模式”使用GetLet访问器来确定属性返回的值。

 Public Enum SpreadsheetType A B End Enum Private columnMode As SpreadsheetType Public Property Get Mode() As SpreadsheetType Mode = columnMode End Property Public Property Let Mode(ByVal value As SpreadsheetType) columnMode = value End Property Public Property Get UserColumn() As Long Select Case Mode Case A UserColumn = 1 Case B UserColumn = 3 End Select End Property Public Property Get ColorColumn() As Long Select Case Mode Case A ColorColumn = 2 Case B ColorColumn = 2 End Select End Property Public Property Get PetColumn() As Long Select Case Mode Case A PetColumn = 3 Case B PetColumn = 1 End Select End Property 

现在要使用它,你需要一个类的实例 。 假设你把它叫做Class1 (不要那样做!),使用它看起来像这样:

 Sub Test() Dim sheetColumns As New Class1 sheetColumns.Mode = A Debug.Print sheetColumns.UserColumn 'outputs 1 sheetColumns.Mode = B Debug.Print sheetColumns.UserColumn 'outputs 3 End Sub 

使用这个对象的代码只能读取这些值,而不能写入它们 – 除非你为可变值实现了一个Property Let访问器。