2009-11-29 6 views
7

Bạn có thể tạo hàm Excel VBA trả về một mảng theo cách tương tự như LINEST không, ví dụ? Tôi sẽ tạo một mã, được cung cấp mã nhà cung cấp, trả về một danh sách các sản phẩm cho nhà cung cấp đó từ một bảng cung cấp sản phẩm.Chức năng Excel VBA trả về một mảng

+0

Bạn có thể giải quyết vấn đề của mình không? – marg

Trả lời

5

Tôi nghĩ rằng Collection có thể là những gì bạn đang tìm kiếm.

Ví dụ:

Private Function getProducts(ByVal supplier As String) As Collection 
    Dim getProducts_ As New Collection 

    If supplier = "ACME" Then 
     getProducts_.Add ("Anvil") 
     getProducts_.Add ("Earthquake Pills") 
     getProducts_.Add ("Dehydrated Boulders") 
     getProducts_.Add ("Disintegrating Pistol") 
    End If 

    Set getProducts = getProducts_ 
    Set getProducts_ = Nothing 
End Function 

Private Sub fillProducts() 
    Dim products As Collection 
    Set products = getProducts("ACME") 
    For i = 1 To products.Count 
     Sheets(1).Cells(i, 1).Value = products(i) 
    Next i 
End Sub 

Edit: Dưới đây là một giải pháp khá đơn giản cho vấn đề: Populating một ComboBox cho các sản phẩm bất cứ khi nào ComboBox cho nhà cung cấp thay đổi giá trị của nó với ít nhất VBA càng tốt.

Public Function getProducts(ByVal supplier As String) As Collection 
    Dim getProducts_ As New Collection 
    Dim numRows As Long 
    Dim colProduct As Integer 
    Dim colSupplier As Integer 
    colProduct = 1 
    colSupplier = 2 

    numRows = Sheets(1).Cells(1, colProduct).CurrentRegion.Rows.Count 

    For Each Row In Sheets(1).Range(Sheets(1).Cells(1, colProduct), Sheets(1).Cells(numRows, colSupplier)).Rows 
     If supplier = Row.Cells(1, colSupplier) Then 
      getProducts_.Add (Row.Cells(1, colProduct)) 
     End If 
    Next Row 

    Set getProducts = getProducts_ 
    Set getProducts_ = Nothing 
End Function 

Private Sub comboSupplier_Change() 
    comboProducts.Clear 
    For Each Product In getProducts(comboSupplier) 
     comboProducts.AddItem (Product) 
    Next Product 
End Sub 

Lưu ý: Tôi đã đặt tên ComboBox cho nhà cung cấp comboSupplier và một cho Combo sản phẩmSản phẩm.

+0

Như thế này? FoundProds Function (SuppKey As Variant) As Variant Dim ProdCell Như Phạm vi Dim SuppCell Như Phạm vi Dim Kết quả (50) Dim RESULTCOUNT As Integer Dim ProdCol, SuppCol As Integer ProdCol = 1 'Mã sản phẩm tại đây cột ' SuppCol = 2' Mã Nhà cung cấp có trong cột này ' ResultCount = 1 Đối với mỗi ProdCell trong phạm vi (ô (1, ProdCol), ô (ActiveSheet.UsedRange.Rows.Count, ProdCol)) Nếu SuppKey = SuppCell.Value Sau đó, Kết quả (ResultCount) = Các ô (ProdCell.Row, ProdCol) .Value ResultCount = ResultCount + 1 Kết thúc Nếu Tiếp theo FoundLocations = Kết quả Chức năng kết thúc –

+0

Tôi quên hỏi: Bạn muốn trả về mảng cho một hàm VBA khác phải không? hoặc bạn có muốn sử dụng hàm trực tiếp trong trang tính của bạn dưới dạng hàm tùy chỉnh không? – marg

+0

Tôi muốn sử dụng chức năng trực tiếp trong trang tính Tôi đang cố gắng để người dùng chọn nhà cung cấp từ hộp tổ hợp, sau đó sẽ điền hộp kết hợp thứ hai với các sản phẩm của nhà cung cấp đó, cho lựa chọn thứ hai. Xin lỗi về khối mã lộn xộn trong bình luận của tôi ở trên! –

14

ok, ở đây tôi có một hàm dữ liệu trả về một mảng của nhiều 'cột', vì vậy bạn có thể thu nhỏ xuống chỉ một. Không thực sự quan trọng như thế nào mảng được dân cư, đặc biệt là

Function dataMapping(inMapSheet As String) As String() 

    Dim mapping() As String 

    Dim lastMapRowNum As Integer 

    lastMapRowNum = ActiveWorkbook.Worksheets(inMapSheet).Cells.SpecialCells(xlCellTypeLastCell).Row 

    ReDim mapping(lastMapRowNum, 3) As String 
    For i = 1 To lastMapRowNum 
     If ActiveWorkbook.Worksheets(inMapSheet).Cells(i, 1).Value <> "" Then 
     mapping(i, 1) = ActiveWorkbook.Worksheets(inMapSheet).Cells(i, 1).Value 
     mapping(i, 2) = ActiveWorkbook.Worksheets(inMapSheet).Cells(i, 2).Value 
     mapping(i, 3) = ActiveWorkbook.Worksheets(inMapSheet).Cells(i, 3).Value 
     End If 
    Next i 

    dataMapping = mapping 

End Function 




Sub mysub() 

    Dim myMapping() As String 
    Dim m As Integer 

    myMapping = dataMapping(inDataMap) 

    For m = 1 To UBound(myMapping) 

    ' do some stuff 

    Next m 

end sub