【问题标题】:How to create complex dependent dropdown using VBA in Excel 2016? [closed]如何在 Excel 2016 中使用 VBA 创建复杂的依赖下拉列表? [关闭]
【发布时间】:2017-07-19 12:24:10
【问题描述】:

我在名为 Parts 的工作表中有以下数据。

在一个名为“计划”的不同工作表中,我有以下数据:

在上述规划工作表中,单元格 D3 是允许选择显示语言的下拉菜单。当前的选择是“英语”和“日语”。 A 列的单元格也是允许选择维度的下拉列表。

我想做的是创建一个下拉列表:

  1. 取决于 A 列中的单元格。下拉列表应根据相应 A 单元格的值过滤 Parts Worksheet 中的数据。
  2. 也依赖于 D3 单元。如果 D3 为“English”,下拉列表应显示“English description”,如果 D3 为“Japanese”,则应显示“Japanese description”
  3. 一旦选择,下拉列表中的数据应该是零件而不是描述。换句话说,它的行为应该类似于 HTML 中的选择标记。

我是 VBA 新手,经过大量搜索后,我无法弄清楚如何做到这一点。我真的很感激一个详细的答案。提前谢谢!

编辑:

最终的零件工作表将至少有 10,000 行长。用户不能手动创建命名列表。因此,我认为我应该使用 VBA。

【问题讨论】:

  • 这很容易用工作表函数完成,你想使用 VBA 有什么特别的原因吗?
  • @CallumDA 如果你能指出正确的方向,那就太好了!
  • @ScottHoltzman 谢谢你的链接。我会检查并尝试!
  • 我想使用 VBA,因为最终的 Parts Worksheet 将包含超过 10,000 行,并且用户无法手动创建命名列表。自动执行此操作会很棒。

标签: vba excel dropdown


【解决方案1】:

我不确定你是否尝试过这个,当我发布它作为你昨天的问题的答案时。

当您在 B 列中选择一个单元格时,代码会根据 A 列中的值即时创建验证下拉列表,从而满足您的所有需求。下拉列表会根据语言显示产品代码和说明。选择产品代码并从单元格中删除验证后,说明将被删除。

虽然代码确实完成了您需要的所有工作,但它并不完美,但它为您提供了一个巨大的开端,并且如果您复制并粘贴它并尝试一下,它应该可以与您的工作表名称等一起使用。

Dim CHANGING_VAL As Boolean 'Global Variable that can be set to prevent the onchange being fired when the Macro is removing the description from the dropdown.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)


    If Target.Column = 2 And CHANGING_VAL = False Then
        CHANGING_VAL = True
        If InStr(1, Target.Value, "~") > 2 Then
            Target.Value = Left(Target.Value, InStr(1, Target.Value, "~") - 2)
        End If
        Target.Validation.Delete
        Target.Font.Color = RGB(0, 0, 255)
        CHANGING_VAL = False
    End If

End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If Target.Column = 2 Then
        If Target.Offset(0, -1) <> "" Then
            strValidList = ""
            For intRow = 1 To 10000
                If Sheets("Parts").Cells(intRow, 1) = Target.Offset(0, -1) Then
                    If Sheets(Target.Parent.Name).Cells(3, 4) = "English" Then
                        strValidList = strValidList & Sheets("Parts").Cells(intRow, 2) & " ~ " & Sheets("Parts").Cells(intRow, 3) & ", "
                    Else
                        strValidList = strValidList & Sheets("Parts").Cells(intRow, 2) & " ~ " & Sheets("Parts").Cells(intRow, 4) & ", "
                    End If
                End If
            Next

            If strValidList <> "" Then
                strValidList = Left(strValidList, Len(strValidList) - 2)

                Target.Select

                With Selection.Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=strValidList
                    .IgnoreBlank = True
                    .InCellDropdown = True
                    .InputTitle = ""
                    .ErrorTitle = ""
                    .InputMessage = ""
                    .ErrorMessage = ""
                    .ShowInput = True
                    .ShowError = True
                End With
            End If
        End If
    Else
        Sheets(Target.Parent.Name).Range("B:B").Validation.Delete
    End If

End Sub

【讨论】:

  • 这很好用!谢谢!但我真的很想知道这段代码的解释,以防我不得不做出改变。
  • 我找到了你的代码!它工作得非常好。我学到了很多!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 2015-02-23
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多