我的vba知识很差(从今天开始),我正在尝试构建以下功能。网络搜索不会返回我想要的内容,可能是因为搜索条件太常见了。
我有这样的事情:
然后在vba中我有:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim DropDownName As String
DropDownName = Trim(Range("A1").Value)
With Range("A11").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:="=" & DropDownName
End With
End Sub
然后对一大堆重复这一过程,唯一的变化是列表名称和内容。我们的想法是,如果用户添加了一个包含新列表的新列,它会自动将该下拉菜单放在该列的第11行中。
问题在于我不知道将这段代码应用到所有列的第11行的简单方法。我想这很容易,也许是循环,但我无法解决或找到解决方案!我已经看过一系列单元格的循环示例,但不是连续的所有单元格,或连续的所有填充单元格。
我确信可以为这整个功能做出其他改进,例如:从单元格内容自动生成列表而不是使用“定义名称”菜单选项(一个问题是每列的列表长度可能不同,并且可以添加/更改/删除新项目,因此它不是只是A2:A10)。随意提出建议。
提前致谢。
!!!! UPDATE !!!!
好的,经过一些进一步的研究,@ Raystafarian提示我将其更改为:
Private Sub Worksheet_Change(ByVal Target As Range)
...other code...
Dim DropDownName As String
Dim DropDownNameColumn As Long
DropDownNameColumn = ActiveCell.Column
If Target.Address <> Range(Cells(1, DropDownNameColumn), Cells(10, DropDownNameColumn)).Address Then
DropDownName = Trim(Target.Range(Target.Column & "1").Value)
With Target.Range(Cells(11, DropDownNameColumn)).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:="=" & DropDownName
End With
End If
但是,我的电子表格没有更新 - 如果我更改了一个单元格,例如第1行和第10行之间的列B,它应该使用名为B1内容的经过验证的列表更新列B11。
相反,没有任何反应。
答案 0 :(得分:0)
我得到了它的工作,主要的是我没有使用单元格位置的.Address值索引Range。
If Target.Address <> Range(Cells(10, Target.Column), Cells(30, Target.Column)).Address Then
DropDownName = Trim(Cells(10, Target.Column))
With Range(Cells(31, Target.Column).Address).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:="=" & DropDownName
End With
End If