根据VBA中的相邻单元格值更改下拉列表项

时间:2018-10-10 08:03:39

标签: excel vba excel-vba

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

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

请不要将其与基于下拉选择来更改单元格值混淆。相反。

3 个答案:

答案 0 :(得分:1)

不使用VBA的解决方案

您可以使用Excel的Data Validation工具进行此操作:

首先,您需要将所有下拉选项(ADD,MODIFY,DELETE)添加到一个范围中。可以在同一工作表中,也可以在任何其他工作表中。对于我的示例,我将它们放在同一工作表的范围F1:F3中。

然后选择整个列A,然后从功能区菜单›数据›数据工具›数据验证中添加数据验证:
enter image description here

设置选项卡上的允许下,选择列表,并在来源中使用以下公式:< / p>

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

按如下所示命名您的列表,

enter image description here

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

  

= INDIRECT(IF($ C2 <>“”,“ All”,“一个”))

enter image description here

您将根据需要选择下拉列表

enter image description here