Вы не можете сделать Range("I5:I1222") = "Done"
, так как программа должна сообщить вам, когда вы попытаетесь запустить его.
Похоже, вы хотите проверить ячейку вашего списка, поэтому вы должны использовать значение Range().value
.
Скажите, что ваш раскрывающийся список находится на I5
, тогда вы можете использовать If Range("I5").value = "Done" Then
Это, однако, напечатает дату 2500 раз, и это не похоже на то, что вы хотите.
Мой лучший вывод из этого, что у вас есть один выпадающий список в каждой строке, и вы хотите проверить их и напечатать дату в текущей строке.
Сделайте это, вам придется пройти через диапазон I5:I1222
и проверить каждое значение, например:
Dim listR As Range, cell As Range
Set listR = Range("I5:I1222")
For Each cell In listR
If cell.Value2 = "Done" Then
With Application.Union(Range(cell.Address).Offset(0, 2), Range(cell.Address).Offset(0, 4))
.Value2 = Date
.NumberFormat = "m/d/yyyy"
End With
End If
Next cell
Но это заменит каждую старую дату, установленную ранее. И это не похоже на то, что вы хотите сделать.
Вы можете добавить условие, чтобы проверить, существует ли уже дата, например, изменив ячейку if на If.Value2 = "Готово" и диапазон (ячейка.Адрес).Offset (0, 2) = "" Тогда или аналогично.
Вы также можете вызвать подпрограмму как событие worksheet_change, что позволит добавить дату, как только вы выберете "Готово" в раскрывающемся меню, и записывать только в эту конкретную строку.
Это можно сделать, поместив код непосредственно на лист, а не в модуль:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range(Target.Address), Range("I5:I1222")) Is Nothing Then
If Target.Value2 = "Done" Then
With Application.Union(Range(Target.Address).Offset(0, 2), Range(Target.Address).Offset(0, 4))
.Value2 = Date
.NumberFormat = "m/d/yyyy"
End With
End If
End If
End Sub