根据一系列选择标准填充ComboBox

时间:2015-11-05 11:08:31

标签: excel excel-vba combobox excel-formula vba

我有两个工作表,让我们称它们为workheetA和worksheetZ:

WorksheetA 有两列我们感兴趣的内容 - "订单"(Col C)和"客户" (Col D)。 "客户"列包含由大量客户填充的组合框/下拉列表。名。 "订单"列包含另一个组合框/下拉列表,其中包含有关此客户订单的详细信息,例如订单号,客户代码和订单描述。 (顺便说一下,我理解这是一个糟糕的布局,它不是我的设计)。例如:

value in Customer Column (column D): "Google"  
value in Order Column (column C): "1234 - GOO - An order from google."

WorksheetZ 包含两个我们感兴趣的列,它包含用于填充WorksheetA中的ComboBox的值:

再次,"订单"列(列A),包含相同的数据,但数据被分成行,而不是下拉列表,"订单"工作表A中的下拉列表当前由此列中的所有行填充。

和"客户"再次列,其中包含客户名称 - " Google" - " IBM"等

目前,"订单"使用此数据验证=WorksheetZ!$A:$A填充WorksheetA中的列,该数据验证将选择所有订单(目前超过300个!)

我需要能够显示已经在"订单"中的WorksheetA.Customer中选择的客户的订单。工作表A的下拉列表。

所以,(请原谅我可怕的类似SQL的伪代码)

WorksheetA.Order =(从WorksheetZ.Order中选择*,其中worksheetA.Customer = WorksheetZ.Customer)

Here's the drop-down for WorksheetA.Customer (I've removed company-sensitive info)

Here is WorksheetZ (again censored), where "Column1" in "A" is "Orders", and "Client" is "Customers"

1 个答案:

答案 0 :(得分:0)

以下是我将如何处理它。我创建了一个工作簿,其中包含两个名为“Lookups”的工作表,另一个名为“Validation”。你必须调整它以适应你的情况。创建以下..

命名范围 (Lookups工作表中的整个列)

公司(静态公司名单)
CompanyLookup(将公司与订单联系起来的栏目)
OrderLookup(带有订单列表的列)
MatchOrder(用于构建匹配订单列表的空白列)

小区验证 (在验证工作表中)

For Company - List - >“= Company”
对于订单 - 列表 - >“= MatchOrder”

VBA代码落后

在VBA编辑器中,将此代码添加到“验证”工作表

Private Sub Worksheet_Change(ByVal Target As Range)
    UpdateValidationList Target
End Sub

然后将此代码添加到新模块

Dim CompanyCol As Long
Dim OrderCol As Long
Dim MatchCol As Long
Dim WriteRow As Long
Dim RowCounter As Long
Dim LastRow As Long
Dim ws As Worksheet

Sub UpdateValidationList(rng As Range)
    Set ws = Sheets("Lookups")
    WriteRow = 1
    Range("MatchOrder").Clear
    CompanyCol = Range("CompanyLookup").Column
    OrderCol = Range("OrderLookup").Column
    MatchCol = Range("MatchOrder").Column
    LastRow = ws.Cells(100000, CompanyCol).End(xlUp).Row
    For RowCounter = 1 To LastRow
        If ws.Cells(RowCounter, CompanyCol) = rng.Value Then
            ws.Cells(WriteRow, MatchCol) = ws.Cells(RowCounter, OrderCol)
            WriteRow = WriteRow + 1
        End If
    Next RowCounter
End Sub

这将创建仅在您的验证所在的“MatchOrder”范围内的匹配订单的验证列表。这对用户是不可见的。 TODO:错误处理

另外,使用Access数据库可以更轻松地处理这些类型的任务。考虑迁移此功能

相关问题