【问题标题】:Multiple Dependent Drop-Down Lists in Excel VBAExcel VBA 中的多个相关下拉列表
【发布时间】:2022-07-31 05:28:29
【问题描述】:

我想创建多个带有额外变化的下拉列表。

工作簿的两张表。

我正在尝试为“表格”表格中的单元格 B6 创建一个下拉列表,该下拉列表是从“列表”表格中的单元格 A2:A4 中提取的。根据在单元格 B6 中选择的内容,将为“表格”表中的单元格 D6 创建一个下拉列表(从“列表”表中提取)。这里需要注意的是,如果从“FORM”表的单元格 B6 的下拉列表中选择“PART”,而不是在 D6 中生成下拉列表,我希望单元格显示“N/A”。

Sub PRODUCT_LIST()

Dim FORM As Worksheet
Dim LISTS As Worksheet
Dim PRODUCT As Range
Dim PRODUCT_LIST As Range
Dim MODEL As Range
Dim BIKE_LIST As Range
Dim CHAIR_LIST As Range

Set FORM = ThisWorkbook.Worksheets("FORM")
Set LISTS = ThisWorkbook.Worksheets("LISTS")
Set PRODUCT = FORM.Range("B6")
Set MODEL = FORM.Range("D6")
Set PRODUCT_LIST = LISTS.Range("A2:A4")
Set BIKE_LIST = LISTS.Range("B2:B8")
Set CHAIR_LIST = LISTS.Range("C2:C3")

With PRODUCT.Validation
    .Delete 'delete previous validation
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
        Formula1:="='" & LISTS.Name & "'!" & PRODUCT_LIST.Address
End With

If PRODUCT.Value = "BIKE" Then
    With MODEL.Validation
        .Delete 'delete previous validation
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
            Formula1:="='" & LISTS.Name & "'!" & CHAIR_LIST.Address
    End With
ElseIf PRODUCT.Value = "CHAIR" Then
    With MODEL.Validation
        .Delete 'delete previous validation
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
            Formula1:="='" & LISTS.Name & "'!" & BIKE_LIST.Address
    End With
ElseIf PRODUCT.Value = "PART" Then
    MODEL.Value = "N/A"
Else
End If
End Sub

B6 的下拉列表有效,但 D6 的下拉列表似乎忽略了我设置的条件。无论我在 B6 的下拉列表中选择什么,D6 的下拉列表总是从 CHAIR_LIST 中拉出。

【问题讨论】:

  • 是什么触发了这段代码?
  • 如前所述,是什么触发了讨论中的代码?您不需要创建一次PRODUCT 验证,然后其余代码成为另一个子的一部分,由Worksheet_Change 事件触发吗?您能否更好地解释(用语言)您对上述代码的期望是什么?您是否手动运行代码并希望在第二次验证中进行更改?我的意思是,如果你简单地运行它,PRODUCT 验证不会改变它的值,并且在另一个('MODEL`)中可能不会发生任何新的事情......
  • 抱歉回复晚了,我几分钟前才有机会看这个。 FaneDuru 是完全正确的,我需要创建一次 PRODUCT 验证,然后其余代码成为另一个子的一部分,由 Worksheet_Change 事件触发。对于缺乏明确性,我深表歉意,我对此还是很陌生。

标签: excel vba


【解决方案1】:

您没有回答澄清问题...

请尝试下一个方法:

  1. 首先,您需要为第一个单元格创建验证。仅一次,或者如果需要修改列表内容。请复制标准模块中的下一个代码:
Sub PRODUCT_LIST()
  Dim FORM As Worksheet, LISTS As Worksheet
  
  Set FORM = ThisWorkbook.Worksheets ("FORM")
  Set LISTS = ThisWorkbook.Worksheets("LISTS")
  
  
  With FORM.Range("B6").Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                 Formula1:="='" & LISTS.name & "'!" & "A2:A4"
  End With
End Sub
  1. 请复制FORM工作表代码模块中的下一个代码。右键单击工作表名称,然后选择View Code
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(0, 0) = "B6" Then
        Dim MODEL As Range, LISTS As Worksheet, BIKE_LIST As Range, CHAIR_LIST
        
        Set MODEL = Me.Range("D6")
        Set LISTS = ThisWorkbook.Worksheets("LISTS")
        Set BIKE_LIST = LISTS.Range("B2:B8")
        Set CHAIR_LIST = LISTS.Range("C2:C3")
        
        Application.EnableEvents = False
         If Target.value = "BIKE" Then
            With MODEL.Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                    Formula1:="='" & LISTS.name & "'!" & BIKE_LIST.Address
            End With
            MODEL.value = ""
         ElseIf Target.value = "CHAIR" Then
            With MODEL.Validation
                .Delete 'delete previous validation
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                    Formula1:="='" & LISTS.name & "'!" & CHAIR_LIST.Address
            End With
            MODEL.value = ""
         ElseIf Target.value = "PART" Then
            MODEL.value = "N/A"
         Else
     End If
     Application.EnableEvents = True
    End If
End Sub

如果在更改MODEL 验证列表后,您需要从该列表中放置一个值(假设是第一个),这很容易完成...

【讨论】:

  • @Marius 您是否尝试过上述建议的解决方案?如果经过测试,它没有解决您的问题吗?如果没有,最好时不时地提出一个问题来测试它,并且至少回答澄清问题。至少,这是礼貌的......
  • 抱歉回复晚了,我几分钟前才有机会看这个。是的,这非常有效,非常感谢。就像我在澄清中所说的那样,我为缺乏明确性表示歉意。我完全没有注意到需要两个潜艇的事实。这对我来说是一次非常好的学习经历,并且消除了我对 VBA 的许多误解。
猜你喜欢
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 2019-03-05
相关资源
最近更新 更多