[英]VBA: Use of Public Property Get in place of Const (for Non-Unicode Characters)
我有一个 VBA 代码,我需要在其中定义一个包含非 Unicode 字符 (£) 的常量字符串。 有些人可能知道,VBA 编辑器不支持非 unicode,并在区域和语言设置中使用 Windows“系统区域设置”设置来解析/映射这些字符。 我开发代码的机器设置为英文系统区域设置,但一些用户将设置设置为其他语言,例如中文将字符串常量转换为问号(£ --> ?)。
现在, £ = chr(163) 但是,您不能将 chr 用作在 VBA 中定义常量的一部分。 所以虽然这是允许的:
public const mystring = "reference constant string with £"
这在 VBA 中是不允许的”
public const mystring = "reference constant string with " & chr(163).
一种解决方法是将 mystring 定义为公共/全局变量:
常数.bas
public mystring as string
然后在开始运行代码或打开 Excel 时设置公共变量。
这本练习册
Private Sub Workbook_Open()
mystring = "reference constant string with " & chr(163).
End Sub
这个过程的一个问题是公共变量在错误发生或代码停止时被清除。 为了保持该值,我遇到的替代方法是避免使用公共变量,而是使用公共属性 get。 请注意,我必须将此作为课程的一部分。
**.cls
Public Property Get mystring () As String
mystring = "\R;;" & Chr(163)
End Property
所以,现在我想知道这种方法是否会有任何问题? 或者也许有更好的方法来处理具有非 unicode 字符的常量变量。
主要问题是模块的名称Constants
- 它具有误导性,因为 public/global变量和 public get-only属性都不是constants 。
侧节点,不可分配给非常量表达式的常量不是 VBA 特有的限制。
属性在标准模块中是完全合法的,公共 get-only 属性是公开需要在运行时构造的只读值的完美方式。
当错误发生或代码停止时,公共变量被清除
假设“发生错误时”涉及单击End并有效地结束执行上下文,这适用于任何地方公开的所有内容,无论是全局变量、公共属性、对象还是运行时内存中存在的任何内容。 . 这只是正常的东西 - 价值可以随时按需提供。
同样,没有必要为此使用类模块,这在标准模块中是完全合法的:
Option Explicit
Public Property Get MyString() As String
MyString = "\R;;" & Chr(163)
End Property
如果每次访问属性 getter 时都重新创建字符串是一个问题,那么您需要一种方法将其值保留在支持字段中 - 但是,这个支持字段(无论是在类还是标准模块中)只有一个执行上下文存在时的值,这意味着它具有与全局变量完全相同的问题:执行停止,它消失了。
一种解决方法可能是使用VB_PredeclaredId
属性设置为True
(默认为False
)的类。
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "Class1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Option Explicit
Private internalString As String
Private Sub Class_Initialize()
internalString = "\R;;" & Chr(163)
End Sub
Public Property Get MyString() As String
MyString = internalString
End Property
现在VBA会自动创建一个实例Class1
,每当它的引用,只要它的引用,该实例仍然“活着”,直到End
语句明确地执行,或者执行上下文另行终止。 就像一个UserForm
类,你使用类名作为标识符访问这个默认实例:
Debug.Print Class1.MyString
如果引用Class1
时存在默认实例,则返回internalString
。 如果没有,则Class_Initialize
执行,然后返回internalString
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.