Макрос даты изменения ячейки excel

Автоматическая вставка текущей даты в ячейку при вводе данных

Предположим, у нас имеется таблица заказов, куда пользователь вводит номер заказа, имя клиента, сумму и т.д. Необходимо сделать так, чтобы при внесении номера заказа в столбец А — в столбце B напротив введенного заказа автоматически появлялись дата и время его занесения:

date_auto_enter3.png

Чтобы реализовать такой ввод даты, нам потребуется простой макрос, который надо добавить в модуль рабочего листа. Для этого щелкните правой кнопкой мыши по ярлычку листа с таблицей и выберите в контекстном меню команду Исходный текст (View code).

В открывшееся окно редактора Visual Basic скопируйте этот текст этого макроса:

Private Sub Worksheet_Change(ByVal Target As Range)
    
    For Each cell In Target   'проходим по всем измененным ячейкам
       If Not Intersect(cell, Range("A2:A100")) Is Nothing Then  'если изменененная ячейка попадает в диапазон A2:A100
            With cell.Offset(0, 1)         'вводим в соседнюю справа ячейку дату
               .Value = Now
               .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
            End With
       End If
    Next cell
End Sub

При необходимости измените «чувствительный» диапазон «А2:А100» на свой собственный. Если необходимо вставлять дату не в соседний столбец, а правее — подставьте в оператор Offset(0,1) вместо 1 число побольше.

Закройте редактор Visual Basic и попробуйте ввести что-нибудь в диапазон А2:А100. В соседней ячейке тут же появится текущая дата-время!

Ссылки по теме

  • Как сделать выпадающий календарь для быстрого ввода любой даты мышью в любую ячейку.
  • Как Excel работает с датами
  • Что такое макрос, как он работает, куда копировать текст макроса, как запустить макрос?

Отображение даты и времени изменения ячейки

ArkaIIIa

Дата: Четверг, 05.06.2014, 16:34 |
Сообщение № 1

Группа: Проверенные

Ранг: Ветеран

Сообщений: 894


Репутация:

115

±

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


2010

Господа,

В приложенном файле есть готовый макрос, который показывает в столбце B даты и время изменения соответствующих строк столбца A.
Помогите, пожалуйста, преобразовать его таким образом, чтобы он просматривал столбцы, а не строки. Т.е., чтобы при изменении ячейки A1 — в ячейке A5 отображалась дата и время изменения, при изменении ячейки B1 — в B5 и т.д.

К сообщению приложен файл:

__01.xls
(40.5 Kb)

 

Ответить

Karbofox

Дата: Четверг, 05.06.2014, 16:42 |
Сообщение № 2

Группа: Проверенные

Ранг: Участник

Сообщений: 69


Репутация:

16

±

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


Excel 2010

Это имелось в виду?
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range(«A1:IV1»)) Is Nothing Then
Application.EnableEvents = False
With Target.Offset(4, 0)
If Target <> Old_Value Then
.Value = Now
.EntireColumn.AutoFit
End If
End With
End If
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range(«A1:IV1»)) Is Nothing Then
Old_Value = Target.Value
End If
End Sub

[/vba]

Сообщение отредактировал KarbofoxЧетверг, 05.06.2014, 16:43

 

Ответить

ArkaIIIa

Дата: Четверг, 05.06.2014, 16:44 |
Сообщение № 3

Группа: Проверенные

Ранг: Ветеран

Сообщений: 894


Репутация:

115

±

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


2010

Karbofox
Да, именно это, спасибо большое!

 

Ответить

Rioran

Дата: Четверг, 05.06.2014, 16:53 |
Сообщение № 4

Группа: Авторы

Ранг: Ветеран

Сообщений: 903


Репутация:

290

±

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


Excel 2013

ArkaIIIa, здравствуйте.

Посмотрите на такую переделку. Принцип:

1). Поменял EntireColumn.AutoFit на EntireRow.Autofit
2). Поменял каждый Range с A1:A100… на B1:AA4 в обоих макросах листа
3). Поменял Target.Offset(0, 1) на Target.Offset(5 — ActiveCell.Row, 0)

***

По скорости ответа меня опередили =) однако замечу, что в моём решении будет проставляться время, если изменена любая из 4-х строк выше ячейки времени.

К сообщению приложен файл:

one_way.xls
(47.5 Kb)

Сообщение отредактировал RioranЧетверг, 05.06.2014, 16:55

 

Ответить

ArkaIIIa

Дата: Четверг, 05.06.2014, 17:13 |
Сообщение № 5

Группа: Проверенные

Ранг: Ветеран

Сообщений: 894


Репутация:

115

±

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


2010

Rioran
Очень здорово. Но возник вопрос. Почему эти макросы (Ваш и Karbofox`а) работают только во вновь созданных книгах?
При переносе на ранее созданную — почему то они не работают :-(

 

Ответить

Rioran

Дата: Четверг, 05.06.2014, 17:20 |
Сообщение № 6

Группа: Авторы

Ранг: Ветеран

Сообщений: 903


Репутация:

290

±

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


Excel 2013

ArkaIIIa, у них нет никакого якоря за книгой. В какой лист их вставите — там и будут работать, лишь бы Range, с которым работаем, на самом листе находился где надо.

***

Попробовал продублировать макросы внутри листа два раза — выдает ошибку. Значит, на одном листе в один и тот же момент должны быть только один Worksheet_Change и Worksheet_SelectionChange

Сообщение отредактировал RioranЧетверг, 05.06.2014, 17:22

 

Ответить

ArkaIIIa

Дата: Четверг, 05.06.2014, 17:28 |
Сообщение № 7

Группа: Проверенные

Ранг: Ветеран

Сообщений: 894


Репутация:

115

±

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


2010

Rioran
Проблема вот в чем. У меня при помощи макроса, который прописан в модуле, из ячеек A1:A20 (условно) копируются и вставляются в ячейки B1:B20 (условно) данные.
Нужно, чтобы в B21 прописывалась дата и время вставки. Вот если руками менять данные в строке, на которую ссылается Ваш или Karbofox`а макрос — то всё ок, дата и время прописываются ниже. А если эти данные вставляются при помощи макроса — то VBA ругается.

Сообщение отредактировал ArkaIIIaЧетверг, 05.06.2014, 17:32

 

Ответить

ArkaIIIa

Дата: Четверг, 05.06.2014, 17:30 |
Сообщение № 8

Группа: Проверенные

Ранг: Ветеран

Сообщений: 894


Репутация:

115

±

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


2010

Rioran
Я думал, что макросу все равно, каким образом вносятся изменения в ячейку, и важен сам факт изменения. Но, выходит, что это не так. Почему-то конфликтуют макросы.

Сообщение отредактировал ArkaIIIaЧетверг, 05.06.2014, 17:30

 

Ответить

ArkaIIIa

Дата: Четверг, 05.06.2014, 17:36 |
Сообщение № 9

Группа: Проверенные

Ранг: Ветеран

Сообщений: 894


Репутация:

115

±

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


2010

Rioran
В общем, если на живом примере, то вот это в модуле:

[vba]

Код

Sub Update_()
     Path_1 = «F:STALE_APP_REPORT.xls»
     iFileDateTime_1 = FileDateTime(Path_1)
     Cells(27, 11) = iFileDateTime_1
     ActiveWorkbook.UpdateLink Name:= _
         «F:STALE_APP_REPORT.xls», Type:=xlExcelLinks
     Dim r As Range
     Set r = Sheets(7).Rows(2).Find(Sheets(7).[B1].Text, , xlValues, xlWhole)
     If Not r Is Nothing Then
         Sheets(7).[B3:B140].Copy
         r.Offset(1).PasteSpecial Paste:=xlPasteValues
     End If
End Sub

[/vba]

Т.е.
1) Обновляются связи с исходником
2) Прописывается время обновления исходника
3) Данные из ячеек B3:B140 листа7 копируются в соответствующие ячейки на листе 7 (смотрит время обновления исходника и вставляет в столбец, где указано такое же время)
4) Нужно, чтобы в 141 строке тех столбцов, куда вставляются данные, указывалась дата и время этой вставки.

 

Ответить

Rioran

Дата: Четверг, 05.06.2014, 17:41 |
Сообщение № 10

Группа: Авторы

Ранг: Ветеран

Сообщений: 903


Репутация:

290

±

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


Excel 2013

ArkaIIIa, Вам нужно чтобы одновременно менялось сразу два значения?

В следующем примере макросы уже, возможно, лишнее и разумнее было бы воспользоваться поиском максимального значения, но машина запущена и сделано макросом, посмотрите =)

 

Ответить

RAN

Дата: Четверг, 05.06.2014, 17:46 |
Сообщение № 11

Группа: Друзья

Ранг: Экселист

Сообщений: 5645


то это в файле.
Ваша
[vba][/vba]
сама по себе, а ошибка возникает совсем в другом месте.

 

Ответить

Rioran

Дата: Четверг, 05.06.2014, 17:46 |
Сообщение № 12

Группа: Авторы

Ранг: Ветеран

Сообщений: 903


Репутация:

290

±

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


Excel 2013

ArkaIIIa, понял, реальная задача оказалась другой. Подумаем.

 

Ответить

ArkaIIIa

Дата: Пятница, 06.06.2014, 08:11 |
Сообщение № 13

Группа: Проверенные

Ранг: Ветеран

Сообщений: 894


Репутация:

115

±

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


2010

RAN
Рабочий файл — очень объемный, и там много конфиденциальной информации. Его очень сложно будет почистить, чтобы выложить для примера :-(

Rioran
Разве вставка новых данных в ячейку (т.е. замещение одних данных другими) — не является её изменением?
Мне важно, чтобы макрос вставлял дату и время обновления любой ячейки, в рамках указанного диапазона в одном столбце. Т.е. у меня данные из B3:B140, вставляются в C3:С140, D3:D140 и т.д.
Макрос уважаемого Karbofox`а корректно работает, если данные не копипастятся, а забиваются вручную. Вы могли бы помочь адаптировать его именно под вставляемые данные?
Либо добавить что-то в эту часть макроса:
[vba]

Код

Dim r As Range
      Set r = Sheets(7).Rows(2).Find(Sheets(7).[B1].Text, , xlValues, xlWhole)
      If Not r Is Nothing Then
          Sheets(7).[B3:B140].Copy
          r.Offset(1).PasteSpecial Paste:=xlPasteValues
      End If

[/vba]
, чтобы после вставки значений, строчкой ниже указывалась дата/время вставки?

Извиняюсь, что, возможно, как-то не так изначально сформулировал задачу и большое спасибо за попытку помочь.

Сообщение отредактировал ArkaIIIaПятница, 06.06.2014, 08:11

 

Ответить

ArkaIIIa

Дата: Пятница, 06.06.2014, 08:57 |
Сообщение № 14

Группа: Проверенные

Ранг: Ветеран

Сообщений: 894


Репутация:

115

±

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


2010

Попробовал смоделировать ситуацию на новом пустом файле.
Использовал макрос:
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range(«A1:IV1»)) Is Nothing Then
Application.EnableEvents = False
With Target.Offset(4, 0)
If Target <> Old_Value Then
.Value = Now
.EntireColumn.AutoFit
End If
End With
End If
Application.EnableEvents = True
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range(«A1:IV1»)) Is Nothing Then
Old_Value = Target.Value
End If
End Sub

[/vba]
В случае, если копируется-вставляется 1 ячейка — все в порядке.
В случае, если копируется-вставляется более 1 ячейки — появляется меседжбокс с текстом «Run-time Error `13`: Type mismatch». И после этого в данной книге макрос перестает работать, подсвечивая желтым часть кода:
[vba]

Код

If Target <> Old_Value Then

[/vba]

 

Ответить

Rioran

Дата: Пятница, 06.06.2014, 10:38 |
Сообщение № 15

Группа: Авторы

Ранг: Ветеран

Сообщений: 903


Репутация:

290

±

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


Excel 2013

ArkaIIIa, я попробовал кардинально другой подход.

В области А1:J10 (отгорожено серым в файле) вставляйте оптом и смотрите, как меняются подписи на серой панели.

[vba]

Код

Option Explicit
Public Stopper As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False

Dim rngX As Range
Dim X As Long

Set rngX = Selection

If Not Intersect(rngX, Range(«a1:j10»)) Is Nothing And Stopper = False Then
     Stopper = True
     For X = 1 To rngX.Columns.Count
         rngX.Cells(1, X).Offset(11 — rngX.Cells(1, X).Row).Value = Now
     Next X
     Stopper = False
End If

Application.ScreenUpdating = True

End Sub

[/vba]

 

Ответить

ArkaIIIa

Дата: Пятница, 06.06.2014, 11:03 |
Сообщение № 16

Группа: Проверенные

Ранг: Ветеран

Сообщений: 894


Репутация:

115

±

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


2010

Rioran
Если руками копирую — вставляю — всё хорошо. Если использую макрос вставки, вот этот:
[vba]

Код

    Dim r As Range
     Set r = Sheets(7).Rows(2).Find(Sheets(7).[B1].Text, , xlValues, xlWhole)
     If Not r Is Nothing Then
         Sheets(7).[B3:B140].Copy
         r.Offset(1).PasteSpecial Paste:=xlPasteValues
     End If

[/vba]
, то выдает ошибку Run-time Error 1004: Method `Intersect` of object`_Global`failed
Т.е. я само-собой меняю указанный в Вашем макросе диапазон «a1:j10» на свой «c28:aj140» и строку с 11 на 141, и при вставке руками — все нормально работает. А вот, когда юзаю макрос вставки — беда.

 

Ответить

ArkaIIIa

Дата: Пятница, 06.06.2014, 11:14 |
Сообщение № 17

Группа: Проверенные

Ранг: Ветеран

Сообщений: 894


Репутация:

115

±

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


2010

Rioran
Нет, Вы знаете, видимо конфликт не с макросом вставки. Попробовал сделать на новом файле — все нормально работает. Сейчас более расширенный пример попробую сделать и закинуть.

 

Ответить

Rioran

Дата: Пятница, 06.06.2014, 11:24 |
Сообщение № 18

Группа: Авторы

Ранг: Ветеран

Сообщений: 903


Репутация:

290

±

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


Excel 2013


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

[vba]

Код

Sub Data_Transition_2()

Range(«m1:N3»).Copy
Range(«F2»).Select
Worksheets(«Tryal»).Paste

End Sub

[/vba]
Файл с кнопкой для теста прилагаю.

К сообщению приложен файл:

2747659.xlsm
(22.3 Kb)

Сообщение отредактировал RioranПятница, 06.06.2014, 11:25

 

Ответить

ArkaIIIa

Дата: Пятница, 06.06.2014, 11:43 |
Сообщение № 19

Группа: Проверенные

Ранг: Ветеран

Сообщений: 894


Репутация:

115

±

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


2010

Rioran
Прикладываю файл. Голова кругом идет, не знаю, с чем связана ошибка :-(
Попробую еще раз по порядку описать ситуацию на примере файла из приложения.

— Есть файл (файл из приложения), в котороый по связям из другого файла подтягиваются данные. Файл исходник обновляется автоматически каждые полчаса. Таким образом, при каждом обновлении файла из примера раз в полчаса — он подтягивает обновленные данные.
— Есть 2 макроса, засунутых в один модуль:
Первый:
[vba]

Код

Sub Update_()
      Path_1 = «F:STALE_APP_REPORT.xls»
      iFileDateTime_1 = FileDateTime(Path_1)
      Cells(27, 11) = iFileDateTime_1
      ActiveWorkbook.UpdateLink Name:= _
          «F:STALE_APP_REPORT.xls», Type:=xlExcelLinks

[/vba]
Прописывает в ячейку K27 время последнего обновления файла-исходника, откуда тянутся данные в файл-пример.
Второй:
[vba]

Код

Dim r As Range
      Set r = Sheets(7).Rows(2).Find(Sheets(7).[B1].Text, , xlValues, xlWhole)
      If Not r Is Nothing Then
          Sheets(7).[B3:B140].Copy
          r.Offset(1).PasteSpecial Paste:=xlPasteValues
      End If
End Sub

[/vba]
Берет данные из ячеек столбца B3:B140, смотрит значение времени, указанное в ячейке B1, находит в строке 2 аналогичное время, и вставляет скопированные данные.
— Нужен третий макрос, который указывал бы строчкой ниже вставленных данных (т.е. 141-ой), дату и время этой вставки.

Ваш макрос (условно назовем его Макрос № 3) работает:
— Если копировать-вставлять руками
— Если копировать-вставлять макросом вставки (№2, из описания выше)
— Но вот если задействовано все 3 макроса — то возникает сообщение: Run-time Error 1004: Method `Intersect` of object`_Global`failed

Я не понимаю, на каком этапе возникает конфликт :-(

К сообщению приложен файл:

11.xlsm
(24.4 Kb)

Сообщение отредактировал ArkaIIIaПятница, 06.06.2014, 11:44

 

Ответить

RAN

Дата: Пятница, 06.06.2014, 12:19 |
Сообщение № 20

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Ваш файлик как бы поломатый.

К сообщению приложен файл:

3474154.jpg
(18.9 Kb)

Сообщение отредактировал RANПятница, 06.06.2014, 12:21

 

Ответить

Получить и вставить время создания и время последнего изменения в ячейки

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

Получите время создания и время последнего изменения в Excel с помощью команды Info

Получите время создания и время последнего изменения в Excel с помощью функции дополнительных свойств

Вставьте созданное время и время последнего изменения в ячейки Excel с кодом VBA

Вставьте время создания и время последнего изменения в ячейки/верхний/нижний колонтитул с помощью Kutools for Excel хорошая идея3


стрелка синий правый пузырь Получите время создания и время последнего изменения в Excel с помощью команды Info

Мы можем узнать точное время создания и время последнего изменения текущей книги в представлении за кулисами Microsoft Excel 2010/2013.

Нажмите Файл > Инфо, а в правой части представления за кулисами отображается Связанные даты Информация. Под Связанные даты title, в нем указано время последнего изменения, время создания и время последней печати. См. Следующий снимок экрана:

Примечание: Этот способ доступен только в Microsoft Excel 2010/2013. Это недопустимо в Excel 2007.


стрелка синий правый пузырьПолучите время создания и время последнего изменения в Excel с помощью функции дополнительных свойств

Фактически, мы можем получить как время создания, так и время последнего изменения текущей книги в диалоговом окне «Свойства документа».
Шаг 1: Открой Дополнительные свойства диалоговое окно:

В Excel 2007 щелкните значок Офисы кнопка> Подготовить > ПредложенияИ Свойства документа панель будет отображаться под панелью инструментов, щелкните Свойства документа > Дополнительные свойства, смотрите скриншоты:

В Excel 2010/2013 щелкните значок Файл > Инфо > Предложения > Дополнительные свойства.

документ-вставка-измененное время-4-4

Шаг 2: В Дополнительные свойства В диалоговом окне вы увидите время создания и время последнего изменения на вкладке Статистика. См. Следующий снимок экрана:

документ-вставка-измененное время-4-4


стрелка синий правый пузырь Вставьте созданное время и время последнего изменения в ячейки Excel с кодом VBA

Следующие макросы VBA помогут вам напрямую вставить в ячейки время создания и время последнего изменения текущей информации книги.

Вставьте время создания и время последнего изменения в Excel

Шаг 1: Удерживайте ALT + F11 ключи, и он открывает окно Microsoft Visual Basic для приложений.

Шаг 2: Нажмите Вставить >> Модулии вставьте следующий макрос в окно модуля.

Код VBA: вставьте время создания и время последнего изменения в Excel

Sub Workbook_Open()
Range("A1").Value = Format(ThisWorkbook.BuiltinDocumentProperties("Creation Date"), "short date")
Range("A2").Value = Format(ThisWorkbook.BuiltinDocumentProperties("Last Save Time"), "short date")
End Sub

Шаг 3:Нажмите F5 ключ для запуска этого макроса. И тогда дата создания и дата последнего изменения будут вставлены в ячейку A1 и ячейку A2 отдельно.

Внимание: вы можете изменить ячейку назначения в VB в соответствии с вашими потребностями.

Вставить время последнего изменения книги в Excel

Шаг 1: Удерживайте ALT + F11 ключи, и он открывает окно Microsoft Visual Basic для приложений.

Шаг 2: Нажмите Вставить >> Модулии вставьте следующий макрос в окно модуля.

Public Function ModDate()
ModDate = Format(FileDateTime(ThisWorkbook.FullName), "m/d/yy h:n ampm")
End Function

Шаг 3: Затем сохраните и закройте этот код и вернитесь на рабочий лист, в пустой ячейке введите формулу = ModDate (), и нажмите Enter ключ. Затем он вставляет в ячейку время последнего изменения.

-2

Вставить созданное время книги в Excel

Шаг 1: Удерживайте ALT + F11 ключи, и он открывает окно Microsoft Visual Basic для приложений.

Шаг 2: Нажмите Вставить >> Модулии вставьте следующий макрос в окно модуля.

Function CreateDate() As Date
CreateDate = ActiveWorkbook.BuiltinDocumentProperties("Creation Date")
End Function

Шаг 3: Сохраните и закройте этот код, вернитесь на лист, в пустой ячейке введите формулу = CreateDate (), и нажмите Enter key. и созданная дата будет вставлена ​​в ячейку, как показано на следующих снимках экрана:

-2

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


стрелка синий правый пузырь Вставьте время создания и время последнего изменения в ячейки/верхний/нижний колонтитул с помощью Kutools for Excel

Могу я представить вам удобный инструмент —Kutools for Excel какие из более чем 300 полезных функций могут повысить эффективность вашей работы? С этими Вставить информацию о книге Вы можете быстро вставить путь к книге, имя книги / рабочего листа, имя пользователя или время создания и время последнего изменения в ячейки, верхний или нижний колонтитул.

После бесплатная установка Kutools for Excel, пожалуйста, сделайте следующее:

1. Нажмите Кутулс Плюс > Workbook > Вставить информацию о книге. Смотрите скриншот:
doc последнее изменение name2

2. Затем в Вставить информацию о книге диалоговом окне, проверьте информацию, которую вы хотите вставить из раздела информации, затем перейдите, чтобы указать место, в которое вы хотите вставить, вы можете выбрать ячейки, нижний колонтитул (левый нижний колонтитул, центральный нижний колонтитул, правый нижний колонтитул) или заголовок (левый верхний колонтитул, центральный верхний колонтитул, правый заголовок). Смотрите скриншот:
вставка документа создана, время изменения 1

3. Нажмите Ok, и проверяемая вами информация была вставлена ​​в указанное вами место.

Наконечник. Если вы хотите получить бесплатную пробную версию функции «Вставить информацию о книге», пожалуйста, перейдите к бесплатной загрузке Kutools for Excel сначала, а затем перейдите к применению операции в соответствии с вышеуказанными шагами.

стрелка синий правый пузырь Вставить информацию о книге


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

ArtistJoker

0 / 0 / 0

Регистрация: 18.11.2015

Сообщений: 2

1

18.11.2015, 17:43. Показов 9191. Ответов 11

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Привет, форумчане!

Очень прошу помочь. На работе заполняю отчёт, в котором вручную приходится вставлять дату изменений строки(не просто ячейки) с информацией по клиенту. Искал в сети помощь, нашёл только вот такой код (внесение даты изменений соседней ячейки):
———————————————————————————————————————

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Sub Worksheet_Change(ByVal Target As Range)
     
    For Each cell In Target   'проходим по всем измененным ячейкам
       If Not Intersect(cell, Range("A2:A100")) Is Nothing Then  'если изменененная ячейка попадает в диапазон A2:A100
            With cell.Offset(0, 1)         'вводим в соседнюю справа ячейку дату
               .Value = Now
               .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
            End With
       End If
    Next cell
End Sub

———————————————————————————————————————-
Может быть в этом коде можно внести изменения, чтобы при изменении строки автоматически вставлялась дата в первую ячейку строки. Как это сделать?

Заранее благодарен!

Вложения

Тип файла: xlsx Пример отчёта.xlsx (10.1 Кб, 39 просмотров)



0



Vlad999

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,930

18.11.2015, 17:58

2

Лучший ответ Сообщение было отмечено ArtistJoker как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
Application.EnableEvents = False
For Each cell In Target 'проходим по всем измененным ячейкам
  If Not Intersect(cell, Range("B2:H100")) Is Nothing Then 'если изменененная ячейка попадает в диапазон A2:A100
     With Cells(cell.Row, 1) 'вводим в первый столбец текущей строки ячейку дату
     .Value = Now
     .EntireColumn.AutoFit 'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
     End With
   End If
Next cell
Application.EnableEvents = True
End Sub



1



pashulka

4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

18.11.2015, 18:59

3

Альтернативный вариант (на основании выложенного примера)

Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row > 4 Then
       Application.EnableEvents = False
       With Intersect(Target.EntireRow, [A:A])
            .Value = Date
            .Columns.AutoFit
       End With: [H1] = Now
       Application.EnableEvents = True
    End If
End Sub

или

Visual Basic
1
2
3
4
5
6
7
8
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row > 4 Then
       Application.EnableEvents = False
       Intersect(Target.EntireRow, [A:A]) = Date
       [H1] = Now: Columns(1).AutoFit
       Application.EnableEvents = True
    End If
End Sub



1



0 / 0 / 0

Регистрация: 18.11.2015

Сообщений: 2

23.11.2015, 17:10

 [ТС]

4

Спасибо, огромное! Всё работает как надо!



0



0 / 0 / 0

Регистрация: 12.02.2020

Сообщений: 23

07.07.2020, 20:58

5

Подскажите как подкорректировать для моего случая:
На первом листе книги имеется диапазон ячеек например А2:V20. В каждую ячейку которого вносятся числовые значения.
Нужно зеркально в те же ячейки на втором листе книги вносить дату и время изменения значения ячеек на первом листе книги.



0



4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

07.07.2020, 21:00

6

gpetrv, Скажите чей вариант Вы выбрали ?



0



0 / 0 / 0

Регистрация: 12.02.2020

Сообщений: 23

07.07.2020, 22:38

7

pashulka, Мне все равно чей вариант, лишь бы рабочий……и универсальный (изменять диапазоны ячеек)



0



pashulka

4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

07.07.2020, 22:40

8

Next — следующий лист.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Sub Worksheet_Change(ByVal r As Range)
   Set r = Intersect(r, [A2:V20])
   If r Is Nothing Then Exit Sub
   
   Application.EnableEvents = False
   With Me.Next.Range(r.Address)
        .Value = Now
        .Columns.AutoFit
   End With
   Application.EnableEvents = True
End Sub



1



0 / 0 / 0

Регистрация: 12.02.2020

Сообщений: 23

07.07.2020, 22:51

9

pashulka, А на первом листе?



0



4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

07.07.2020, 23:18

10

gpetrv, В модуле первого листа — событие Worksheet_Change. Тогда на следующем — будет выводиться дата+время изменения данных ячеек диапазона A2:V20

Если месторасположение второго рабочего листа, в дальнейшем, может меняться, то можно использовать имя этого листа или кодовое(программное) имя. Т.е. вместо Me.Next написать Worksheets(«Лист2») или Лист2 . Разумеется, имена нужно указать свои.



1



0 / 0 / 0

Регистрация: 12.02.2020

Сообщений: 23

29.07.2020, 21:21

11

pashulka, не могу скомпоновать со своим кодом. Не силен…. Помогите..



0



pashulka

4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

29.07.2020, 22:24

12

Это тоже мой код, но там всего один рабочий лист. Если в реальности появится второй, то между первой и второй

перерывчик небольшой

строкой просто добавьте

Visual Basic
1
2
3
4
5
6
    Application.EnableEvents = False '1
    With Me.Next.Range(r.Address)
        .Value = Now
        .Columns.AutoFit
    End With
    For Each c In r '2



1



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

29.07.2020, 22:24

12

Хитрости »

1 Май 2011              53758 просмотров


Запись изменений на листе в примечания

Иногда необходимо вести лог изменений в ячейках. Просто чтобы видеть как изменялась информация в ячейке. Например, это может пригодиться при ведении истории заказа, когда статус заказа записывается в одной ячейке. Сначала «В обработке», далее «Вывоз со склада», потом «Доставка» и т.п.
Приведенный ниже код создает примечание в ячейке, если её значение было изменено. В примечание заноситься информация о том, что было занесено в ячейку и когда это было занесено(т.е. дата и время изменения). Если примечание в ячейке уже есть, то в имеющееся примечание допишется информация об изменениях.

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    'отслеживаем изменения только в диапазоне "E14:E50" - т.е. только статус
    '(изменить адрес, если надо отслеживать другие ячейки)
    If Intersect(Target, Me.Range("E14:E50")) Is Nothing Then Exit Sub
    Dim oComment As Comment
    On Error Resume Next
    Set oComment = Target.Comment
    If oComment Is Nothing Then
        Target.AddComment Target.Text & " " & Format(Now, "dd.mm.yy HH:MM")
    Else
        oComment.Text oComment.Text & Chr(10) & Target.Text & " " & Format(Now, "dd.mm.yy HH:MM")
    End If
End Sub

Код необходимо поместить в модуль листа(щелкнуть правой кнопкой мыши по ярлычку листа —Исходный текст), изменения на котором необходимо отследить. Подробнее о модулях.
Следует учитывать, что код сработает только если данные были изменены вручную и для одной ячейки, а не для нескольких. Если скопировать в вставить несколько ячеек, примечание будет создано только для одной, а текст примечания может отличаться от ожидаемого. Если изменения производятся посредством вычисления формул — код не сработает вообще.
Изменения отслеживаются исключительно для ячеек A17:I30. Чтобы изменить ячейки, в которых необходимо отслеживать изменения, необходимо в строке:
If Intersect(Target, Me.Range(«E14:E50»)) Is Nothing Then Exit Sub
заменить адрес «E14:E50» на адрес нужных ячеек.

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

Option Explicit
 
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim v, vv, sf, sa As String
    'отслеживаем изменения только в диапазоне "A17:I30"(изменить адрес, если надо отслеживать другие ячейки)
    If Intersect(Target, Me.Range("A17:I30")) Is Nothing Then Exit Sub
    'если изменено более одной ячейки - завершаем выполнение во избежание ошибок
    If Target.Count > 1 Then Exit Sub
    'получаем новое значение
    v = Target.Value
    sf = Target.Formula
    'запоминаем адрес текущей выделенной ячейки
    'т.к. после Undo она изменится и надо будет вернуть
    sa = Selection.Address
    'получаем старое значение
    With Application
        .EnableEvents = 0
        .Undo
        vv = Target.Value 'старое значение
        'возвращаем последнее записанное значение
        Target.Formula = sf
        Me.Range(sa).Select
        .EnableEvents = 1
    End With
    'сравниваем новое значение с прежним
    If CStr(vv) <> CStr(v) Then
        'если значения различаются - создаем или дописываем примечание
        On Error Resume Next
        Dim oComment As Comment
        Set oComment = Target.Comment
        If oComment Is Nothing Then 'примечания еще нет - создаем и записываем информацию об изменениях
            Set oComment = Target.AddComment(CreateObject("wscript.network").UserName & ":" & Chr(10) & "было: " & vv & "; стало: " & v & "; Дата: " & Format(Now, "dd.mm.yy HH:MM"))
        Else 'уже есть примечание - дописываем информацию об изменениях
            oComment.Text oComment.Text & Chr(10) & CreateObject("wscript.network").UserName & ":" & Chr(10) & "было: " & vv & "; стало: " & v & "; Дата: " & Format(Now, "dd.mm.yy HH:MM")
        End If
        oComment.Shape.TextFrame.AutoSize = True
    End If
End Sub

Код так же как и предыдущий размещается в модуле листа(правая кнопка мыши по ярлычку листа —Исходный текст), изменения в котором необходимо отслеживать.
Так же в данном коде помимо старого значения в примечание так же записываемся имя пользователя, изменившего значение, новое значение, дата/время изменения. Изменения отслеживаются исключительно для ячеек A17:I30. Чтобы изменить ячейки, в которых необходимо отслеживать изменения, необходимо в строке:
If Intersect(Target, Me.Range(«A17:I30»)) Is Nothing Then Exit Sub
заменить адрес «A17:I30» на адрес нужных ячеек.
Хочу обратить внимание, что при изменении нескольких ячеек сразу код не будет выполняться, т.к. ячеек может быть много и их значения могут просто не уместиться в примечания. Если нужны отслеживания множества ячеек сразу, то имеет смысл ознакомиться со статьей: Ведение журнала сделанных в книге изменений

Скачать пример

  История изменений ячеек в примечаниях (72,5 KiB, 3 734 скачиваний)

Так же см.:
Ведение журнала сделанных в книге изменений
Выделение сделанных изменений


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Понравилась статья? Поделить с друзьями:
  • Макрос где хранятся word
  • Макрос выполнение запроса в excel
  • Макрос выпадающий список для excel
  • Макрос выпадающий список word
  • Макрос вызвать функцию для excel