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
我正在 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