是否可以使用variable(nameOfVariable) = myValue
我的XLA Add-In
宏使用了很多模块级变量;许多是Public
,256是Const
。公共部分的一部分伪Const 偶尔从(网络可访问的)config.init文件的内容中删除。
因此,我需要在宏的开头或用户启动某些特定过程时为一堆公共变量赋值。
config.init文件的内容非常简单:
nameOfVariable1,value1
nameOfVariable2,value2
nameOfVariable3,value3
...
我目前正在使用初始化程序:
设置这些变量Do While Not EOF(1) ' Loop until end of config.init
Line Input #fnum, TextLine ' Read line into variable Textline
myNameOfVariable = Split(TextLine, ",")(0)
Select Case myNameOfVariable
Case "nameOfVariable1"
nameOfVariable1 = Split(TextLine, ",")(1)
Case "nameOfVariable2"
nameOfVariable2 = Split(TextLine, ",")(1)
Case "nameOfVariable3"
nameOfVariable3 = Split(TextLine, ",")(1)
...
Loop
但这意味着我需要列出该过程的Select Case
语句中的每个nameOfVariable,即使指定值的指令严格相同(= Split(TextLine, ",")(1)
)。 / p>
我想用以下内容替换Select Case
语句:
Do While Not EOF(1) ' Loop until end of config.init
Line Input #fnum, TextLine ' Read line into variable.
nameOfVariable = Split(TextLine, ",")(0)
If thisvariableexist(nameOfVariable) then
variable(nameOfVariable) = Split(TextLine, ",")(1)
End if
Loop
因此,如果我选择在init文件中添加一个新变量(当前声明为Const
的新变量),我就不需要修改任何内容。
可以在VBA中使用吗?
答案 0 :(得分:2)
然后创建一个类模块名称CApp并添加以下代码
Option Explicit
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, _
ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, ByVal lpKeyName As Any, _
ByVal lpString As Any, ByVal lpFileName As String) As Long
Const gsINIFILENAME As String = ".. full file name of config.ini ..."
Private m_VAR1 As String
Private m_VAR2 As String
Private m_VAR3 As String
Private m_VAR4 As String
Private Const msSEC As String = "Variables"
Private Const msVAR1 As String = "gVAR1"
Private Const msVAR2 As String = "gVAR2"
Private Const msVAR3 As String = "gVAR3"
Private Const msVAR4 As String = "gVAR4"
Public Property Get gVAR1() As String
gVAR1 = m_VAR1
End Property
Public Property Let gVAR1(ByVal sVAR1 As String)
m_VAR1 = sVAR1
End Property
Public Property Get gVAR2() As String
gVAR2 = m_VAR2
End Property
Public Property Let gVAR2(ByVal sVAR2 As String)
m_VAR2 = sVAR2
End Property
Public Property Get gVAR3() As String
gVAR3 = m_VAR3
End Property
Public Property Let gVAR3(ByVal sVAR3 As String)
m_VAR3 = sVAR3
End Property
Public Property Get gVAR4() As String
gVAR4 = m_VAR4
End Property
Public Property Let gVAR4(ByVal sVAR4 As String)
m_VAR4 = sVAR4
End Property
Private Sub Class_Initialize()
Dim sReturn As String * 255
Dim lLen As Long
lLen = GetPrivateProfileString(msSEC, msVAR1, "", sReturn, 255, gsINIFILENAME)
Me.gVAR1 = Left(sReturn, lLen)
lLen = GetPrivateProfileString(msSEC, msVAR2, "", sReturn, 255, gsINIFILENAME)
Me.gVAR2 = Left$(sReturn, lLen)
lLen = GetPrivateProfileString(msSEC, msVAR3, "", sReturn, 255, gsINIFILENAME)
Me.gVAR3 = Left$(sReturn, lLen)
lLen = GetPrivateProfileString(msSEC, msVAR4, "", sReturn, 255, gsINIFILENAME)
Me.gVAR4 = Left$(sReturn, lLen)
End Sub
在标准模块中添加以下代码
Option Explicit
Public gApp As CApp
Sub Auto_Open()
'Read ini file
Set gApp = New CApp
With gApp
Debug.Print .gVAR1, .gVAR2, .gVAR3, .gVAR4
End With
End Sub
答案 1 :(得分:1)
考虑一个Dictionary
对象(根据@Alex K. comment),其中键将是变量名。
一个简单的设置类示例。
VB_PredeclaredId
设置为True
以充当全局默认实例,Item
已设置为默认成员。
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "Settings"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Private m_settings As Object
Public Property Get Item(ByVal Name As String) As String
Attribute Item.VB_UserMemId = 0
Item = m_settings(Name)
End Property
Public Property Let Item(ByVal Name As String, ByVal Value As String)
m_settings(Name) = Value
End Property
'For testing - can omit
Public Function Names() As Variant
Names = m_settings.Keys
End Function
Private Sub Class_Initialize()
Set m_settings = CreateObject("Scripting.Dictionary")
End Sub
将项目添加到词典中。这可以在读取config.init文件时完成。
Sub Add()
Settings("Name1") = "Value1"
Settings("Name2") = "Value2"
Settings("Name3") = "Value3"
PrintSettings
End Sub
在你的情况下会是这样的:
Dim Values As Variant
Do While Not EOF(1) ' Loop until end of config.init
Line Input #fnum, TextLine ' Read line into variable.
Values = Split(TextLine, ",")
Settings(Values(0)) = Values(1)
Loop
通过提供名称来检索项目:
Settings("Name2")
测试输出:
Sub PrintSettings()
Dim n As Variant
For Each n In Settings.Names()
Debug.Print "Name: " & n & ", Value: " & Settings(n)
Next
End Sub
输出:
'Name: Name1, Value: Value1
'Name: Name2, Value: Value2
'Name: Name3, Value: Value3