цикл и смещение для определения значения ячейки

#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. нравится код. Спасибо. Я собираюсь также попробовать это и убедиться, что я понимаю все, что вы мне дали, чтобы я мог лучше понимать циклы и смещения вместе.