2012-04-24 64 views
7

Tôi có một hàm trong VBA tạo ra một chuỗi các chuỗi. Nó hoạt động tốt khi được gọi từ một hàm VBA khác, nhưng không phải khi được gọi từ bảng tính.Chức năng mảng trong Excel VBA

Sau đây là cách nó nên được sử dụng:

  • chọn A1: A3
  • ghi trong thanh công thức =Test(), sau đó nhấn Ctrl-Shift-Enter để làm cho nó một hàm mảng
  • A1 nên chứa A, A2 nên chứa B và A3 phải chứa C

Khi tôi thực sự thử điều này, nó pu ts A trong cả ba ô của mảng. Làm thế nào tôi có thể lấy dữ liệu được trả về bởi Test vào các ô khác nhau của mảng?


Đối với những người muốn xem, đây là mã của hàm. Hãy nhớ, chức năng hoạt động tốt khi được gọi từ các chức năng khác.

Function Test() As String() 
    Dim a(1 To 3) As String 
    a(1) = "A" 
    a(2) = "B" 
    a(3) = "C" 
    Test = a 
End Function 

Trả lời

8

Chức năng của bạn hoạt động tốt nếu bạn chuyển dữ liệu. Để làm điều này, bạn cần Variant() thay vì String():

Function Test() As Variant() 
    Dim a(1 To 3) As Variant 
    a(1) = "A" 
    a(2) = "B" 
    a(3) = "C" 
    Test = Application.Transpose(a) 
End Function 
+1

Tôi không biết rằng hướng mặc định của một mảng ở bên phải, chứ không phải là xuống. – Joe

+0

Unfortunatelly, có vẻ như không phải là một cách tự động đơn giản cho Excel để điền vào mảng ngang hoặc dọc. Có thể có một số thủ thuật ra khỏi đó, tuy nhiên. –

+0

Yup, như @andy holaday chỉ ra, Chip Pearson cũng đã tìm ra tình trạng khó xử ngang/dọc. –

0

Chỉ cần tìm ra vấn đề - kích thước đầu tiên của một mảng đi từ VBA sang Excel là ngang, không thẳng đứng. Để xem đầu ra của Test, hãy đặt hàm mảng =Test() trong A1: C1 (không phải A1: A3).

+0

Đọc trả lời này kết hợp với một từ Charles Williams trên là một chút bối rối, mặc dù cả hai đúng. Mảng VBA 1D được chuyển tới Excel dưới dạng một hàng đơn (như được thấy trong bản kiểm tra UDF gốc). Một mảng VBA 2D được truyền với thứ nguyên đầu tiên trong một cột (như đã thấy trong bài kiểm tra UDF được đăng bởi Charles). –

4

Bạn có thể muốn kiểm tra Chip Pearson's advice on returning an array from a UDF.

Đây là câu trả lời đầu tiên của tôi ở đây. Tôi hy vọng điều này không phù hợp.

+0

Nó không bao giờ sai khi tham khảo trang web của Chip Pearson. Ít nhất tôi hy vọng không, như tôi làm tất cả các thời gian! +1 –

3

tôi thấy nó đơn giản nhất để luôn luôn làm việc với mảng 2 chiều, sau đó bạn không cần phải transpose vv

Function Test() As String() 
    Dim a(1 To 3, 1) As String 
    a(1, 1) = "A" 
    a(2, 1) = "B" 
    a(3, 1) = "C" 
    Test = a 
End Function 
Các vấn đề liên quan