Vba 有条件地选择单元格并用作数据验证列表
我想从Sheet2的A列中选择除第一个单元格以外的所有非空单元格,并将其用作Sheet1范围的数据验证列表。我已经有了添加验证的代码:Vba 有条件地选择单元格并用作数据验证列表,vba,excel,excel-2003,Vba,Excel,Excel 2003,我想从Sheet2的A列中选择除第一个单元格以外的所有非空单元格,并将其用作Sheet1范围的数据验证列表。我已经有了添加验证的代码: Cells.SpecialCells(xlCellTypeFormulas).Offset(0, 1).Select With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetwe
Cells.SpecialCells(xlCellTypeFormulas).Offset(0, 1).Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=**The range i need**"
.IgnoreBlank = True
.InCellDropdown = True
End With
我无法在Excel 2003中使用它;在Excel 2003中,无法添加对另一张工作表的引用以进行数据验证。我从未在Excel 2003中遇到过跨工作表的问题 您的描述不清楚在哪里,所以这里有一些代码可以让它工作。如果你开始将列表加载到一个数组中并从那里开始使用它,事情会进展得更快,但是vrange会给你列表的范围 将标题和内容放入名为B的工作表的a列中,此代码将为您提供所需的内容
Option Explicit
Public Sub test()
Dim vlist As Variant
Dim vrange As Range
Dim i As Variant
'' find the range, eliminate header
Set vrange = Range("B!a1")
Set vrange = vrange.Range("A2", vrange.End(xlDown))
'' copy into an array
vlist = vrange.Value
'' Show what we got
Debug.Print vrange.Address(external:=True)
For i = 1 To UBound(vlist, 1)
Debug.Print vlist(i, 1)
Next i
End Sub
如果希望验证列表跨工作表,则需要为验证数据定义一个命名范围。在Excel 2003中,如果我没记错,您可以在“插入>命名范围>定义”中定义名称范围。如果要在代码中分配验证,只需使用范围的名称作为地址
Cells.SpecialCells(xlCellTypeFormulas).Offset(0, 1).Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=TheNameOfYourRange"
.IgnoreBlank = True
.InCellDropdown = True
End With
当然,您可能不必在代码中执行此操作-您只需定义一次验证规则,然后从此点开始更新命名范围。要更新命名区域以引用特定工作表上的非空白单元格,可以使用以下方法
Dim addresses As Variant
addresses = Split(Sheets("Other sheet").Range("A2:A9999") _
.SpecialCells(xlCellTypeConstants).Address, ",")
Names("TheNameOfYourRange").RefersTo = _
"='Other sheet'!" & Join(addresses, ",'Other sheet'!")