繁体   English   中英

VBA:使用公共属性代替 Const(对于非 Unicode 字符)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM