Вместо этого вы можете использовать динамический массив в определении Formula1. Посмотрите этот код, но я не уверен, что вы ищете это:
ПРИМЕЧАНИЕ. У этого решения есть предел -> LEN (Join (arr (), ",")) <=8190 </strong>
Dim bAddNewItem As Boolean
Dim arr()
' Fill out an array once somewhere at the beginning of the procedure
arr = Application.Transpose(Sheet("HR").Range("C:C").SpecialCells(xlCellTypeConstants).Value)
' If You want to add new item change to True
bAddNewItem = False
With Selection.Validation
.Delete
If bAddNewItem Then
ReDim Preserve arr(LBound(arr) To UBound(arr) + 1)
arr(UBound(arr)) = Selection.Value
End If
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=Join(arr(), ",")
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Если вы хотите работать с большими данными, необходимо использовать именованные диапазоны
' Add this line before updating Column C
ActiveWorkbook.Names.Add name:="myRng", RefersTo:="=" & Sheet("HR").Range("C:C").SpecialCells(xlCellTypeConstants).Address
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=myRng"
' rest of code