VBA'da Dize Dizisini Bildirin ve Başlatın


126

Bu, başka bir yığın taşma gönderisine göre çalışmalı, ancak değil:

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

Biri bana neyin yanlış olduğunu söyleyebilir mi?


33
Not: Küme parantezi sözdizimi VBA içinde çalışmaz, VB.NET için tasarlanmıştır. Kendi akıl sağlığınız için, bu iki ortamı karıştırmayın.
boomer57

2
Excel kullanıyorsanız (ve bir Varyant dizisinden Dim x() As Variant: x = [{"Value1", "Value2"}]
memnunsanız

1
Bu yoruma bakan herkes için, neredeyse iki yıl sonra (benim gibi). Görünüşe göre VBA / Excel, Dim x() As Variant: x = [{"Value1", "Value2"}] değişkenler kullanıyorsanız EĞER sözdizimini sevmiyor ... yani eğer v1 = "Value1"; v2 = "Value2", o x = [{v1, v2}]zaman bir hata oluşturacak, oysa x = [{"Value1", "Value2"}]olmayacak.
Chip R.

Yanıtlar:


170

Bunu dene:

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

20
teknik olarak bir dize dizisi değil, bir değişken dizisi oluşturur. Elbette, varyant dizisi yalnızca dizelerden oluşan bir dizi olabilir , ancak bu yaklaşım aynı zamanda dize olmayan veri türlerine de izin verir:myArray = Array("A", "B", 12345, "D"...)
David Zemens

10
Dim myStringArray () As String ... myStringArray = Array ("Kedi", "Köpek", "Tavşan"). Varyantlar - yuck!
Andez

30
Eğer bir satırda olmasını istiyorsanız, bildirimden sonra iki nokta üst üste kullanabilirsiniz: Dim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",") Yukarıdaki açıklamadan başlatma benim için çalışmıyor, çünkü Array () Dizeler değil bir Varyantlar Dizisi yaratıyor
Andrej Sramko

6
1) bu bir dizi içeren bir varyant ve 2) varyantlar
VBA'daki

4
@stifin ve 3) VBA'da String dizisi başlatıcısı yoktur. Ancak örneğin Split'i kullanabilirsiniz.
Eldar Agalarov

142

Bir String dizisinin özel durumunda, diziyi bir Variant dizisi yerine bir String dizisi döndürdüğü için Bölme İşlevini kullanarak başlatabilirsiniz:

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

Bu, Variant veri türünü kullanmaktan kaçınmanıza ve arrWsNames için istenen türü korumanıza olanak tanır.


3
Bu kesinlikle onu diğer işlevlere aktarmayı daha temiz hale getirir; hafızanızı
Jason R. Mick

23

Buradaki sorun, dizinizin uzunluğunun tanımsız olmasıdır ve dizi açıkça bir dizge olarak tanımlanmışsa bu VBA'nın kafasını karıştırır. Bununla birlikte, varyantlar gerektiği gibi yeniden boyutlandırılabiliyor gibi görünüyor (çünkü bir sürü hafızaya sahipler ve insanlar genellikle birkaç nedenden dolayı onlardan kaçınıyorlar).

Aşağıdaki kod gayet iyi çalışıyor, ancak diğer bazı dillere kıyasla biraz manuel:

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)

Sonra bunun gibi statik bir şey yapabilirsiniz:

myStringArray = { item_1, item_2, ... }

Veya bunun gibi yinelemeli bir şey:

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

misal:

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

sonuç:

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

zevk almak

düzenleme: Yinelenen metin silme özelliğini kaldırdım ve kodu daha küçük ve kullanımı daha kolay hale getirdim.


1
Cevap bu olmalı - başlatmanın herhangi bir yerleşik yolu olmamasına rağmen, kesinlikle bunu yapacak global bir işlev kodu okunabilir tutar ve tanımınızın bir olması gerektiği anlamına variant
gelmez

-7

kullanma

Dim myarray As Variant

çalışıyor ama

Dim myarray As String

öyle değil Variant'a


8
Bunun nedeni, dizimin sonuna parantez eklemeniz gerektiğidir. Parantezler, VBA'nın bunun bir dizi olduğunu bilmesini sağlar. Bir dizge olarak karartma, onu yalnızca dizeden oluşan bir dizi yapar.
PermaNoob

dizinin sınırlarını belirtmeniz gerekir. Dinamik Dizi Ya: Dim MyArray() as Stringya sabit bir boyut Dizisi: Dim MyArray(1 to 10) as String.
Patrick Lepelletier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.