#excel #vba
#excel #vba
Вопрос:
У меня есть точка в моем предприятии VBA, где я не могу избежать использования циклов. На этот раз я также должен сделать это с помощью метода смещения. Я просмотрел другие проводки, но код был очень длинным и выглядел достаточно сложным, поэтому я не мог понять, как упростить их для своих нужд. Я надеюсь, что кто-нибудь сможет мне помочь. У меня есть таблица в Excel, и все мои столбцы в моей таблице имеют имя (на мой взгляд, это упрощает VBA). Я пытаюсь выполнить триггер worksheet_activiate, который будет перебирать каждую строку в столбце C (с именем «recordstatus»). И если значение ячейки равно «в процессе», затем просмотрите 5 столбцов в столбце I (с именем «DeliveryDueDate»). Если срок доставки меньше новой даты (новая дата, которую я уже определил в своем коде), тогда статус записи равен «Открыто», иначе сохраните его как «В процессе».
Ниже приведен код, который у меня есть до сих пор. Я протестировал циклические и обрезные работы, но установлю для всех записей значение «открыть», даже если срок доставки превышает то, что я определяю в коде. Я также проверил, чтобы убедиться, что код возвращается с правильным диапазоном дат, и это так. Похоже, код просто не распознает мое смещение, чтобы посмотреть на дату и определить, должен ли статус записи измениться или остаться прежним. Любая помощь будет принята с благодарностью. Я нахожусь в конце этого проекта !!! 🙂
Dim c As Range
For Each c In Range("recordstatus")
If c.Value = "In Process" Then
Dim today As Date
Dim newdate As Date
today = Now()
newdate = today 60
If c.Offset(, 5) < newdate Then
MsgBox ("works")
c.Value = "Open"
Else
c.Value = "In Process"
End If
End If
Next
Комментарии:
1. I на самом деле 6 столбцов из C?
2. Вероятно, также стоит проверить, что в Col I действительно есть значение, прежде чем сравнивать с
newdate
3. ха-ха, да, ваш правильный SJR. Я забыл, что у меня есть скрытый столбец, поэтому он сбил мой счет. Я настроил его, и, похоже, теперь он работает нормально. Я не могу поверить, что я это сделал. Спасибо, что заставили меня взглянуть на это еще раз.
4. @TimWilliams спасибо за отзыв. Дата доставки вводится из пользовательской формы, но я проверил свои настройки проверки для этого поля после события обновления, у меня не было проверки для этого. Теперь я делаю так, чтобы позаботиться об этом! Еще раз спасибо!!!!
Ответ №1:
Используйте именованный диапазон
- Одна из причин использования именованных диапазонов — избегать использования неправильных диапазонов (столбцов).
Код
Option Explicit
Sub updateProgress()
Dim src As Range
Set src = Range("DeliveryDueDate")
Dim tgt As Range
Set tgt = Range("recordstatus")
Dim today As Date
today = Now()
Dim newdate As Date
newdate = today 60
Dim i As Long
For i = 1 To tgt.Cells.Count
If tgt.Cells(i).Value = "In Process" Then
If src.Cells(i) < newdate Then
MsgBox "works"
tgt.Cells(i).Value = "Open"
Else
tgt.Cells(i).Value = "In Process"
End If
End If
Next
End Sub
Комментарии:
1. нравится код. Спасибо. Я собираюсь также попробовать это и убедиться, что я понимаю все, что вы мне дали, чтобы я мог лучше понимать циклы и смещения вместе.