добрый день,
Я работаю над таблицей Excel, в которой есть таблица данных. Эти данные представляют несколько показателей, которые мой отдел хочет отслеживать. Всякий раз, когда кто-то хочет заполнить таблицу новыми данными, предыдущие данные в ячейках теряются.
Как кто-то может создать отдельный лист, где можно автоматически сохранять все значения этой таблицы? Я имею в виду, когда в одной из ячеек таблицы вносятся изменения, новое значение автоматически сохраняется в другой таблице, которая будет хранить все значения (старые и новые) ячеек? Я пробовал "отслеживать изменения", но не уверен, нравится ли мне этот способ.
Кто-нибудь знает более эффективный способ сделать это? Через макрос например?
Спасибо!
решение1
(Я использую мобильный телефон, поэтому сейчас не могу дать развернутый ответ.)
Я написал код именно для этого. Моей целью было отслеживать все изменения на критическом листе, редактируемом несколькими пользователями. Если возникал спор о том, откуда взялись данные, я мог просмотреть журнал. Вот фрагменты VBA, которые пригодятся.
Worksheet_Change
событие будет срабатывать каждый раз при изменении рабочего листа.
If Not Intersect(Target, Range("A1:G12")) Is Nothing
сообщит вам, находятся ли измененные ячейки в нужном вам диапазоне.
Быстрее сохранить значения, которые вы хотите зарегистрировать, в массиве, а затем задать некоторый диапазон в вашем журнале, равный этому массиву, чем задавать каждую ячейку в журнале по отдельности.
Попробуйте и посмотрите, как далеко вы зайдете. Завтра я могу быть немного более многословным.
На следующий день редактирование
Вот код, который будет следить за диапазоном A1:G12
на любом листе, в котором есть код. Если r
это строка, которая была изменена, то код скопирует все из Ar:Gr
в лист, чейкодовое имяравно shtLog
. (Кодовое имя — это имя, отображаемое в VBA, а не имя на вкладке, которое вы видите в Excel.) Это должно помочь вам двигаться в правильном направлении.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Integer
Dim c As Integer
Dim arr(1 To 1, 1 To 12)
If Not Intersect(Target, Range("A1:G12")) Is Nothing Then
r = Target.Row
For c = 1 To 12
arr(1, c) = Cells(r, c).Value
Next
With shtLog
.Range(.Cells(.UsedRange.Rows.Count + 1, 1), .Cells(.UsedRange.Rows.Count + 1, 12)) = arr
End With
End If
End Sub
решение2
Встроенная функция «Отслеживание изменений» скорее всего будет гораздо более надежной, чем любое отслеживание изменений, которое вы попытаетесь реализовать с помощью макросов. Придерживайтесь этого.
решение3
Мы (отказ от ответственности, я основатель) создали систему аудита для Excel (похожую на Google Docs, но для Excel). Она не требует общей рабочей книги, а аудит сохраняется в локальной базе данных SQL, поэтому к ней можно получить доступ из любой рабочей книги и сохранить ее как отдельный лист. Посмотрите:http://www.officeautomata.com
решение4
С функцией Append в Sheetgo вы можете сохранять историю изменений переменных в Excel. Подробнее в этом блоге:https://blog.sheetgo.com/how-to-solve-with-sheetgo/track-changes-in-excel-files/(*отказ от ответственности: я являюсь соучредителем Sheetgo).