在excel中启用/取消缩放下拉列表的单元格

在excel中启用/取消缩放下拉列表的单元格,excel,vba,dropdown,Excel,Vba,Dropdown,我创建了一个简单的下拉列表。看起来像这样 这里允许用户有多个选择 我想,如果用户选择了不适用以外的选项,则应禁用不适用单元格,并启用其他城市进行选择。但如果用户首先选择不适用,则其他城市选项应禁用。此外,单击同一单元格将启用和禁用该单元格 例如,第一个用户决定不选择任何国家,因此他单击“不适用”选项并自动禁用“纽约、柏林、孟买、慕尼黑”选项。但稍后,若用户决定选择城市选项,并且再次单击“不适用”,则该选项应被禁用,其他国家应被启用 我还将值关联到城市,并打印值 我在网上使用了以下多重选择和删

我创建了一个简单的下拉列表。看起来像这样

这里允许用户有多个选择

我想,如果用户选择了不适用以外的选项,则应禁用不适用单元格,并启用其他城市进行选择。但如果用户首先选择不适用,则其他城市选项应禁用。此外,单击同一单元格将启用和禁用该单元格

例如,第一个用户决定不选择任何国家,因此他单击“不适用”选项并自动禁用“纽约、柏林、孟买、慕尼黑”选项。但稍后,若用户决定选择城市选项,并且再次单击“不适用”,则该选项应被禁用,其他国家应被启用

我还将值关联到城市,并打印值

我在网上使用了以下多重选择和删除代码

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim xRng As Range
    Dim xValue1 As String
    Dim xValue2 As String
    If Target.Count > 1 Then Exit Sub
    On Error Resume Next
    Set xRng = Me.Range("A2")
    If xRng Is Nothing Then Exit Sub
    Application.EnableEvents = False
    If Not Application.Intersect(Target, xRng) Is Nothing Then
        xValue2 = Target.Value
        Application.Undo
        xValue1 = Target.Value
        Target.Value = xValue2
        If xValue1 <> "" Then
            If xValue2 <> "" Then
                If InStr(1, xValue1, xValue2 & ",") > 0 Then
                    xValue1 = Replace(xValue1, xValue2 & ", ", "") ' If it's in the middle with comma
                    Target.Value = xValue1
                    GoTo jumpOut
                End If
                If InStr(1, xValue1, ", " & xValue2) > 0 Then
                    xValue1 = Replace(xValue1, ", " & xValue2, "") ' If it's at the end with a comma in front of it
                    Target.Value = xValue1
                    GoTo jumpOut
                End If
                If xValue1 = xValue2 Then        ' If it is the only item in string
                    xValue1 = ""
                    Target.Value = xValue1
                    GoTo jumpOut
                End If
                Target.Value = xValue1 & ", " & xValue2
            End If
jumpOut:
        End If
    End If
    Application.EnableEvents = True
End Sub
Private子工作表\u更改(ByVal目标作为范围)
Dim xRng As范围
作为字符串的Dim xValue1
Dim xValue2作为字符串
如果Target.Count>1,则退出Sub
出错时继续下一步
设置xRng=Me.范围(“A2”)
如果xRng为空,则退出Sub
Application.EnableEvents=False
如果不是,则Application.Intersect(Target,xRng)什么都不是
xValue2=目标值
应用程序。撤消
xValue1=目标值
Target.Value=xValue2
如果xValue1“”,则
如果xValue2“”,则
如果InStr(1,xValue1,xValue2&“,”)>0,则
xValeE1=替换(xValue1,xValue2和),“”,如果它在逗号的中间
Target.Value=xValue1
跳投
如果结束
如果InStr(1,xValue1,“,”和xValue2)>0,则
xValue1=如果在末尾前面有逗号,则替换(xValue1,“,”和xValue2,”)
Target.Value=xValue1
跳投
如果结束
如果xValue1=xValue2,则“如果它是字符串中的唯一项
xValue1=“”
Target.Value=xValue1
跳投
如果结束
Target.Value=xValue1&“,”和xValue2
如果结束
跳出:
如果结束
如果结束
Application.EnableEvents=True
端接头
尝试以下操作(将其放置在带有下拉列表的工作表中的模块中):


我假设验证列表在
工作表(“Sheet1”)
中,带有城市的小表格在
工作表“Sheet2”

中,您需要什么:
工作表\u Change
事件处理程序,带有
目标地址。当目标单元格中发生更改时,运行代码。您要做的是使用
Range.Validation.Modify
Range.Validation.Delete
然后
Range.Validation.Add
。创建默认状态的命名范围,并根据选择在它们之间进行替换。您还需要以某种方式重置原始列表,以便用户能够灵活地再次选择选项。您可以在不使用VBA的情况下执行此操作!!!直截了当地说:您想阻止用户根据从下拉列表中选择的选项选择某些单元格,对吗?@TimStack yes。当用户选择N/A时,所有其他单元格将被禁用,如果用户选择任何城市,则N/A将被禁用
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim xRng As Range
    Dim xValue1 As String
    Dim xValue2 As String
    If Target.Count > 1 Then Exit Sub
    On Error Resume Next
    Set xRng = Me.Range("A2")
    If xRng Is Nothing Then Exit Sub
    Application.EnableEvents = False
    If Not Application.Intersect(Target, xRng) Is Nothing Then
        xValue2 = Target.Value
        Application.Undo
        xValue1 = Target.Value
        Target.Value = xValue2
        If xValue1 <> "" Then
            If xValue2 <> "" Then
                If InStr(1, xValue1, xValue2 & ",") > 0 Then
                    xValue1 = Replace(xValue1, xValue2 & ", ", "") ' If it's in the middle with comma
                    Target.Value = xValue1
                    GoTo jumpOut
                End If
                If InStr(1, xValue1, ", " & xValue2) > 0 Then
                    xValue1 = Replace(xValue1, ", " & xValue2, "") ' If it's at the end with a comma in front of it
                    Target.Value = xValue1
                    GoTo jumpOut
                End If
                If xValue1 = xValue2 Then        ' If it is the only item in string
                    xValue1 = ""
                    Target.Value = xValue1
                    GoTo jumpOut
                End If
                Target.Value = xValue1 & ", " & xValue2
            End If
jumpOut:
        End If
    End If
    Application.EnableEvents = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim searchNA As Range
Dim LRow As Long

If Not Intersect(Target, Range("A2")) Is Nothing Then
    With ThisWorkbook.Sheets("Sheet2")
        LRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        Set searchNA = .Range("A2:A" & LRow).Find(Target.Value, lookat:=xlWhole, MatchCase:=True)
        If Target.Value = "Not Applicable" Then
            .Range("A2:A" & LRow).Locked = True
            searchNA.Locked = False
        Else
            .Range("A2:A" & LRow).Locked = False
            searchNA.Locked = True
        End If
    End With
End If
End Sub