MikeVol, вариант рабочий, но малость надо подправить. Нужно что бы он работал на одном листе с именем "2026". Изменения на других листах нужно игнорировать.
Понимаю что его нужно вставить в модуль нужного листа и изменить
Код
If Application.WorksheetFunction.CountA(Sh.Range("B" & LastRow & ":G" & LastRow)) > 0 Then
но этого мало
MikeVol, вариант рабочий, но малость надо подправить. Нужно что бы он работал на одном листе с именем "2026". Изменения на других листах нужно игнорировать.
Понимаю что его нужно вставить в модуль нужного листа и изменить
Код
If Application.WorksheetFunction.CountA(Sh.Range("B" & LastRow & ":G" & LastRow)) > 0 Then
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name <> "2026" Then Exit Sub If Intersect(Target, Sh.Range("B:G")) Is Nothing Then Exit Sub
IsChanged_2026 = True End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If Not IsChanged_2026 Then Exit Sub Dim Sh As Worksheet
Dim wsExists As Boolean wsExists = False
For Each Sh In ThisWorkbook.Worksheets
If Sh.Name = "2026" Then wsExists = True Exit For End If
Application.ScreenUpdating = True Application.EnableEvents = True End Sub
[/vba] И ещё один вариант: [vba]
Код
Option Explicit Dim ChangedRows_2026 As Object
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name <> "2026" Then Exit Sub If Intersect(Target, Sh.Range("B:G")) Is Nothing Then Exit Sub Dim cell As Range
If ChangedRows_2026 Is Nothing Then Set ChangedRows_2026 = CreateObject("Scripting.Dictionary") End If
For Each cell In Target.Cells
If Not ChangedRows_2026.exists(cell.Row) Then ChangedRows_2026.Add cell.Row, True End If
Next cell
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If ChangedRows_2026 Is Nothing Then Exit Sub If ChangedRows_2026.Count = 0 Then Exit Sub
Dim ws As Worksheet Dim exists As Boolean
For Each ws In ThisWorkbook.Worksheets
If ws.Name = "2026" Then exists = True Exit For End If
Application.ScreenUpdating = True Application.EnableEvents = True End Sub
[/vba]
Литр, Только для листа 2026: [vba]
Код
Option Explicit Dim IsChanged_2026 As Boolean
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name <> "2026" Then Exit Sub If Intersect(Target, Sh.Range("B:G")) Is Nothing Then Exit Sub
IsChanged_2026 = True End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If Not IsChanged_2026 Then Exit Sub Dim Sh As Worksheet
Dim wsExists As Boolean wsExists = False
For Each Sh In ThisWorkbook.Worksheets
If Sh.Name = "2026" Then wsExists = True Exit For End If
Application.ScreenUpdating = True Application.EnableEvents = True End Sub
[/vba] И ещё один вариант: [vba]
Код
Option Explicit Dim ChangedRows_2026 As Object
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name <> "2026" Then Exit Sub If Intersect(Target, Sh.Range("B:G")) Is Nothing Then Exit Sub Dim cell As Range
If ChangedRows_2026 Is Nothing Then Set ChangedRows_2026 = CreateObject("Scripting.Dictionary") End If
For Each cell In Target.Cells
If Not ChangedRows_2026.exists(cell.Row) Then ChangedRows_2026.Add cell.Row, True End If
Next cell
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If ChangedRows_2026 Is Nothing Then Exit Sub If ChangedRows_2026.Count = 0 Then Exit Sub
Dim ws As Worksheet Dim exists As Boolean
For Each ws In ThisWorkbook.Worksheets
If ws.Name = "2026" Then exists = True Exit For End If
MikeVol, благодарю но увы, не работает. Видимо потому что книга находится на сетевом ресурсе и одновременно с этим файлом работает несколько человек. Пробую вариант с примечаниями выложенный тут же чуть выше, вроде идет. Только есть пару вопросов: 1) как в модуль листа "2026" добавить коды листа "СПИСОК?"
2) Еще прошу поправить в коде этот фрагмент:
[vba]
Код
' Процедура добавления примечания об изменении значения Sub AddCommentForValueChange(cell As Range, user As String, timeStr As String, oldVal As Variant) Dim commentText As String ' Формируем текст примечания в зависимости от типа изменения If cell.Address = OldAddress Then ' Если изменилось значение в той же ячейке commentText = user & " (" & timeStr & "): " & _ "изменил '" & oldVal & "' на '" & cell.Value & "'" Else ' Если это новая ячейка commentText = user & " (" & timeStr & "): " & _ "установил '" & cell.Value & "'" End If ' Добавляем или обновляем примечание AddOrUpdateComment cell, commentText End Sub
[/vba]
Тут, при записи и в пустую ячейку и если в ней уже есть запись отрабатывает примечание: "..... изменил....."
3) Хорошо бы запретить удаление примечаний без ввода пароля. Не паролить лист целиком, так как некоторые макросы в таком случае не работают, а именно что бы при попытке удалить коментарий из одной или группы ячеек всплывал бокс с местом для пароля.
MikeVol, благодарю но увы, не работает. Видимо потому что книга находится на сетевом ресурсе и одновременно с этим файлом работает несколько человек. Пробую вариант с примечаниями выложенный тут же чуть выше, вроде идет. Только есть пару вопросов: 1) как в модуль листа "2026" добавить коды листа "СПИСОК?"
2) Еще прошу поправить в коде этот фрагмент:
[vba]
Код
' Процедура добавления примечания об изменении значения Sub AddCommentForValueChange(cell As Range, user As String, timeStr As String, oldVal As Variant) Dim commentText As String ' Формируем текст примечания в зависимости от типа изменения If cell.Address = OldAddress Then ' Если изменилось значение в той же ячейке commentText = user & " (" & timeStr & "): " & _ "изменил '" & oldVal & "' на '" & cell.Value & "'" Else ' Если это новая ячейка commentText = user & " (" & timeStr & "): " & _ "установил '" & cell.Value & "'" End If ' Добавляем или обновляем примечание AddOrUpdateComment cell, commentText End Sub
[/vba]
Тут, при записи и в пустую ячейку и если в ней уже есть запись отрабатывает примечание: "..... изменил....."
3) Хорошо бы запретить удаление примечаний без ввода пароля. Не паролить лист целиком, так как некоторые макросы в таком случае не работают, а именно что бы при попытке удалить коментарий из одной или группы ячеек всплывал бокс с местом для пароля.Литр