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
Trả lời
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.
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 –
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
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! –
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
Bạn có thể giải quyết vấn đề của mình không? – marg