使用下拉列表更改列中的所有单元格

时间:2018-04-01 03:14:41

标签: excel vba excel-vba

我尝试使用下拉列表替换列中的所有单元格以使用excel宏。我也尝试使用动态范围,因为我不知道列表有多长。这是我现在的代码:

Dim sht As Worksheet
Dim LastRow As Long
Dim LastColumn As Long
Dim StartCell As Range

Set sht = Worksheets("*Name of main sheet*")
Set StartCell = Range("A1")

'Find Last Row and Column
LastRow = sht.Cells(sht.Rows.Count, StartCell.Column).End(xlUp).Row
LastColumn = sht.Cells(StartCell.Row, sht.Columns.Count).End(xlToLeft).Column

'Select Range

Worksheets("*Name of main sheet*").Activate

'replace "J2" with the cell you want to insert the drop down list
With Range(StartCell, sht.Cells(LastRow, LastColumn))
    .Delete
    'replace "=A1:A6" with the range the data is in.
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
         Operator:=xlBetween, Formula1:="=Sheet1!A1:A6"
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
End With

我在名为Sheet1的单独标签中创建包含下拉列表所有选项的列表。

1 个答案:

答案 0 :(得分:0)

.Validation末尾添加With Range(StartCell, sht.Cells(LastRow, LastColumn))并使用$保持行引用不变

所以整个With-End块变为:

With Range(StartCell, sht.Cells(LastRow, LastColumn)).Validation
    .Delete
    'replace "=A1:A6" with the range the data is in.
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
         Operator:=xlBetween, Formula1:="=Sheet1!A$1:A$6"
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
End With

如果您需要使用Sheet1列A保持下拉列表动态而不是空值,那么您可以按如下方式进行:

Dim LastRow As Long
Dim LastColumn As Long

Dim sourceSht As Worksheet
Set sourceSht = Worksheets("Sheet1")

With Worksheets("Name of main sheet")
    LastRow = .Cells(.Rows.Count, 1).End(xlUp).row
    LastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column
    With .Range("A1", .Cells(LastRow, LastColumn)).Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
             Operator:=xlBetween, Formula1:="=" & sourceSht.name & "!" & sourceSht.Range("A1", sourceSht.Cells(sourceSht.Rows.Count, 1).End(xlUp)).Address(True, False)
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
End With