我想从A
的{{1}}列中选择非空的所有单元格(第一个除外),并将其用作{{{}范围内的数据验证列表1}}。我已经有了添加验证的代码:
Sheet2
我无法在Excel 2003 中使其正常工作;在Excel 2003中,无法添加对另一个工作表的引用以进行数据验证。
答案 0 :(得分:0)
我从来没有遇到过与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
答案 1 :(得分:0)
如果要使验证列表跨工作表,则需要为验证数据定义命名范围。在Excel 2003中(如果我没记错的话),您可以在Insert>中定义名称范围。命名范围>限定。如果您想在代码中分配验证,只需使用范围的名称作为地址。
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'!")