Vba excel записать в ячейку дату

ГЛАВНАЯ

ТРЕНИНГИ

   Быстрый старт
   Расширенный Excel
   Мастер Формул
   Прогнозирование
   Визуализация
   Макросы на VBA

КНИГИ

   Готовые решения
   Мастер Формул
   Скульптор данных

ВИДЕОУРОКИ

ПРИЕМЫ

   Бизнес-анализ
   Выпадающие списки
   Даты и время
   Диаграммы
   Диапазоны
   Дубликаты
   Защита данных
   Интернет, email
   Книги, листы
   Макросы
   Сводные таблицы
   Текст
   Форматирование
   Функции
   Всякое
PLEX

   Коротко
   Подробно
   Версии
   Вопрос-Ответ
   Скачать
   Купить

ПРОЕКТЫ

ОНЛАЙН-КУРСЫ

ФОРУМ

   Excel
   Работа
   PLEX

© Николай Павлов, Planetaexcel, 2006-2022
info@planetaexcel.ru


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

Техническая поддержка сайта

ООО «Планета Эксел»

ИНН 7735603520


ОГРН 1147746834949
        ИП Павлов Николай Владимирович
        ИНН 633015842586
        ОГРНИП 310633031600071 

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

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

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

Для автоматической записи текущей даты и времени в первую ячейку очередной записи базы данных на листе 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

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

В приложении Excel все данные как правило находятся в ячейках на листах, с которыми макросы работают как с базой данных. Поэтому, начинающему программисту VBA важно понимать как читать значения из ячейки Excel в переменные или массивы и, наоборот, записывать какие-либо значения на лист в ячейки.

Обращение к конкретной ячейке

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

Полный путь к ячейке A1 в Книге1 на Листе1 можно записать двумя вариантами:

  • С помощью Range
  • С помощью Cells

Пример 1: Обратиться к ячейке A3 находящейся в Книге1 на Листе1

Workbooks("Книга1.xls").Sheets("Лист1").Range("A3") ' Обратиться к ячейке A3
Workbooks("Книга1.xls").Sheets("Лист1").Cells(3, 1) ' Обратиться к ячейке в 3-й строке и 1-й колонке (A3)

Однако, как правило, полный путь редко используется, т.к. макрос работает с Книгой, в которой он записан и часто на активном листе. Поэтому путь к ячейке можно сократить и написать просто:

Пример 2: Обратиться к ячейке A1 в текущей книге на активном листе

Range("A1")
Cells(1, 1)

Если всё же путь к книге или листу необходим, но не хочется его писать при каждом обращении к ячейкам, можно использовать конструкцию With End With. При этом, обращаясь к ячейкам, необходимо использовать в начале «.» (точку).

Пример 3: Обратиться к ячейке A1 и B1 в Книге1 на Листе2.

With Workbooks("Книга1").Sheets("Лист2")
  ' Вывести значение ячейки A1, которая находится на Листе2
  MsgBox .Range("A1")
  ' Вывести значение ячейки B1, которая находится на Листе2
  MsgBox .Range("B1")
End With

Так же, можно обратиться и к активной (выбранной в данный момент времени) ячейке.

Пример 4: Обратиться к активной ячейке на Листе3 текущей книги.

Application.ActiveCell ' полная запись
ActiveCell ' краткая запись

Чтение значения из ячейки

Есть 3 способа получения значения ячейки, каждый из которых имеет свои особенности:

  • Value2 — базовое значение ячейки, т.е. как оно хранится в самом Excel-е. В связи с чем, например, дата будет прочтена как число от 1 до 2958466, а время будет прочитано как дробное число. Value2 — самый быстрый способ чтения значения, т.к. не происходит никаких преобразований.
  • Value — значение ячейки, приведенное к типу ячейки. Если ячейка хранит дату, будет приведено к типу Date. Если ячейка отформатирована как валюта, будет преобразована к типу Currency (в связи с чем, знаки с 5-го и далее будут усечены).
  • Text — визуальное отображение значения ячейки. Например, если ячейка, содержит дату в виде «число месяц прописью год», то Text (в отличие от Value и Value2) именно в таком виде и вернет значение. Использовать Text нужно осторожно, т.к., если, например, значение не входит в ячейку и отображается в виде «#####» то Text вернет вам не само значение, а эти самые «решетки».

По-умолчанию, если при обращении к ячейке не указывать способ чтения значения, то используется способ Value.

Пример 5: В ячейке A1 активного листа находится дата 01.03.2018. Для ячейки выбран формат «14 марта 2001 г.». Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.

MsgBox Cells(1, 1)        ' выведет 01.03.2018
MsgBox Cells(1, 1).Value  ' выведет 01.03.2018
MsgBox Cells(1, 1).Value2 ' выведет 43160
MsgBox Cells(1, 1).Text   ' выведет 01 марта 2018 г.

Dim d As Date
d = Cells(1, 1).Value2    ' числовое представление даты преобразуется в тип Date
MsgBox d                  ' выведет 01.03.2018

Пример 6: В ячейке С1 активного листа находится значение 123,456789. Для ячейки выбран формат «Денежный» с 3 десятичными знаками. Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.

MsgBox Range("C1")        ' выведет 123,4568
MsgBox Range("C1").Value  ' выведет 123,4568
MsgBox Range("C1").Value2 ' выведет 123,456789
MsgBox Range("C1").Text   ' выведет 123,457р.

Dim c As Currency
c = Range("C1").Value2    ' значение преобразуется в тип Currency
MsgBox c                  ' выведет 123,4568

Dim d As Double
d = Range("C1").Value2    ' значение преобразуется в тип Double
MsgBox d                  ' выведет 123,456789

При присвоении значения переменной или элементу массива, необходимо учитывать тип переменной. Например, если оператором Dim задан тип Integer, а в ячейке находится текст, при выполнении произойдет ошибка «Type mismatch». Как определить тип значения в ячейке, рассказано в следующей статье.

Пример 7: В ячейке B1 активного листа находится текст. Прочитать значение ячейки в переменную.

Dim s As String
Dim i As Integer
s = Range("B1").Value2 ' успех
i = Range("B1").Value2 ' ошибка

Таким образом, разница между Text, Value и Value2 в способе получения значения. Очевидно, что Value2 наиболее предпочтителен, но при преобразовании даты в текст (например, чтобы показать значение пользователю), нужно использовать функцию Format.

Запись значения в ячейку

Осуществить запись значения в ячейку можно 2 способами: с помощью Value и Value2. Использование Text для записи значения не возможно, т.к. это свойство только для чтения.

Пример 8: Записать в ячейку A1 активного листа значение 123,45

Range("A1") = 123.45
Range("A1").Value = 123.45
Range("A1").Value2 = 123.45

Все три строки запишут в A1 одно и то же значение.

Пример 9: Записать в ячейку A2 активного листа дату 1 марта 2018 года

Cells(2, 1) = #3/1/2018#
Cells(2, 1).Value = #3/1/2018#
Cells(2, 1).Value2 = #3/1/2018#

В данном примере тоже запишется одно и то же значение в ячейку A2 активного листа.

Визуальное отображение значения на экране будет зависеть от того, какой формат ячейки выбран на листе.

Когда я пытаюсь вывести дату в Excel в формате dd/mm/yyyy hh, у меня это получается, дата выглядит, как и предполагалось:

20/10/2016 17

20/10/2016 18

В случае выше я вывожу дату и время следующим образом:

nRowDate = 1
For nDay = 20 To 21
    For nHour = 0 To 23
                If (nDay < 10) Then
                    Str = "0" + CStr(nDay) + "/" + MonthNumber + "/" + Year + " "
                Else
                    Str = CStr(nDay) + "/" + MonthNumber + "/" + Year + " "
                End If
                
                If (nHour < 10) Then
                    Str = Str + "0" + CStr(nHour)
                Else
                    Str = Str + CStr(nHour)
                End If
                
                Date_Array(nRowDate) = Str
                nRowDate = nRowDate + 1
                Cells(nRowDate, 1).Value = Format(Str, "dd/mm/yyyy hh")
          
    Next nHour
Next nDay

Но вывести дату в формате dd/mm/yyyy hh:mm:ss у меня не получается, вывод выглядит следующим образом:

20.10.2016 00:00:00

20.10.2016 00:00:10

Вот код:

nRowDate = 1
For nDay = 20 To 21
    For nHour = 0 To 23
        For nMinutes = 0 To 60
            For nSec = 0 To 5
                If (nDay < 10) Then
                    Str = "0" + CStr(nDay) + "/" + MonthNumber + "/" + Year + " "
                Else
                    Str = CStr(nDay) + "/" + MonthNumber + "/" + Year + " "
                End If
                
                If (nHour < 10) Then
                    Str = Str + "0" + CStr(nHour)
                Else
                    Str = Str + CStr(nHour)
                End If
                
                If (nMinutes < 10) Then
                    Str = Str + ":0" + CStr(nMinutes)
                Else
                   Str = Str + ":" + CStr(nMinutes)
                End If
                
                If (nSec = 0) Then
                    Str = Str + ":00"
                Else
                    Str = Str + ":0" + CStr(nSec * 10)
                End If
            
                Date_Array(nRowDate) = Str
                nRowDate = nRowDate + 1
                Cells(nRowDate, 1).Value = Format(Str, "dd/mm/yyyy hh:mm:ss")
        
            Next nSec
        Next nMinutes
    Next nHour
Next nDay

Где я ошиблась?..

#установка даты в ячейку

laik

Дата: Пятница, 01.05.2020, 09:46 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 2


Репутация:

0

±

Замечаний:
0% ±


Excel 2019

Создайте новую книгу Excel. Переименуйте ее в “Объектная модель”.

Создайте в ней процедуру, которая будет переименовывать первый лист (новое имя листа — “Объектная модель”).

После этого, обращаясь в коде к этому листу по имени, процедура должна заносить в ячейку A1 текущую дату.
Вот как получилось у меня(только учась создавать макросы)
[vba]

Код

Sub unification()
‘даем имя листу
Sheets(«Лист1»).Select
Sheets(«Лист1»).Name = «Объектная модель»
‘на данном листе
Sheets(«Объектная модель»).Select
‘в ячейке А1 вводим формулу тдата
Range(«A1»).Select
ActiveCell.FormulaR1C1 = «=NOW()»

End Sub

[/vba]

Но проблема в том, что дата не открывается автоматически. Нужно сделать так, чтобы он начинался автоматически при открытии страницы, и в ячейке A1 прописывалась дата через =NOW()
Подскажите пожалуйста, где ошибка. Спасибо.

Сообщение отредактировал laikПятница, 01.05.2020, 09:57

 

Ответить

_Boroda_

Дата: Пятница, 01.05.2020, 11:21 |
Сообщение № 2

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Два варианта
[vba]

Код

Sub unification() ‘ с проверкой на то, что первый лист уже называется «Объектная модель»
‘ но это наверное лишнее, ведь по условию задачи мы книгу только что создали
    shn_ = «Объектная модель»
    If Sheets(1).Name <> shn_ Then
        Sheets(1).Name = shn_
    End If
    Sheets(shn_).Range(«A1») = Date
End Sub

Sub unification1() ‘ без проверки
    Sheets(1).Name = «Объектная модель»
    Sheets(«Объектная модель»).Range(«A1») = Date
End Sub

[/vba]

Нужно сделать так, чтобы он (1) начинался автоматически при открытии страницы (2), и в ячейке A1 прописывалась дата через =NOW() (3)

1. Он — это кто? Макрос?
2. Про это в условии ничего не сказано
3. Это будет формула. А у Вас в задании просто заносить дату. Не формулой, а просто дату
Еще
4. Первый лист вовсе не обязательно называется «Лист1». Поэтому работаем не с Sheets(«Лист1»), а с листом с индексом, равным 1
5. Select на лист и на ячейку вовсе не обязательны — замедляют работу, ухудшают читабельность кода и вообще моветон
6. Если нужно, чтобы дата изменялась при открытии страницы (предположу, что это значит «при активации листа»), то немного иначе все. Отдельным макросом переименовываем лист, а вторым макросом, лежащим в модуле листа (см. справку), при активации листа переписываем дату
[vba]

Код

Private Sub Worksheet_Activate()
    Range(«A1») = Date
End Sub

[/vba]
7. Если же дату нужно переписывать не при активации листа, а при открытии книги (так было бы грамотнее, если, конечно, книга не бывает открыта в 12 ночи, когда дата сменяется), то код для даты пишем ужа в модуле книги
[vba]

Код

Private Sub Workbook_Open()
    Sheets(«Объектная модель»).Range(«A1») = Date
End Sub

[/vba]


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

laik

Дата: Пятница, 01.05.2020, 17:07 |
Сообщение № 3

Группа: Пользователи

Ранг: Прохожий

Сообщений: 2


Репутация:

0

±

Замечаний:
0% ±


Excel 2019

Спасибо, попробую исправить и отпишусь.
задание было такое:
«Создайте новую книгу Excel. Переименуйте ее в “Объектная модель”.

Создайте в нем процедуру, которая будет переименовывать первый лист (новое имя листа — “Объектная модель”).

После этого, обращаясь в коде к этому листу по имени, процедура должна заносить в ячейку A1 текущую дату.»
Но после того,как я написала свой макрос
[vba]

Код

Sub unification()
‘даем имя листу
Sheets(«Лист1»).Select
Sheets(«Лист1»).Name = «Объектная модель»
‘на данном листе
Sheets(«Объектная модель»).Select
‘в ячейке А1 вводим формулу тдата
Range(«A1»).Select
ActiveCell.FormulaR1C1 = «=NOW()»

End Sub

[/vba]
мне ответили:
«К сожалению, макрос не сработал. Нужно сделать так, чтобы он начинался автоматически при открытии страницы, и в ячейке A1 прописывалась дата через =NOW()»

Спасибо за помощь

Сообщение отредактировал Serge_007Четверг, 11.11.2021, 16:19

 

Ответить

_Boroda_

Дата: Пятница, 01.05.2020, 20:21 |
Сообщение № 4

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

— Прочитайте Правила форума
— Оформите код тегами (в режиме правки поста выделите код и нажмите кнопку #, пояснялка здесь)


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

ElenaOren

Дата: Четверг, 11.11.2021, 15:23 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 12


Репутация:

0

±

Замечаний:
0% ±


Excel 2002

[vba]

Код

Private Sub Workbook_Open()
Sheets(«Объектная модель»).Range(«A1») = Date
End Sub

[/vba]

Здравствуйте. А как сделать так, чтобы в ячейку куда вставляется дата, перед датой стояло слово «от»? Н-р, от 11.11.2021

Сообщение отредактировал Serge_007Четверг, 11.11.2021, 15:44

 

Ответить

Serge_007

Дата: Четверг, 11.11.2021, 15:43 |
Сообщение № 6

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Здравствуйте

[vba]

Код

Sub ElenaOren()
      Range(«A1») = «от » & Date
End Sub

[/vba]


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

ElenaOren

Дата: Четверг, 11.11.2021, 15:49 |
Сообщение № 7

Группа: Пользователи

Ранг: Новичок

Сообщений: 12


Репутация:

0

±

Замечаний:
0% ±


Excel 2002

Спасибо, Serge_007!

Сообщение отредактировал Serge_007Четверг, 11.11.2021, 16:18

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Vba excel заменить текст в ячейке
  • Vba excel если значение в ячейке текст
  • Vba excel заменить значение ячейки
  • Vba excel если дата между
  • Vba excel заменить запятую на точку в excel