我正在使用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不支持将全局常量作为字符串吗?
答案 0 :(得分:4)
不幸的是,您不能使用函数将值设置为常量。 Const
的目的是在运行时之前将常量的值设置为 ,并且函数只能在运行时返回值。
您的问题似乎是在模块的declarations section中没有声明您的常量,这就是为什么在运行任何代码时都不会出现编译错误的原因。
但是,还有其他选择。
您可以为每个变量创建一个函数:
Function STRPOWER0() As String
STRPOWER0 = CStr(ChrW(&H2070))
End Function
Sub Main()
Msgbox STRPOWER0
End Sub
您指出,您担心每次调用CStr()
时都运行ChrW()
和STRPOWER0
函数。尽管您可能只对性能造成极小的影响(即使多次调用),但您可以使用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