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

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

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

有人能告诉我出什么事了吗?

808765 次浏览

试试这个:

' Variant array
Dim myVariantArray As Variant
myVariantArray = Array("Cat", "Dog", "Rabbit")


' String array
Dim myStringArray() As String
myStringArray = Split("Cat,Dog,Rabbit", ",")

吸毒

Dim myarray As Variant

工作,但

Dim myarray As String

所以我选择了 Variant

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

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

好好享受吧!

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

一个“只需要什么”的函数,它的工作方式与 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 中如何将 Variant 转换为 Double 格式,反之亦然

功能分析法

使用相同的解决方案作为 @ matan _ just me@ mark _ e,我认为结构可以清理了一点。

就像内置的函数 Array一样,我们可以构建自己的定制函数,该函数使用 ParamArray接受一个项数组作为参数,并返回一个 String Array。

默认情况下,当为字符串数组赋值时,它将隐式地将任何非字符串值转换为字符串。

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值的 Array,我们只需要更改 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

其他数据类型的例子包括:

  • 单身
  • 双倍
  • 日期

当一个值不是正确的数据类型且无法转换时,将抛出一个错误,您将收到一个 Run-time error '13': Type mismatch错误。