Khai báo và khởi tạo chuỗi chuỗi trong VBA


126

Điều này sẽ hoạt động theo một bài viết tràn ngăn xếp khác nhưng nó không:

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

Bất cứ ai có thể cho tôi biết những gì là sai?


33
Lưu ý: Cú pháp dấu ngoặc nhọn KHÔNG hoạt động bên trong VBA, nó được thiết kế cho VB.NET. Đối với sự tỉnh táo của riêng bạn, đừng nhầm lẫn hai môi trường này.
boomer57

2
Nếu bạn đang sử dụng Excel (và bạn có nội dung với mảng Biến thể), bạn có thể sử dụngDim x() As Variant: x = [{"Value1", "Value2"}]
ThunderFrame

1
Đối với bất cứ ai nhìn vào bình luận này, gần hai năm sau (như tôi). Có vẻ như VBA / Excel KHÔNG thích cú pháp Dim x() As Variant: x = [{"Value1", "Value2"}] NẾU bạn đang sử dụng các biến ... tức là nếu v1 = "Value1"; v2 = "Value2", sau đó x = [{v1, v2}]sẽ tạo ra một lỗi, trong khi đó x = [{"Value1", "Value2"}]thì không.
Chip R.

Câu trả lời:


169

Thử cái này:

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

20
về mặt kỹ thuật tạo ra một mảng biến thể, không phải là một chuỗi chuỗi. Tất nhiên mảng biến thể có thể là một mảng chỉ các chuỗi, nhưng cách tiếp cận này cũng sẽ cho phép các kiểu dữ liệu không phải là chuỗi:myArray = Array("A", "B", 12345, "D"...)
David Zemens

10
Điều gì về Dim myStringArray () dưới dạng Chuỗi ... myStringArray = Array ("Cat", "Dog", "Rabbit"). Biến thể - yuck!
Andez

30
nếu bạn muốn có nó trong một dòng, bạn có thể sử dụng dấu hai chấm sau khi khai báo: Dim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",") Việc khởi tạo từ nhận xét ở trên không hiệu quả với tôi, vì Array () tạo ra một mảng biến thể và không phải là chuỗi
Andrej Sramko

6
không phải là một câu trả lời hay vì 1) đó là một biến thể chứa một mảng và 2) các biến thể là loại dữ liệu chậm nhất trong VBA
stifin

4
@stifin và 3) VBA không có trình khởi tạo mảng Chuỗi. Nhưng bạn có thể sử dụng Split chẳng hạn.
Eldar Agalarov

141

Trong trường hợp cụ thể của mảng Chuỗi, bạn có thể khởi tạo mảng bằng Hàm Chia vì nó trả về mảng Chuỗi thay vì mảng Biến:

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

Điều này cho phép bạn tránh sử dụng kiểu dữ liệu Biến thể và giữ nguyên kiểu mong muốn cho ArrayWsNames.


3
Điều này chắc chắn làm cho việc chuyển nó cùng với các chức năng khác sạch hơn; không đề cập đến việc tiết kiệm bộ nhớ của bạn ...
Jason R. Mick

23

Vấn đề ở đây là độ dài của mảng của bạn không được xác định và điều này làm VBA nhầm lẫn nếu mảng được xác định rõ ràng là một chuỗi. Các biến thể, tuy nhiên, dường như có thể thay đổi kích thước khi cần thiết (vì chúng có rất nhiều bộ nhớ và mọi người thường tránh chúng vì một loạt lý do).

Đoạn mã sau hoạt động tốt, nhưng nó hơi thủ công so với một số ngôn ngữ khác ngoài kia:

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)

Sau đó, bạn có thể làm một cái gì đó tĩnh như thế này:

myStringArray = { item_1, item_2, ... }

Hoặc một cái gì đó lặp đi lặp lại như thế này:

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

thí dụ:

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

kết quả:

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

thưởng thức

chỉnh sửa: tôi đã loại bỏ tính năng xóa trùng lặp và làm cho mã nhỏ hơn và dễ sử dụng hơn.


1
Đây phải là câu trả lời - mặc dù không có bất kỳ cách xây dựng nào để khởi tạo, chắc chắn một chức năng toàn cầu để làm điều này giữ cho mã có thể đọc được và nó không gây ra định nghĩa của bạn phải làvariant
Andez

-7

Sử dụng

Dim myarray As Variant

hoạt động nhưng

Dim myarray As String

không phải vì vậy tôi ngồi đến biến thể


8
Đó là bởi vì bạn nên thêm dấu ngoặc đơn vào cuối myarray. Các dấu ngoặc đơn cho VBA biết rằng đó là một mảng. Làm mờ như một chuỗi làm cho nó một mảng chỉ có Chuỗi.
PermaNoob

bạn phải khai báo các ràng buộc của mảng. Mảng động : Dim MyArray() as String, hoặc Mảng kích thước cố định : Dim MyArray(1 to 10) as String.
Patrick Lepelletier
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.