Да наверное вы правы так и сделаю. Получается алгоритм такой если я правильно понял:
1. Копируем сортируемый лист под определенным именем
2. В случае отмены действий удаляем старый лист и переименовываем новый
3. Если отмены не было и книгу закрывают, тогда удалить новый лист (скопированный при сортировке)
да?
Отмена результатов сортировки
Модератор: Naeel Maqsudov
Получилось примерно так:
Sub SortRezult()
Call CopySheet
Range("C6:P115").Select
ActiveWindow.SmallScroll Down:=-105
Selection.Sort Key1:=Range("L6"), Order1:=xlAscending, Key2:=Range("J6") _
, Order2:=xlAscending, Key3:=Range("P6"), Order3:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _
xlSortNormal
ActiveWindow.SmallScroll Down:=-15
Application.OnUndo "Отменить сортировку", "UndoSort"
End Sub
Sub CopySheet()
Sheets("Лист1").Select
Sheets("Лист1").Copy Before:=Sheets(1)
ActiveWindow.SelectedSheets.Visible = False
End Sub
Sub UndoSort()
Sheets("Лист1").Select
ActiveWindow.SelectedSheets.Delete
Sheets("Лист1 (2)").Visible = True
Sheets("Лист1 (2)").Select
Sheets("Лист1 (2)").Name = "Лист1"
Range("C33").Select
End Sub
Sub DeletUndoSheet()
Dim wsh As Worksheet
For Each wsh In ThisWorkbook.Worksheets
If wsh.Name = "Лист1 (2)" Then
wsh.Delete
End If
Next
End Sub
В модуле эта книга:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call DeletUndoSheet
End Sub
Осталось код к божескому виду привести
VictorM, SAS888 спасибо за помощь!
Sub SortRezult()
Call CopySheet
Range("C6:P115").Select
ActiveWindow.SmallScroll Down:=-105
Selection.Sort Key1:=Range("L6"), Order1:=xlAscending, Key2:=Range("J6") _
, Order2:=xlAscending, Key3:=Range("P6"), Order3:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _
xlSortNormal
ActiveWindow.SmallScroll Down:=-15
Application.OnUndo "Отменить сортировку", "UndoSort"
End Sub
Sub CopySheet()
Sheets("Лист1").Select
Sheets("Лист1").Copy Before:=Sheets(1)
ActiveWindow.SelectedSheets.Visible = False
End Sub
Sub UndoSort()
Sheets("Лист1").Select
ActiveWindow.SelectedSheets.Delete
Sheets("Лист1 (2)").Visible = True
Sheets("Лист1 (2)").Select
Sheets("Лист1 (2)").Name = "Лист1"
Range("C33").Select
End Sub
Sub DeletUndoSheet()
Dim wsh As Worksheet
For Each wsh In ThisWorkbook.Worksheets
If wsh.Name = "Лист1 (2)" Then
wsh.Delete
End If
Next
End Sub
В модуле эта книга:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call DeletUndoSheet
End Sub
Осталось код к божескому виду привести

VictorM, SAS888 спасибо за помощь!