【问题标题】:Change drop down list items based on adjacent cell value in vba根据vba中的相邻单元格值更改下拉列表项
【发布时间】:2018-10-10 08:03:39
【问题描述】:

我有一个 Excel 表,其中有一个包含两列和可变行数的表格。其中一些行将被填充,而一些则为空。 B 列包含一些值,A 列在每个单元格中都有一个下拉列表。

我希望如果 B 列单元格具有某个值,则相邻列 A 单元格应在下拉列表中显示 3 个选项 - 修改、添加、删除,当 B 列单元格为空时,相邻列 A 单元格应仅显示其下拉列表中的一个选项 - 添加。可以使用 VBA 或 excel 公式完成吗?

请不要将其与根据下拉选择更改单元格值混淆。恰恰相反。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    没有 VBA 的解决方案

    您可以使用 Excel 的Data Validation 工具来做到这一点:

    首先,您需要将所有下拉选项(添加、修改、删除)添加到一个范围内。这可以在同一个工作表中或任何其他工作表中。对于我的示例,我将它们放入同一工作表的F1:F3 范围内。

    然后选择整个 A 列并从功能区菜单 › 数据 › 数据工具 › 数据验证添加数据验证:

    设置标签的允许下,选择List并在Source处使用以下公式:

    =IF(B1<>"",$F$1:$F$3,$F$1)
    

    请注意,第一个范围 $F$1:$F$3 指向 ADD、MODIFY、DELETE,第二个范围 $F$1 仅指向 ADD!

    【讨论】:

      【解决方案2】:

      VBA 解决方案

      以下内容将达到您的预期,它将遍历您的 B 列,如果为空,它将在 A 列上添加一个下拉列表作为数据验证,其值为“ADD”,如果不为空,它将添加列表“修改”、“添加”、“删除”:

      Sub foo()
      Dim ws As Worksheet: Set ws = Worksheets("Sheet1")
      'declare and set the worksheet you are using, amend as required
      LastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
      'get the last row with data on Column B
      
      For i = 2 To LastRow 'loop from Row 2 to Last
          If ws.Cells(i, "B").Value <> "" Then
              With ws.Cells(i, "A").Validation
                  .Delete
                  .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                  xlBetween, Formula1:="MODIFY,ADD,DELETE"
                  .IgnoreBlank = True
                  .InCellDropdown = True
                  .ShowInput = True
                  .ShowError = True
              End With
          Else
              With ws.Cells(i, "A").Validation
                  .Delete
                  .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                  xlBetween, Formula1:="ADD"
                  .IgnoreBlank = True
                  .InCellDropdown = True
                  .ShowInput = True
                  .ShowError = True
              End With
          End If
      Next i
      End Sub
      

      【讨论】:

      • 非常感谢,它成功了。很抱歉,我是新手,无法投票。
      • 请注意,这是非常静态的,每次 B 列值更改时都必须重新运行。否则它将无法识别是否有人在 B 中添加或删除了值,因此不会在下拉列表的行为中反映这一点。因此,我建议使用IF 公式(请参阅我的答案)作为验证公式,当 B 中的值发生变化时立即反映它。
      【解决方案3】:

      如下命名您的列表,

      然后使用此公式创建数据验证

      =INDIRECT(IF($C2"","All","One"))

      您将根据您的要求获得下拉菜单

      【讨论】:

      • 注意:我建议小心处理Indirect(或者尽可能远离),因为它是易变的。如果广泛使用,这可能会导致计算时间负担过重,因为 volatile 函数总是在 每个 单元格更改时重新计算。请参阅我的答案以获得没有Indirect 的公式。
      猜你喜欢
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 2014-06-11
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 2012-12-24
      相关资源
      最近更新 更多