Перейти к содержимому

VBA Excel. Автоматическая запись текущей даты и времени

Автоматическая запись текущей даты и времени в новой строке базы данных на листе Excel.

Если в базу данных, организованную на листе Excel, приходится ежедневно вносить несколько десятков записей, просто необходимо обеспечить возможность автоматического заполнения первой ячейки каждой новой записи текущей датой (если, конечно, текущая дата предусмотрена в вашей базе данных). И, конечно, первому столбцу, в который будет записываться дата, необходимо задать подходящий формат отображения даты и, если нужно, времени.

  1. Самый простой код для записи даты
  2. Добавление второго условия в процедуру
  3. Запись текущей даты с учетом трех условий
  4. Самый лучший вариант для использования
  5. Можно сделать и так

Самый простой код для записи даты

Для автоматической записи текущей даты и времени в первую ячейку очередной записи базы данных на листе Excel, необходимо открыть редактор VBA Excel и в проводнике дважды кликнуть на листе с базой данных, чтобы открылся модуль листа, в который поместить следующую процедуру с проверкой условия, что ячейка выбрана именно во втором столбце:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Column = 2  Then Cells(ActiveCell.Row, 1) = Now
End Sub

При выборе ячейки во втором столбце таблицы, в первую ячейку автоматически записываются текущие дата и время. Записываются они независимо от того, занята первая ячейка или пустая, если она не пустая, то значение перезаписывается. Чтобы случайно не перезаписать нужную дату, случайно выбрав вторую ячейку уже заполненной записи внутри таблицы, необходимо добавить дополнительное условие, как в коде ниже.

Добавление второго условия в процедуру

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Column = 2 And Cells(ActiveCell.Row, 1) = 0 Then
    Cells(ActiveCell.Row, 1) = Now
  End If
End Sub

При выборе второй ячейки заполняемой строки, если первая ячейка пуста, в неё автоматически записываются текущие дата и время. Если ячейка не пуста, то перезаписи значения не произойдет. Но, в данном случае, при выборе ячейки во втором столбце ниже первой пустой строки, дата будет также записываться в первую ячейку, что не совсем удобно.

Запись текущей даты с учетом трех условий

Можно добавить еще условие, при котором текущая дата будет записываться, если только ячейка в первом столбце и строкой выше непустая.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Column = 2 And Cells(ActiveCell.Row, 1) = 0 _
     And Cells(ActiveCell.Row - 1, 1) <> 0 Then
     Cells(ActiveCell.Row, 1) = Now
  End If
End Sub

Самый лучший вариант для использования

Если использовать предыдущую процедуру, то при выборе любой ячейки в первой строке генерируется ошибка. Она возникает из-за того, что, когда выбрана ячейка в первой строке, ячейки Cells(ActiveCell.Row - 1, 1) не существует. Чтобы избежать этой ошибки, необходимо добавить в первую группу условий проверку на то, что индекс строки выбранной ячейки не равен единице, а проверку ячейки Cells(ActiveCell.Row - 1, 1) вынести во второй блок If ... End If, который будет выполняться только при выполнении условий первого блока.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Column = 2 And Target.Row > 1 And _
     Cells(ActiveCell.Row, 1) = 0 Then
     If Cells(ActiveCell.Row - 1, 1) <> 0 Then
        Cells(ActiveCell.Row, 1) = Now
     End If
  End If
End Sub

Эту процедуру VBA Excel уже можно использовать на практике.

Можно сделать и так

Предыдущий код является самым подходящим при записи нескольких строк ежедневно, а если добавляется одна запись в день, его можно дополнительно подкорректировать. Необходимость коррекции заключается в том, что при нажатии клавиши «Enter», находясь во втором столбце, что естественным образом происходит при заполнении таблицы из двух колонок, в следующей пустой строке записывается текущая дата, хотя там должна быть уже следующая. Чтобы этого избежать, нужно добавить еще одно условие для сравнения записываемого числа месяца с уже записанным в предыдущей строке.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Column = 2 And Target.Row > 1 And _
     Cells(ActiveCell.Row, 1) = 0 Then
     If Cells(ActiveCell.Row - 1, 1) <> 0 And _
     Day(Cells(ActiveCell.Row - 1, 1)) < Day(Now) Then
        Cells(ActiveCell.Row, 1) = Now
     End If
  End If
End Sub

Можно сделать и так, а можно и не делать. Это только для тех, кто, как и я, помешан на VBA и все, до мелочей, автоматизирует. Согласитесь, что один раз в день можно дату набрать и на клавиатуре, а при необходимости ежедневных однократных записей ее можно протянуть вниз сразу на один-два месяца вперед.

Добавить комментарий