有条件地选择单元格并用作数据验证列表

时间:2010-09-27 08:38:39

标签: excel vba excel-vba excel-2003

我想从A的{​​{1}}列中选择非空的所有单元格(第一个除外),并将其用作{{{}范围内的数据验证列表1}}。我已经有了添加验证的代码:

Sheet2

我无法在Excel 2003 中使其正常工作;在Excel 2003中,无法添加对另一个工作表的引用以进行数据验证。

2 个答案:

答案 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'!")