Deklarasikan dan Inisialisasi String Array di VBA

126

Ini harus bekerja sesuai dengan posting stack overflow lain tetapi tidak:

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

Adakah yang bisa memberi tahu saya apa yang salah?

Kairan
sumber
33
Catatan: Sintaks kurung kurawal TIDAK bekerja di dalam VBA, ini dirancang untuk VB.NET. Untuk kewarasan Anda sendiri, jangan bingung dua lingkungan ini.
boomer57
2
Jika Anda menggunakan Excel (dan Anda puas dengan array Variant), Anda dapat menggunakanDim x() As Variant: x = [{"Value1", "Value2"}]
ThunderFrame
1
Bagi siapa saja yang melihat komentar ini, hampir dua tahun kemudian (seperti saya). Tampaknya VBA / Excel TIDAK suka sintaks Dim x() As Variant: x = [{"Value1", "Value2"}] JIKA Anda menggunakan variabel ... yaitu jika v1 = "Value1"; v2 = "Value2", maka x = [{v1, v2}]akan menghasilkan kesalahan, sedangkan x = [{"Value1", "Value2"}]tidak akan.
Chip R.

Jawaban:

169

Coba ini:

Dim myarray As Variant
myarray = Array("Cat", "Dog", "Rabbit")
Eldar Agalarov
sumber
20
secara teknis membuat array varian, bukan array string. Tentu saja array varian mungkin array hanya string, tetapi pendekatan ini juga akan memungkinkan tipe data non-string:myArray = Array("A", "B", 12345, "D"...)
David Zemens
10
Bagaimana dengan Dim myStringArray () As String ... myStringArray = Array ("Cat", "Dog", "Rabbit"). Varian - yuck!
Andez
30
jika Anda ingin memilikinya dalam satu baris, Anda dapat menggunakan titik dua setelah deklarasi: Dim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",") Inisialisasi dari komentar di atas tidak berfungsi untuk saya, karena Array () menciptakan Array of Variants dan bukan Strings
Andrej Sramko
6
bukan jawaban yang baik karena 1) itu adalah varian yang mengandung array dan 2) varian adalah tipe data paling lambat di VBA
stifin
4
@stifin dan 3) VBA tidak memiliki initializer array String. Tapi Anda bisa menggunakan Split misalnya.
Eldar Agalarov
141

Dalam kasus spesifik array String Anda dapat menginisialisasi array menggunakan Fungsi Split karena mengembalikan array String daripada array Variant:

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

Ini memungkinkan Anda untuk menghindari menggunakan tipe data Variant dan mempertahankan tipe yang diinginkan untuk arrWsNames.

Aiken
sumber
3
Ini jelas membuat meneruskannya ke fungsi lain lebih bersih; belum lagi menghemat memori Anda ...
Jason R. Mick
23

Masalahnya di sini adalah bahwa panjang array Anda tidak terdefinisi, dan ini membingungkan VBA jika array secara eksplisit didefinisikan sebagai string. Varian, bagaimanapun, tampaknya dapat mengubah ukuran sesuai kebutuhan (karena mereka memiliki banyak memori, dan orang-orang umumnya menghindarinya karena banyak alasan).

Kode berikut berfungsi dengan baik, tetapi sedikit manual dibandingkan dengan beberapa bahasa lain di luar sana:

Dim SomeArray(3) As String

SomeArray(0) = "Zero"
SomeArray(1) = "One"
SomeArray(2) = "Two"
SomeArray(3) = "Three"
David Wilson
sumber
3
Dim myStringArray() As String
*code*
redim myStringArray(size_of_your_array)

Maka Anda dapat melakukan sesuatu yang statis seperti ini:

myStringArray = { item_1, item_2, ... }

Atau sesuatu yang berulang seperti ini:

Dim x
For x = 0 To size_of_your_array
    myStringArray(x) = data_source(x).Name
Next x
Andrew Slentz
sumber
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

contoh:

Dim TT() As String
TT = CreateTextArrayFromSourceTexts("hi", "bye", "hi", "bcd", "bYe")

hasil:

TT(0)="hi"
TT(1)="bye"
TT(2)="hi"
TT(3)="bcd"
TT(4)="bYe"

Nikmati

sunting: saya menghapus fitur menghapus duplikat dan membuat kode lebih kecil dan lebih mudah digunakan.

matan justme
sumber
1
Ini harus menjadi jawaban - meskipun tidak ada cara untuk menginisialisasi, pasti fungsi global untuk melakukan hal ini membuat kode tetap dapat dibaca dan tidak menimbulkan definisi Anda harus menjadivariant
Andez
-7

Menggunakan

Dim myarray As Variant

bekerja tetapi

Dim myarray As String

tidak jadi saya sitck ke Variant

Keith Kenny
sumber
8
Itu karena Anda harus menambahkan tanda kurung di akhir myarray. Tanda kurung memungkinkan VBA tahu bahwa itu adalah array. Peredupan sebagai string menjadikannya hanya array String.
PermaNoob
Anda harus mendeklarasikan batasan array. Entah Array dinamis: Dim MyArray() as String, atau ukuran Array tetap: Dim MyArray(1 to 10) as String.
Patrick Lepelletier