有条件地select单元格并将其用作数据validation列表
我想从Sheet2
列A
中select所有的单元格(第一个除外),并将其用作Sheet1
范围内的数据validation列表。 我已经有了添加validation的代码:
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中,无法添加对其他工作表进行数据validation的引用。
如果您想让validation列表跨越工作表,则需要为validation数据定义一个命名范围。 在Excel 2003中(如果我记得正确)在“插入”>“命名范围”>“定义”中定义名称范围。 如果您想在代码中分配validation,您只需使用您的范围的名称作为地址。
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
当然,你可能不需要在代码中这样做 – 你只需要定义一次validation规则,然后从这一点更新命名的范围。 要更新指定范围以引用特定工作表上的非空白单元格,可以使用类似这样的内容。
Dim addresses As Variant addresses = Split(Sheets("Other sheet").Range("A2:A9999") _ .SpecialCells(xlCellTypeConstants).Address, ",") Names("TheNameOfYourRange").RefersTo = _ "='Other sheet'!" & Join(addresses, ",'Other sheet'!")
我从来没有遇到与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