2009-05-11 21 views
5

Sử dụng chức năng này rất đơn giản:Trong VBA, làm thế nào để trả về một mảng/hoặc ghi vào các ô bằng cách sử dụng một hàm?

Function WriteArray() as Variant 
Dim array(0 To 2) 
array(0) = "A" 
array(1) = "B" 
array(2) = "C" 
WriteArray = array 
End Function 

Tôi đã chờ đợi để xem kết quả trong toàn bộ mảng trong bảng tính Excel của tôi, nhưng đó không phải là trường hợp: Tôi chỉ nhận được chuỗi đầu tiên. Tôi biết có mẹo để hiển thị toàn bộ mảng trong bảng tính (bằng cách chọn một dải ô có công thức + F2 + CTRL + SHIFT + ENTER), nhưng tôi muốn VBA xử lý tất cả.

Tôi cũng đã cố gắng sử dụng biến Application.Caller để viết trực tiếp trong phạm vi "Người gọi" nhưng ngắt mã.

Cảm ơn rất nhiều sự giúp đỡ của bạn!

EDIT: Dưới đây là một đoạn code tôi cố gắng sử dụng:

Function WriteArray() As Variant 
    Dim arr(0 To 2) 
    arr(0) = "A" 
    arr(1) = "B" 
    arr(2) = "C" 
    WriteArray = arr 
    Dim StartRow, i As Integer 
    For i = 0 To UBound(arr) 
     Range("A" & i).Value = arr(i) 
    Next 
End Function 

Nó phá vỡ tại dòng "Range (" A "& i) .Value = arr (i)". Excel của tôi có bị hỏng không ?!

Trả lời

6

Các mã sau đây viết mảng tới một loạt các tế bào đẹp:

Function WriteArray() As Variant 
    Dim AbcList(0 To 2) as Variant 
    AbcList(0) = "A" 
    AbcList(1) = "B" 
    AbcList(2) = "C" 
    WriteArray = AbcList 
End Function 

Function WriteArrayToSpreadsheet() 
    Dim MyArray As Variant 
    MyArray = WriteArray() 

    Dim StartRow, i As Integer 
    StartRow = 1 
    For i = 0 To UBound(MyArray) 
     Range("A" & i + StartRow).Value = MyArray(i) 
    Next 
End Function 

Điều đó đang được nói, tôi muốn xem một phần của mã nơi bạn đang thực sự cố gắng để làm cho nó vào bảng tính, không phải nơi bạn xây dựng mảng. Sau đó, tôi có thể giúp bạn!

+0

Trong thực tế điều này là không làm việc, mã VBA phá vỡ tại "Phạm vi (" A "& i + StartRow) .Value = MyArray (i)" ... đó là vấn đề của tôi cũng có. Mã này có hoạt động trên Excel của bạn không !? Tôi sử dụng Excel 2003. –

+0

Nó hoạt động hoàn hảo trong Excel 2003. Thay đổi mọi "mảng" trong mã bắt đầu của bạn thành một tên biến khác KHÔNG phải là một từ dành riêng, như AbcList hoặc một thứ gì đó sắp xếp. – Eric

+0

Tuy nhiên, nó phá vỡ ... Tôi sử dụng chính xác mã này: Chức năng WriteArray() As Variant Dim arr (0 Để 2) arr (0) = "A" arr (1) = "B" arr (2) = "C" WriteArray = arr Dim StartRow, i As Integer For i = 0 To UBound (arr) Range ("A" & i) .Value = arr (i) Tiếp End Function Tại "Phạm vi (" A "& i) .Value = arr (i)", nó chỉ thoát khỏi mã, ngay cả khi không ném bất kỳ lỗi nào ... không hợp lý với tôi :( –

3

Bạn không được phép ghi vào ô không phải người gọi trực tiếp từ một hàm trang tính trong Excel.

Nếu bạn muốn sử dụng một hàm mảng (sử dụng tổ hợp phím Shift-Ctrl-Enter) bạn cần thay đổi mã của bạn để:

Function WriteArray() As Variant 
    Dim arr(0 To 2, 0 To 1) 
    arr(0, 0) = "A" 
    arr(1, 0) = "B" 
    arr(2, 0) = "C" 
    WriteArray = arr 
End Function 

Nếu bạn muốn viết bên ngoài của các tế bào gọi bạn sẽ cần phải thực hiện một số hình thức gọi lại sẽ sử dụng tự động để ghi vào các ô khác. Đây là cách phức tạp hơn và nhiều khả năng để phá vỡ!

0

Cách giải quyết tốt nhất mà tôi làm cho đến nay đã tạo ra một quy trình các tài liệu tham khảo có được phạm vi của bạn và mảng của bạn và sử dụng nó như là một điểm khởi đầu để hiển thị dữ liệu của bạn horizontaly hoặc theo chiều dọc ...

Như sau:

Sub LoadArray(ByRef oRange, ByRef vArray) 
    Dim I 
    For I = 0 To UBound(vArray) 
     oRange.Offset(I, 0).Value = vArray(I) 
    Next 
End Sub 

'How to call: 
Dim anyArray 
anyArray = Array(1,2,3) 

Call LoadArray(Range("anyRange"), anyArray) 

Hy vọng điều đó sẽ hữu ích.

1

Bí quyết là xác định mảng hai chiều. Hai chiều của mảng chỉ đơn giản là phạm vi cần được xác định cho tập dữ liệu. Thứ nguyên mảng đầu tiên là hàng bù và thứ nguyên thứ hai là độ lệch cột.

Trong bạn ví dụ chiều thứ hai là chỉ không phải là "sử dụng":

Sub Ente() 

    Dim myArray(0 To 3, 0) As String 
    myArray(0, 0) = "A" 
    myArray(1, 0) = "B" 
    myArray(2, 0) = "C" 

    Range("B7:B" & UBound(myArray) + 6) = myArray 

End Sub 

Vì vậy, không có vòng lặp cần thiết! Đơn giản và nhanh chóng.

Các vấn đề liên quan