Есть две проблемы; во-первых, вам не хватает обязательного аргумента для функции End, которая является именованной константой Excel для обозначения направления.
вместо
Worksheets("Misc").Cells(2, i).End
в этой строке попробуйте
Worksheets("Misc").Cells(2, i).End(xlDown)
Вы также можете использовать xlLeft, вправо или вверх, но, я думаю, вы ищете именно down.
Вторая проблема - значение для Formula1 должно быть строковым адресом (я думаю), и вы передаете объект фактического диапазона.
Попробуйте это для этой строки
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=Range(Worksheets("Misc").Cells(2, i), Worksheets("Misc").Cells(2, i).End(xlDown)).Address
Это сработало на моей машине без ошибок. Я, конечно, заглушил фиктивные данные, поэтому не знаю, подходит ли он для вашего рабочего листа
РЕДАКТИРОВАТЬ (в ответ на комментарий Стэна)
Там может быть более сексуальный путь, но это хорошо и просто (что само по себе тоже сексуально); оператор if просто проверяет ячейку в следующей строке. Если он не пустой, то он работает с тем же решением, что и раньше. Если он пуст, он использует только одну ячейку в качестве диапазона проверки.
For i = 1 To 10
If Worksheets("Misc").Cells(3, i).Value <> "" Then
Set validationRange = Range(Worksheets("Misc").Cells(2, i), Worksheets("Misc").Cells(2, i).End(xlDown))
Else
Set validationRange = Worksheets("Misc").Cells(2, i)
End If
With Worksheets("Drop-down").Cells(i, 2).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Formula1:=validationRange.Address.......
Я сложил твои
Worksheet.Selection
Selection.DoStuff
пар, в
Worksheet.DoStuff
Я думаю, это выглядит немного лучше.
Дайте мне знать, если это работает для вас!