【问题标题】:Declare and Initialize String Array in VBA在 VBA 中声明和初始化字符串数组
【发布时间】:2013-10-22 13:03:01
【问题描述】:

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

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

谁能告诉我怎么回事?

【问题讨论】:

  • 注意:花括号语法在 VBA 中不起作用,它是为 VB.NET 设计的。为了您自己的理智,不要混淆这两种环境。
  • 如果您使用 Excel(并且您对 Variant 数组感到满意),您可以使用 Dim x() As Variant: x = [{"Value1", "Value2"}]
  • 对于几乎两年后看到此评论的任何人(如我)。似乎 VBA/Excel 不喜欢语法 Dim x() As Variant: x = [{"Value1", "Value2"}] 如果您使用的是变量...即如果 v1 = "Value1"; v2 = "Value2",则 x = [{v1, v2}] 会产生错误,而 x = [{"Value1", "Value2"}] 不会。

标签: arrays vba initialization


【解决方案1】:

试试这个:

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

【讨论】:

  • 技术上 创建一个变体数组,而不是字符串数组。当然,变体数组可能是一个只有字符串的数组,但这种方法也允许非字符串数据类型:myArray = Array("A", "B", 12345, "D"...)
  • Dim myStringArray() As String ... myStringArray = Array( "Cat", "Dog" , "Rabbit") 怎么样。变种 - 糟糕!
  • 如果你想把它放在一行,你可以在声明后使用冒号:Dim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",") 上面评论的初始化对我不起作用,因为 Array() 创建了一个变体数组而不是字符串
  • 不是一个好的答案,因为 1) 它是一个变体 包含 一个数组,并且 2) 变体是 VBA 中最慢的数据类型
  • @stifin 和 3) VBA 没有字符串数组初始值设定项。但是你可以使用 Split 例如。
【解决方案2】:

使用

Dim myarray As Variant

有效但

Dim myarray As String

所以我不喜欢 Variant

【讨论】:

  • 那是因为你应该在 myarray 的末尾添加括号。括号让 VBA 知道它是一个数组。作为字符串变暗使其成为纯字符串数组。
  • 你必须声明数组的边界。动态数组:Dim MyArray() as String,或固定大小的数组:Dim MyArray(1 to 10) as String
【解决方案3】:

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

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

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

【讨论】:

  • 这绝对可以让传递给其他函数更简洁;更不用说节省你的记忆......
【解决方案4】:

这里的问题是你的数组的长度是未定义的,如果数组被显式定义为字符串,这会使 VBA 感到困惑。然而,变体似乎能够根据需要调整大小(因为它们占用了大量内存,人们通常出于各种原因避免使用它们)。

以下代码运行良好,但与其他一些语言相比,它有点手动:

Dim SomeArray(3) As String

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

【讨论】:

  • 所以在数组声明中我们没有定义大小 (4) 而是定义最高索引 (3)?我理解对了吗?
【解决方案5】:
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

【讨论】:

    【解决方案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
    

    示例:

    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
    【解决方案7】:

    一个唯一需要的函数,它的工作方式与 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
    

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多