【问题标题】:Populate a ComboBox based on a chain of selection criteria根据一系列选择条件填充 ComboBox
【发布时间】:2015-11-05 11:08:31
【问题描述】:

我有两个工作表,我们称它们为 worksheetA 和 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 中的组合框的值:

再次,“订单”列(A 列),其中包含相同的数据,但数据被拆分为行,而不是下拉列表,并且当前填充了工作表 A 中的“订单”下拉列表按此列中的所有行。

还有一个“客户”列,其中包含客户名称 - “Google” - “IBM”等。

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

我需要能够仅显示已在 WorksheetA.Customer 在工作表 A 的“订单”下拉菜单中选择的客户的订单。

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

WorksheetA.Order = (Select * from WorksheetZ.Order where 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"

【问题讨论】:

  • 您能否澄清一下..如果您在 A3 中选择 Google,那么对于 B3,您只需要 Google 订单的选项吗?您应该有一列用于查找公司名称(公司列表),但您需要两列用于订单(一列包含订购它的公司,另一列包含订单号/详细信息本身)。您的数据是这样设置的吗?
  • WorksheetZ 包含每个订单和客户名称之间的链接。
  • 我已经用一些图片修改了我的原始帖子,我希望他们能更好地解释它。

标签: excel combobox excel-formula vba


【解决方案1】:

这就是我的处理方式。我创建了一个包含两张表的工作簿,一张称为“查找”,另一张称为“验证”。你必须调整它以适应你的情况。创建以下..

命名范围 (查找工作表中的整个列):

公司(公司的静态列表)
CompanyLookup(将公司链接到订单的列)
OrderLookup(包含订单列表的列)
MatchOrder(建立匹配订单列表的空白列)

单元格验证 (在验证工作表中):

对于公司 - 列表 -->"=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 数据库更容易处理。考虑迁移此功能

【讨论】:

  • 我会尽快尝试并通知您 - 感谢您的回答和您为此付出的努力!如果它对我有用,那么我会标记为正确,但这看起来不错:)
猜你喜欢
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
相关资源
最近更新 更多