ประกาศและเริ่มต้น String Array ใน VBA


126

สิ่งนี้ควรทำงานตามโพสต์ล้นสแต็กอื่น แต่ไม่ใช่:

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

ใครสามารถแจ้งให้เราทราบว่ามีอะไรผิดพลาด?


33
หมายเหตุ: ไวยากรณ์วงเล็บปีกกาใช้ไม่ได้ใน VBA ซึ่งออกแบบมาสำหรับ VB.NET เพื่อความมีสติสัมปชัญญะของคุณเองอย่าทำให้ทั้งสองสภาพแวดล้อมสับสน
boomer57

2
หากคุณใช้ Excel (และคุณพอใจกับอาร์เรย์ Variant) คุณสามารถใช้Dim x() As Variant: x = [{"Value1", "Value2"}]
ThunderFrame

1
สำหรับใครก็ตามที่ดูความคิดเห็นนี้เกือบสองปีต่อมา (เช่นฉัน) ดูเหมือนว่า VBA / Excel จะไม่ชอบไวยากรณ์Dim x() As Variant: x = [{"Value1", "Value2"}] หากคุณกำลังใช้ตัวแปร ... กล่าวคือถ้าv1 = "Value1"; v2 = "Value2"จากนั้นx = [{v1, v2}]จะสร้างข้อผิดพลาดในขณะที่x = [{"Value1", "Value2"}]จะไม่
ชิปอาร์

คำตอบ:


170

ลองสิ่งนี้:

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

20
ในทางเทคนิคจะสร้างอาร์เรย์ตัวแปรไม่ใช่อาร์เรย์สตริง แน่นอนอาร์เรย์ตัวแปรอาจเป็นอาร์เรย์ของสตริงเท่านั้น แต่วิธีนี้จะอนุญาตประเภทข้อมูลที่ไม่ใช่สตริงด้วยเช่นกัน:myArray = Array("A", "B", 12345, "D"...)
David Zemens

10
แล้ว Dim myStringArray () As String ... myStringArray = Array ("Cat", "Dog", "Rabbit") ล่ะ สายพันธุ์ - แตก!
Andez

30
หากคุณต้องการมีในบรรทัดเดียวคุณสามารถใช้เครื่องหมายจุดคู่หลังจากการประกาศ: Dim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",") การเริ่มต้นจากความคิดเห็นด้านบนไม่ได้ผลสำหรับฉันเพราะ Array () สร้าง Array of Variants ไม่ใช่ Strings
Andrej Sramko

6
ไม่ใช่คำตอบที่ดีเนื่องจาก 1) เป็นตัวแปรที่มีอาร์เรย์และ 2) ตัวแปรเป็นประเภทข้อมูลที่ช้าที่สุดใน VBA
stifin

4
@stifin และ 3) VBA ไม่มีตัวเริ่มต้นอาร์เรย์สตริง แต่คุณสามารถใช้ Split ได้เช่นกัน
Eldar Agalarov

142

ในกรณีเฉพาะของอาร์เรย์สตริงคุณสามารถเริ่มต้นอาร์เรย์โดยใช้ฟังก์ชัน Splitเนื่องจากส่งคืนสตริงอาร์เรย์แทนที่จะเป็นอาร์เรย์ Variant:

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

สิ่งนี้ช่วยให้คุณหลีกเลี่ยงการใช้ชนิดข้อมูลตัวแปรและรักษาประเภทที่ต้องการสำหรับ arrWsNames


3
สิ่งนี้ทำให้การส่งผ่านไปยังฟังก์ชันอื่น ๆ สะอาดขึ้นอย่างแน่นอน ไม่ต้องพูดถึงการบันทึกความทรงจำของคุณ ...
Jason

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

ฉันไม่คิดว่า Variant


8
นั่นเป็นเพราะคุณควรเพิ่มวงเล็บที่ส่วนท้ายของ myarray วงเล็บช่วยให้ VBA รู้ว่าเป็นอาร์เรย์ การลดแสงเป็นสตริงทำให้เป็นอาร์เรย์แบบสตริงเท่านั้น
PermaNoob

คุณต้องประกาศขอบเขตของอาร์เรย์ ทั้งอาร์เรย์แบบไดนามิก: หรืออาร์เรย์ขนาดคงที่:Dim MyArray() as String Dim MyArray(1 to 10) as String
Patrick Lepelletier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.