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

Kai*_*ran 119 arrays vba initialization

这应该根据另一个堆栈溢出帖子工作,但它不是:

Dim arrWsNames As String() = {"Value1", "Value2"}
Run Code Online (Sandbox Code Playgroud)

任何人都可以让我知道什么是错的?

Eld*_*rov 163

试试这个:

Dim myarray As Variant
myarray = Array("Cat", "Dog", "Rabbit")
Run Code Online (Sandbox Code Playgroud)

  • 如果你想让它在一行中,你可以在声明后使用冒号:```Dim arrWsNames()As String:arrWsNames = Split("Value1,Value2",",")```来自注释的初始化上面对我不起作用,因为Array()创建了一个Variants数组,而不是字符串 (29认同)
  • *技术上*创建变量数组,而不是字符串数组.当然变量数组*可能只是一个字符串数组,但这种方法也允许非字符串数据类型:`myArray = Array("A","B",12345,"D"......)` (19认同)
  • 怎么样Dim myStringArray()As String ... myStringArray = Array("Cat","Dog","Rabbit").变种 - 哎呀! (10认同)
  • 不是一个好的答案1)它是一个变种_containing_数组和2)变体是VBA中最慢的数据类型 (5认同)
  • @stifin和3)VBA没有String数组初始值设定项.但是你可以使用Split作为例子. (4认同)
  • @Andez:如果 `Dim a() As String ... a = Array(...)` 有效,那就太好了,但它不起作用——这是一个类型不匹配错误......不幸的是没有好的方法在 VBA 中执行此操作。 (2认同)
  • @Nickolay确实……不确定4年前我在哪里尝试过。尽管“ matan justme”的答案已被标记下来-这是我在阅读此内容之前所做的。他的回答有效。您可以有一个全局函数来执行此初始化,而无需使用Variant作为定义的类型,尽管我将函数命名为StringArray,但这使可读性更高。那就是我选择的答案。 (2认同)

Aik*_*ken 126

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

Dim arrWsNames() As String
arrWsNames = Split("Value1,Value2,Value3", ",")
Run Code Online (Sandbox Code Playgroud)

这允许您避免使用Variant数据类型并保留arrWsNames的所需类型.

  • 这绝对会使其传递给其他更清洁的功能; 更不用说拯救你的记忆...... (2认同)

Dav*_*son 21

这里的问题是数组的长度是未定义的,如果数组被明确定义为字符串,这会混淆VBA.然而,变体似乎能够根据需要调整大小(因为它们占用了大量内存,人们通常会因为一系列原因而避免使用它们).

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

Dim SomeArray(3) As String

SomeArray(0) = "Zero"
SomeArray(1) = "One"
SomeArray(2) = "Two"
SomeArray(3) = "Three"
Run Code Online (Sandbox Code Playgroud)


小智 6

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
Run Code Online (Sandbox Code Playgroud)

例子:

Dim TT() As String
TT = CreateTextArrayFromSourceTexts("hi", "bye", "hi", "bcd", "bYe")
Run Code Online (Sandbox Code Playgroud)

结果:

TT(0)="hi"
TT(1)="bye"
TT(2)="hi"
TT(3)="bcd"
TT(4)="bYe"
Run Code Online (Sandbox Code Playgroud)

享受!

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


小智 5

Dim myStringArray() As String
*code*
redim myStringArray(size_of_your_array)
Run Code Online (Sandbox Code Playgroud)

然后你可以做一些静态的事情:

myStringArray = { item_1, item_2, ... }
Run Code Online (Sandbox Code Playgroud)

或者像这样的迭代:

Dim x
For x = 0 To size_of_your_array
    myStringArray(x) = data_source(x).Name
Next x
Run Code Online (Sandbox Code Playgroud)