не обращайте внимания на мои первые два вопроса:D Я уже нашел решение для этого

но для этого это немного сложно для меня, так как я не очень хорош в макросе, особенно в его функции Condition.

У меня есть этот условный код для моего макроса, я не знаю, как отобразить текущую дату, если значение ячейки эквивалентно DONE

If Range("I5:I1222") = "Done" Then
    With Range("K5:K1222, M5:M1222")
        .Value = Date
        .NumberFormat = "m/d/yyyy"
    End With
End If

У меня есть выпадающий список, который содержит

Done
Cancelled
Ongoing

если выбор пользователя сделан, текущая дата будет отображаться в двух ячейках (столбец I и столбец M)

1 ответ1

1

Вы не можете сделать 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .