Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 有条件地选择单元格并用作数据验证列表_Vba_Excel_Excel 2003 - Fatal编程技术网

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

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

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

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