Почему мой массив не включает существующие выпадающие значения? - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь вырезать мастер-файл. Столбцы P и R содержат данные в некоторых строках, а некоторые - нет. Я хочу сказать VBA, что если в этой строке есть данные, не создавайте раскрывающийся список, но если данных нет, создайте раскрывающийся список для менеджера.

Как бы я изменил свой модуль проверки данных, чтобы сказать if there is data already in there, ignore creating a drop down, but create a drop down option for any blank cells in those two columns

Вот мой оригинальный модуль:

Sub DataValidation()

    lastrow = ActiveWorkbook.Worksheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row

    With Range("P2:P" & lastrow).Validation
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, _
                Formula1:="Yes - Regularly Works Eligible Shift,No - Does Not Regularly Work Eligible Shift"
        .IgnoreBlank = True
        .InCellDropdown = True
    End With

    With Range("R2:R" & lastrow).Validation
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                Operator:=xlBetween, Formula1:="8%,10%,12%,15%"
        .IgnoreBlank = True
        .InCellDropdown = True
    End With

End Sub

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Попробуйте использовать следующий код для цели только эти пустые ячейки:

Sub DataValidation()

    lastrow = ActiveWorkbook.Worksheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row

    With Range("P2:P" & lastrow).SpecialCells(xlCellTypeBlanks).Validation
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
        Operator:=xlBetween, Formula1:="Yes - Regularly Works Eligible Shift,No - Does Not Regularly Work Eligible Shift"
        .IgnoreBlank = True
        .InCellDropdown = True
    End With

    With Range("R2:R" & lastrow).SpecialCells(xlCellTypeBlanks).Validation
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
        Operator:=xlBetween, Formula1:="8%,10%,12%,15%"
        .IgnoreBlank = True
        .InCellDropdown = True
    End With

End Sub

РЕДАКТИРОВАТЬ: есть одна ошибка для ловушки. Если все Range("P2:P" & lastRow) пусто, код вернет ошибку. Это связано с тем, что вызов метода .SpecialCells возвращает объект Range, за исключением как минимум 1 ячейки.

Обходной путь - использовать обработку ошибок и сохранять диапазон в переменной. Если все ячейки пусты, то все они нуждаются в проверке. В противном случае, проверяйте только те ячейки, которые не заполнены (если вы действительно никогда не предвидите этого, тогда вы можете пропустить это). Код ниже:

Sub DataValidation()
    Dim rng As Range

    lastrow = ActiveWorkbook.Worksheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row

    On Error Resume Next
    Set rng = Range("P2:P" & lastrow).SpecialCells(xlCellTypeBlanks)
    On Error GoTo 0

    If rng Is Nothing Then
        With Range("P2:P" & lastrow).Validation
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
            Operator:=xlBetween, Formula1:="Yes - Regularly Works Eligible Shift,No - Does Not Regularly Work Eligible Shift"
            .IgnoreBlank = True
            .InCellDropdown = True
        End With
    Else
        With rng.Validation
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
            Operator:=xlBetween, Formula1:="Yes - Regularly Works Eligible Shift,No - Does Not Regularly Work Eligible Shift"
            .IgnoreBlank = True
            .InCellDropdown = True
        End With
    End If

    'Reset to reuse with the R column
    Set rng = Nothing

    On Error Resume Next
    Set rng = Range("R2:R" & lastrow).SpecialCells(xlCellTypeBlanks)
    On Error GoTo 0

    If rng Is Nothing Then
        With Range("R2:R" & lastrow).Validation
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
            Operator:=xlBetween, Formula1:="8%,10%,12%,15%"
            .IgnoreBlank = True
            .InCellDropdown = True
        End With
    Else
        With rng.Validation
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
            Operator:=xlBetween, Formula1:="8%,10%,12%,15%"
            .IgnoreBlank = True
            .InCellDropdown = True
        End With
    End If

End Sub
0 голосов
/ 19 ноября 2018

Вы могли бы сделать что-то вроде этого

With Range("I1:I" & lastrow).SpecialCells(xlCellTypeBlanks).Validation
 .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
 Operator:=xlBetween, Formula1:="8%,10%,12%,15%"
 .IgnoreBlank = True
 .InCellDropdown = True
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...