Выберите ячейки условно и используйте в качестве списка проверки данных

Я хотел бы выбрать все ячейки (кроме первой) из столбца A из Sheet2, которые не пусты, и использовать их в качестве списка для проверки данных в диапазоне 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 невозможно добавить ссылку на другой лист для проверки данных.


person ExcelDummy    schedule 27.09.2010    source источник


Ответы (2)


Если вы хотите, чтобы ваш список проверки пересекался с рабочими листами, вам необходимо определить именованный диапазон для данных проверки. В 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'!")
person Tmdean    schedule 27.09.2010

Я никогда не сталкивался с проблемой пересечения листов с Excel 2003.

Ваше описание сбивает с толку, что и где, поэтому вот предположение о каком-то коде, с которым вы можете поиграть, чтобы заставить его работать. Все пойдет намного быстрее, если вы начнете с загрузки своего списка в массив и будете работать с ним оттуда, но «vrange» даст вам диапазон для списка.

Поместите заголовок и прочее в столбец A листа с именем «B», и этот код должен дать вам то, что вам нужно.

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
person Marc Thibault    schedule 27.09.2010