Выделите ячейки условно и используйте в качестве списка проверки данных - PullRequest
1 голос
/ 27 сентября 2010

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

Ответы [ 2 ]

0 голосов
/ 27 сентября 2010

Если вы хотите, чтобы ваш список проверки находился в нескольких листах, вам нужно определить именованный диапазон для данных проверки. В 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 голосов
/ 27 сентября 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
...