Excel VBA下拉菜单

Excel VBA下拉菜单,excel,vba,drop-down-menu,Excel,Vba,Drop Down Menu,我在单元格更改时触发了一些VBA代码。 如果同一行的a列中有值,则代码的一部分会在C列中创建一个下拉列表。 有两件事与下拉代码,我想得到一些帮助 首先:如果我将某些行的下拉列表值更改为“是”,则默认情况下会将“有”设置为“否”,然后在A列中添加新值“所有下拉列表:s”会将这些值更改为“否”。我想添加一些类似这样的检查,如果该值设置为“是”,则不要将其更改回去 第二:看起来像是某种bug,所以我会发布我所有的代码,以防其他原因导致它。 假设我在A列中为五行添加了值,并且我删除了它们,如果我一个接一

我在单元格更改时触发了一些VBA代码。 如果同一行的a列中有值,则代码的一部分会在C列中创建一个下拉列表。 有两件事与下拉代码,我想得到一些帮助

首先:如果我将某些行的下拉列表值更改为“是”,则默认情况下会将“有”设置为“否”,然后在A列中添加新值“所有下拉列表:s”会将这些值更改为“否”。我想添加一些类似这样的检查,如果该值设置为“是”,则不要将其更改回去

第二:看起来像是某种bug,所以我会发布我所有的代码,以防其他原因导致它。 假设我在A列中为五行添加了值,并且我删除了它们,如果我一个接一个地删除它们,或者同时删除所有五行,或者删除它们的顺序都不匹配。列C中的标题在列a中的最后一个值之后是一个下拉列表。请注意,列a也有一个未删除的标题


首先,让VBA记住C列中的旧值。您可以将其设置回原来的值

Dim myList作为字符串,r作为范围

myList = "Yes,No"
Dim oldYesNo As String
For Each r In w1.Range("A2", w1.Range("A" & Rows.Count).End(xlUp))
    If r.Value <> vbNullString Then
        If oldYesNo <> vbNullString Then oldYesNo = r.Offset(, 2)
        With r.Offset(, 2).Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=myList
        End With
        If oldYesNo = vbNullString Then r.Offset(, 2).Value = Split(myList, ",")(1)
        oldYesNo = vbNullString
    End If
Next r
如果只填充了A1单元格,则仅对A1单元格有效。您可以添加一个条件

If w1.Range("A" & Rows.Count).End(xlUp).Address <> "$A$1" Then
编辑:但在第二种情况下,不需要记住旧值。仅为新行设置值就足够了

myList = "Yes,No"

If w1.Range("A" & Rows.Count).End(xlUp).Address <> "$A$1" Then
    For Each r In w1.Range("A2", w1.Range("A" & Rows.Count).End(xlUp))
        If r.Value <> vbNullString Then
            With r.Offset(, 2).Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=myList
            End With
            if r.Offset(, 2).Value = "" Then Split(myList, ",")(1)
        End If
    Next r
End If

也许有更优雅的解决方案,但无论如何,这应该是可行的

谢谢你的帮助。当我在CollA中编写时,您提供的代码将CollC中的Header直接更改为No。当在CollA中添加更多值时,下拉值仍然更改为No。太棒了!它不再改变CollC中的标题,非常感谢。但不幸的是,在添加新值时,它仍然将所有的“是”更改为“否”。我在下面的行中得到语法错误:if r.Offset,2.value=Then SplitmyList,1。expected:=如果我也更改了行,如果r.Offset,2.Value=然后拆分myList,我不会得到任何错误,但是我没有作为标准值的值。我该如何设置No as标准?有人知道吗?
If w1.Range("A" & Rows.Count).End(xlUp).Address <> "$A$1" Then
myList = "Yes,No"

If w1.Range("A" & Rows.Count).End(xlUp).Address <> "$A$1" Then
    For Each r In w1.Range("A2", w1.Range("A" & Rows.Count).End(xlUp))
        If r.Value <> vbNullString Then
            With r.Offset(, 2).Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=myList
            End With
            if r.Offset(, 2).Value = "" Then Split(myList, ",")(1)
        End If
    Next r
End If