VBA:全局常量字符串

VBA: Global Constant Strings

我正在 Excel 中使用数学特殊字符。
(指数⁴、GRΣΣK 和其他 Unicode 字符。)

我想将常用的 Unicode 字符串存储为全局常量,因为这可能比每次我需要一个时调用 CStr() 要快得多(而且更不容易出错)。

例如,我在所有函数之外都有这些声明:

Public Const STRPOWER0        As String = CStr(ChrW(&H2070)) '0th power
Public Const STRPOWER1        As String = "¹" 'CStr(ChrW(&HB9)) 1st power
Public Const STRPOWER2        As String = "²" 'CStr(ChrW(&HB2)) 2nd power
Public Const STRPOWER3        As String = "³" 'CStr(ChrW(&HB3)) 3rd power
Public Const STRPOWER4        As String = CStr(ChrW(&H2074)) '4th power
Public Const STRPOWER5        As String = CStr(ChrW(&H2075)) '5th power
Public Const STRPOWER6        As String = CStr(ChrW(&H2076)) '6th power
Public Const STRPOWER7        As String = CStr(ChrW(&H2077)) '7th power
Public Const STRPOWER8        As String = CStr(ChrW(&H2078)) '8th power
Public Const STRPOWER9        As String = CStr(ChrW(&H2079)) '9th power
Public Const STRPOWERNEGATIVE As String = CStr(ChrW(&H207B)) 'Superscript negative sign

问题是,每当我尝试引用这些字符串之一时,值是 Empty
(如果我打开 Option Explicit,我会收到 Variable not defined 的错误消息)

我做错了什么?
VBA 不支持全局常量作为字符串吗?

遗憾的是,您不能使用函数将值设置为常量。 Const 的目的是在运行时 之前设置常量的值 ,而函数在运行时只能 return 值。

你的问题似乎是你的常量没有在模块的 declarations section 中声明,这就是为什么你在 运行 任何代码时都没有得到编译错误。

然而,还有一些选择。

您可以为每个变量创建一个函数:

Function STRPOWER0() As String
    STRPOWER0 = CStr(ChrW(&H2070))
End Function

Sub Main()
    Msgbox STRPOWER0
End Sub

您指出每次调用 STRPOWER0 时您都担心 运行 CStr()ChrW() 函数。虽然您可能只会对性能造成非常小的影响 - 即使调用多次 - 您可以使用 Static 变量仅在运行时第一次进行转换。

Function STRPOWER0() As String
    Static RetVal As String
    If RetVal = "" Then RetVal = CStr(ChrW(&H2070))
    STRPOWER0 = RetVal
End Function

Sub Main()
    Msgbox STRPOWER0
End Sub

静态允许变量 RetVal 在整个运行时期间保留其数据,即使函数超出范围也是如此。


另一种方法是使用 sub 在运行时开始时设置所有变量:

'This line in declarations section of module
Public STRPOWER0$, STRPOWER1$, STRPOWER2$ ', etc

Private Sub SetPubVars

    STRPOWER0 = CStr(ChrW(&H2070))
    STRPOWER1 = CStr(ChrW(&HB9))
    STRPOWER2 = CStr(ChrW(&HB2))

    ' So on

End Sub

Sub MAIN()

    ' Set the values
    SetPubVars

    MsgBox STRPOWER0

End Sub