有条件地select单元格并将其用作数据validation列表

我想从Sheet2A中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