Excel / VBA:循环遍历行中的单元格并为每列分配相同的功能

时间:2016-02-23 14:40:20

标签: excel-vba vba excel

我的vba知识很差(从今天开始),我正在尝试构建以下功能。网络搜索不会返回我想要的内容,可能是因为搜索条件太常见了。

我有这样的事情:

  • A1 = name(用作构建下拉列表的定义名称)
  • A2 =列表条目1
  • ...
  • A10 =可能最多列出条目9

然后在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。

相反,没有任何反应。

1 个答案:

答案 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
相关问题