根据另一个Stack Overflow的帖子,这应该可以工作,但事实并非如此:
Dim arrWsNames As String() = {"Value1", "Value2"}
有没有人能告诉我错在哪里?
根据另一个Stack Overflow的帖子,这应该可以工作,但事实并非如此:
Dim arrWsNames As String() = {"Value1", "Value2"}
有没有人能告诉我错在哪里?
试试这个:
' Variant array
Dim myVariantArray As Variant
myVariantArray = Array("Cat", "Dog", "Rabbit")
' String array
Dim myStringArray() As String
myStringArray = Split("Cat,Dog,Rabbit", ",")
myArray = Array("A", "B", 12345, "D"...)
- David ZemensDim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",")
。上面的注释中的初始化对我没有用,因为Array()创建的是一个Variant数组而不是字符串数组。 - Andrej Sramko对于字符串数组的特定情况,您可以使用Split Function初始化该数组,因为它返回的是字符串数组而不是变体数组:
Dim arrWsNames() As String
arrWsNames = Split("Value1,Value2,Value3", ",")
这样可以避免使用Variant数据类型,同时保留arrWsNames所需的类型。
问题在于数组的长度未定义,如果将数组明确定义为字符串,这会使VBA混淆。然而,变量似乎可以根据需要调整大小(因为它们占用了大量内存,人们通常出于很多原因而避免使用它们)。
以下代码完全正常运行,但与其他语言相比有点过时:
Dim SomeArray(3) As String
SomeArray(0) = "Zero"
SomeArray(1) = "One"
SomeArray(2) = "Two"
SomeArray(3) = "Three"
Public Function _
CreateTextArrayFromSourceTexts(ParamArray SourceTexts() As Variant) As String()
ReDim TargetTextArray(0 To UBound(SourceTexts)) As String
For SourceTextsCellNumber = 0 To UBound(SourceTexts)
TargetTextArray(SourceTextsCellNumber) = SourceTexts(SourceTextsCellNumber)
Next SourceTextsCellNumber
CreateTextArrayFromSourceTexts = TargetTextArray
End Function
例子:
Dim TT() As String
TT = CreateTextArrayFromSourceTexts("hi", "bye", "hi", "bcd", "bYe")
结果:
TT(0)="hi"
TT(1)="bye"
TT(2)="hi"
TT(3)="bcd"
TT(4)="bYe"
享受吧!
编辑: 我删除了重复文本删除功能,并使代码更小更易于使用。
variant
。 - AndezDim myStringArray() As String
*code*
redim myStringArray(size_of_your_array)
myStringArray = { item_1, item_2, ... }
Dim x
For x = 0 To size_of_your_array
myStringArray(x) = data_source(x).Name
Next x
这是一个仅提取所需内容的函数,它与array()函数类似,但返回字符串类型。在使用之前,您需要先将数组声明为字符串类型,如下所示:
Sub UseStringArray()
Dim sample() As String
sample = StringArray("dog", "cat", "horse")
End Sub
Function StringArray(ParamArray ArgList())
ReDim tempArray(UBound(ArgList)) As String
For i = 0 To UBound(ArgList)
tempArray(i) = ArgList(i)
Next
StringArray = tempArray
End Function
更多有关转换数组类型的信息请参见此处:如何在VBA中将变体转换为双精度格式,反之亦然
使用与 @matan_justme 和 @mark_e 相同的解决方案,我认为可以清理结构。
就像内置函数 Array
一样,我们可以构建自己的自定义函数,使用 ParamArray
来接受作为参数的数组,并返回一个字符串数组。
默认情况下,将值分配给字符串数组时,它将隐式地将任何非字符串值转换为字符串。
Public Function StringArray(ParamArray values() As Variant) As String()
Dim temp() As String
ReDim temp(LBound(values) To UBound(values))
Dim index As Long
For index = LBound(temp) To UBound(temp)
temp(index) = values(index)
Next
StringArray = temp
End Function
这个结构的好处是可以应用于不同的数据类型,并使用直观的命名约定。例如,如果我们需要一个包含Long
值的数组,只需更改每个实例中出现的String
即可。
Public Function LongArray(ParamArray values() As Variant) As Long()
Dim temp() As Long
ReDim temp(LBound(values) To UBound(values))
Dim index As Long
For index = LBound(temp) To UBound(temp)
temp(index) = values(index)
Next
LongArray = temp
End Function
其他数据类型的示例可能包括:
美妙之处在于,当一个值不是正确的数据类型且无法转换时,会抛出一个错误,您将收到一个运行时错误'13':类型不匹配
的错误。
使用
Dim myarray As Variant
可以工作但是...
Dim myarray As String
不行,所以我坚持使用 Variant。
Dim MyArray() as String
,或者使用固定大小的数组:Dim MyArray(1 to 10) as String
。 - Patrick Lepelletier
Dim x() As Variant: x = [{"Value1", "Value2"}]
。 - ThunderFrameDim x() As Variant: x = [{"Value1", "Value2"}]
。 如果你使用变量,即如果v1 =" Value1"; v2 =" Value2"
,那么x = [{v1,v2}]
将会生成一个错误,而x = [{"Value1","Value2"}]
则不会。 - Chip R.