Попробуйте использовать следующий код для цели только эти пустые ячейки:
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