web-dev-qa-db-ja.com

VBAでの文字列配列の宣言と初期化

これは別のスタックオーバーフローポストに従って動作するはずですが、そうではありません:

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

誰が私に何が悪いのかを教えてもらえますか?

113
Kairan

これを試して:

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

String配列の特定のケースでは、Variant配列ではなくString配列を返すので、 分割関数 を使用して配列を初期化できます。

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

これにより、Variantデータ型の使用を避け、arrWsNamesに必要な型を保持することができます。

120
Aiken

ここでの問題は、あなたの配列の長さが定義されていないということです。そして、配列が文字列として明示的に定義されていると、これはVBAを混乱させます。ただし、バリアントは必要に応じてサイズを変更できるようです(多くのメモリを占有するため、一般的には多くの理由で回避されます)。

次のコードはうまく動作しますが、他のいくつかの言語と比べると少しマニュアルです。

Dim SomeArray(3) As String

SomeArray(0) = "Zero"
SomeArray(1) = "One"
SomeArray(2) = "Two"
SomeArray(3) = "Three"
19
David Wilson
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
Andrew Slentz
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"

楽しい

編集:私は機能を削除する重複テキストを削除し、コードを小さくして使いやすくしました。

2
matan justme