我在VBA for Excel中有一个案例,除了在一行上声明的最后一个变量列表之外的所有变量...
Dim str1, str2, str3(), str4() As String
...正在自动从String类型更改为Variant类型。但是,当我在这样的单独行上声明它们时......
Dim str1 As String
Dim str2 As String
Dim str3() As String
Dim str4() As String
...然后它们保持为String类型。为什么发生这种情况?
我有一个小的VBA子来读取工作表中命名范围(" UserInput")的输入,当到达特定字符串时,然后获取一些相邻数据并读入数组。当我在单独的行上声明变量时,它工作正常,但在我将它们组合时却不行(因为Split函数必须传递给String数组)。任何人都可以解释为什么str3和str4的变量类型会自动从String更改为Variant?
Dim var1(), var2() As Variant
Dim str1, str2, str3(), str4() As String
Dim Reach_step, Reach_upper(), ReachM() As Double
Dim iRowNum, j, k As Long
var1 = Range("UserInput")
str1 = "Reach_main"
iRowNum = 1
Do While var1(iRowNum, 1) <> str1
iRowNum = iRowNum + 1
Loop
str3 = Split(CStr(var1(iRowNum + 1, 2)), ",")
Reach_step = WorksheetFunction.Convert(CDbl(var1(iRowNum + 2, 2)), var1(iRowNum + 2, 3), "ft")
str4 = Split(CStr(var1(iRowNum + 3, 2)), ",")
在这种情况下&#34; UserInput&#34;是一个范围,包括左列中的一些名称(和空格)以及中间列中的一些逗号分隔数字(和空格)。
答案 0 :(得分:3)
这就是vba的工作原理:
使用:
Dim str1, str2, str3(), str4() As String
只有str4()
被声明为字符串,其他三个是变体。
你需要单独拼出每一个:
Dim str1 As String str2 As String, str3() As String, str4() As String
所以
Dim var1(), var2()
Dim str1 As String str2 As String, str3() As String, str4() As String
Dim Reach_step As Double, Reach_upper() As Double, ReachM() As Double
Dim iRowNum As Long, j As Long, k As Long
答案 1 :(得分:3)
如果你想要一行,那么你必须这样做:
Dim str1 As String, str2 As String, str3() As String, str4() As String
如果您没有指定,则为Variant
类型。
答案 2 :(得分:3)
问题出在VBA
Dim a, b, c As String
声明c As String
但a
和b
仍为Variant
。如果未指定类型,Excel始终采用Variant
。
它与写作相同:
Dim a
Dim b
Dim c As String
因此,如果您希望所有3都是字符串,则需要为每个变量指定一个类型:
Dim a As String, b As String, c As String
注意:强>
这与VB.NET不同,Dim a, b, c As String
将所有3声明为字符串。