在VBA中声明和初始化字符串数组


126

这应该根据另一个堆栈溢出后的工作,但不是:

Dim arrWsNames As String() = {"Value1", "Value2"}

谁能让我知道怎么了?


33
注意:花括号语法在VBA中不起作用,它是为VB.NET设计的。为了您自己的理智,请不要混淆这两种环境。
boomer57 2014年

2
如果您使用的是Excel(并且对Variant数组感到满意),则可以使用Dim x() As Variant: x = [{"Value1", "Value2"}]
ThunderFrame

1
对于正在查看此评论的任何人,将近两年后(像我一样)。Dim x() As Variant: x = [{"Value1", "Value2"}] 如果您正在使用变量v1 = "Value1"; v2 = "Value2",则似乎VBA / Excel不喜欢该语法……即,如果,x = [{v1, v2}]则会生成错误,而x = [{"Value1", "Value2"}]不会。
Chip R.18年

Answers:


169

试试这个:

Dim myarray As Variant
myarray = Array("Cat", "Dog", "Rabbit")

20
从技术上讲,它创建一个变量数组,而不是字符串数组。当然,变量数组可以是仅包含字符串的数组,但是这种方法还允许使用非字符串数据类型:myArray = Array("A", "B", 12345, "D"...)
David Zemens 2014年

10
那么将昏暗的myStringArray()作为字符串呢... myStringArray = Array(“ Cat”,“ Dog”,“ Rabbit”)。变体-uck!
Andez 2014年

30
如果您希望将其放在一行中,则可以在声明后使用冒号: Dim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",") 上面注释中的初始化对我不起作用,因为Array()创建的是变量而不是字符串的数组
Andrej Sramko 2014年

6
不好的回答,因为1)这是一个包含数组的变量并且2)变量是VBA中最慢的数据类型
stifin 2016年

4
@stifin和3)VBA没有String数组初始化程序。但是您可以使用“拆分”作为示例。
Eldar Agalarov

141

在String数组的特定情况下,您可以使用Split Function初始化该数组,因为它返回String数组而不是Variant数组:

Dim arrWsNames() As String
arrWsNames = Split("Value1,Value2,Value3", ",")

这样可以避免使用Variant数据类型,并为arrWsNames保留所需的类型。


3
这无疑使它更干净地传递给其他功能。更不用说节省您的记忆了……
Jason R. Mick

23

这里的问题是数组的长度是不确定的,如果将数组显式定义为字符串,则会使VBA感到困惑。但是,变体似乎可以根据需要调整大小(因为它们占用大量内存,并且人们出于多种原因通常会避免使用它们)。

以下代码可以正常工作,但是与其他一些语言相比,它有点手动:

Dim SomeArray(3) As String

SomeArray(0) = "Zero"
SomeArray(1) = "One"
SomeArray(2) = "Two"
SomeArray(3) = "Three"

3
Dim 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

3
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"

请享用

编辑:我删除了重复的文本删除功能,并使代码更小,更易于使用。


1
这应该是答案-尽管没有内置的初始化方法,但可以肯定的是,这样做的全局函数可以使代码保持可读性,并且不会导致您的定义必须是variant
Andez

-7

使用

Dim myarray As Variant

起作用但是

Dim myarray As String

不,所以我坐到变体


8
那是因为您应该在myarray的末尾添加括号。括号使VBA知道它是一个数组。调暗为字符串使其成为仅字符串数组。
PermaNoob 2015年

您必须声明数组的边界。无论是动态阵列:Dim MyArray() as String或固定大小的数组:Dim MyArray(1 to 10) as String
Patrick Lepelletier
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.