2010-09-27 36 views
1

我想選擇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 工作;在Excel 2003中,無法添加對其他工作表進行數據驗證的引用。

回答

0

如果您想讓您的驗證列表跨越工作表,您需要爲驗證數據定義一個命名範圍。在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'!") 
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