VBAで文字列配列を宣言して初期化する


126

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

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

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


33
注:中括弧の構文はVBA内では機能しません。VB.NET用に設計されています。自分の正気のために、これら2つの環境を混同しないでください。
boomer57 2014年

2
Excelを使用している(そしてVariant配列のコンテンツを使用している)場合は、次を使用できますDim x() As Variant: x = [{"Value1", "Value2"}]
ThunderFrame

1
このコメントを見ている人のために、ほぼ2年後(私のように)。Dim x() As Variant: x = [{"Value1", "Value2"}] 変数を使用している場合v1 = "Value1"; v2 = "Value2"、VBA / Excelは構文が気に入らないようです...つまりの場合、x = [{v1, v2}]エラーが生成されますが、そうでx = [{"Value1", "Value2"}]はありません。
チップ

回答:


169

これを試して:

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

20
技術的には、文字列配列ではなく、バリアント配列を作成します。もちろん、バリアント配列は、可能性があるだけで、文字列の配列であるが、このアプローチは、非文字列データ型を可能にする:myArray = Array("A", "B", 12345, "D"...)
デビッドZemens

10
Dim myStringArray()As String ... myStringArray = Array( "Cat"、 "Dog"、 "Rabbit")はどうですか?バリエーション-やった!
アンデス

30
1行にしたい場合は、宣言の後にコロンを使用できます Dim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",")
。Array

6
1)配列を含むバリアントであり、2)バリアントはVBAで最も遅いデータ型である
stifin

4
@stifinおよび3)VBAにはString配列初期化子がありません。ただし、たとえばSplitを使用できます。
Eldar Agalarov 2016

141

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

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

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


3
これは間違いなくそれを他の関数に渡すことをきれいにします。あなたのメモリを節約することは言うまでもありません...
ジェイソンR.ミック

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 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.