Страницы: 1
RSS
как создать макрос, действия которого можно было бы отменить кнопкой Ctrl+Z ?
 
макрос проделывает кое-какие действия.  
Можно ли сделать так чтобы действия макроса можно было бы отменить кнопкой Ctrl+Z ?
 
Почему именно это сочетание? Оно же "забито" для удаления данных.
 
Не слушайте предыдущего оратора, он перепутал с Ctrl+Х :)
 
{quote}{login=vikttur}{date=23.02.2012 06:22}{thema=}{post}Почему именно это сочетание? Оно же "забито" для удаления данных.{/post}{/quote}  
 
насколько я знаю CTRL+Z не для удаления данных а для отмены последнего действия  
 
я имел ввиду вот что:  
 
любые ручные действия мы отменяем через CTRL+Z    
 
но действия которые проделал макрос отменить нельзя  
 
можно ли сделать так чтобы и действия макроса можно было отменять?
 
Вот пример:  
<EM>http://spreadsheetpage.com/index.php/site/tip/undoing_a_vba_subroutine/</EM>
KL
 
И всё таки, что нужно дописать для этого минимакроса который указываю ниже, чтоб можно потом было отменить это действие?  
 
Sub Сложить()  
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd, SkipBlanks _  
:=False, Transpose:=False  
End Sub  
 
я как раз сегодня столкнулся с такой же проблемой как и а втор темы.  
 
Прошу помощи.
 
а все-таки, что именно непонятно в совете от The_Prist и ссылке от KL?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
я правильно понимаю что там указаны две отдельные функции???  
одна отменить другая повторить?  
 
Sub ZeroRange()  
Sub UndoZero()  
 
а для чего тогда это:  
'Custom data type for undoing  
   Type SaveRange  
       Val As Variant  
       Addr As String  
   End Type  
     
'   Stores info about current selection  
   Public OldWorkbook As Workbook  
   Public OldSheet As Worksheet  
   Public OldSelection() As SaveRange  
 
или как правильно это реализовать?  
 
правда непонимаю.  
 
Это будут две новые кнопки отменить/повторить или как?
 
Добрый вечер. С праздником всех.  
Дим, ты часто пользуешься такими макросами? Риторический вопрос, можно не отвечать:-)    
Я помню, когда делал первые шаги в освоении Экса, тоже столкнулся с необходимостью отменять косяки неотлаженного макроса. Тогда же и осознал бесперспективность этой затеи. Если макрос отлажен и работает правильно, то никогда не возникнет необходимости в его отмене. Ну разве что пользователь совсем уж невменяемый. В процессе отладки же лучше "тренироваться на котах", т.е. либо создавать копию рабочего листа, либо, если это по каким-то причинам невозможно, исправлять код, копировать его и перезапускать без сохранения рабочий файл с последующей вставкой исправленного кода. Благо к-во таких "откатов" неограничено. При этом полезно держать в сторонке резервную копию.
Я сам - дурнее всякого примера! ...
 
Поддерживаю.  
Никогда не нужен был такой функционал.  
Ну а бабке в бухгалтерии я поставил бекап при каждом закрытии файла - если накосячит уж совсем "по чёрному" - можно поднять предыдущую копию.  
И думаю это лучший ундо - первым делом сохранить бекап, а по onundo его поднять.
 
И кстати бабке бекап за прошедший год ни разу не понадобился - текущие мелочи исправляю оперативно :)
 
всё ясно
 
KukLP  
"столкнулся с необходимостью отменять косяки неотлаженного макроса"  
 
С макросами которые у меня выполняют сложные задачи мне отменться не нужно, они все весьма нелохо работают, а вот этому маленькому макросу, который я потом повешу на конпку на панеле быстрого доступа всё же нужна отмена, так как это действие вставка+сложить  
и даже если чисто механически случайно поставишь при подобной вставке курсор не в ту ячейку, то уже действие безвозратно, да я понимаю что можно сразу нажать на вставка-вычесть и всё станет прежним, но всё же првыйчнее Undo.  
 
Следуя совету The_Prist  
я оставил то что он сказал, и вышло вот так  
 
'Custom data type for undoing  
   Type SaveRange  
       Val As Variant  
       Addr As String  
   End Type  
     
'   Stores info about current selection  
   Public OldWorkbook As Workbook  
   Public OldSheet As Worksheet  
   Public OldSelection() As SaveRange  
 
 
Sub PasteAdd()  
   If TypeName(Selection) <> "Range" Then Exit Sub  
   Application.ScreenUpdating = False  
     
'Специальная вставка-значения-сложить (тоесть действие которое нужно отменить)  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd, SkipBlanks _  
:=False, Transpose:=False  
End Sub  
     
'   Specify the Undo Sub  
   Application.OnUndo "Undo the PasteAdd macro", "UndoAdd"  
End Sub  
 
 
Sub UndoAdd()  
'   Undoes the effect of the ZeroRange sub  
     
'   Tell user if a problem occurs  
   On Error GoTo Problem  
 
   Application.ScreenUpdating = False  
     
'   Make sure the correct workbook and sheet are active  
   OldWorkbook.Activate  
   OldSheet.Activate  
     
'   Restore the saved information  
   For i = 1 To UBound(OldSelection)  
       Range(OldSelection(i).Addr).Formula = OldSelection(i).Val  
   Next i  
   Exit Sub  
 
'   Error handler  
Problem:  
   MsgBox "Can't undo"  
End Sub  
 
но мой Sub PasteAdd() в этой ситуации неработает теперь вообще, подправьте пожалуйста, и не нужно язвить (этот форум ведь создан для взаимопомощи и общения, так давайте помогать друг другу, поскольку, то что для кого то кажеться простым, для другого вызывает трудности).
 
1) А в чьих словах Вы усмотрели язвительность?  
2) Не надо выкладывать обрывки кода, всегда лучше выложить пример в файле.
Я сам - дурнее всякого примера! ...
 
Всё равно не хочет работать.  
Сперва попробовал вставить тот код Sub PasteAdd() который Вы указали постом выше - не заработало.  
Потом увидел что в этом коде присутствуют строки которые Вы говорили что нужно удалить:  
If TypeName(Selection) <> "Range" Then Exit Sub  
Application.ScreenUpdating = False  
 
удалил - не заработало.  
 
Вобщем прикрепляю файл, надеюсь это прояснит всю ситуацию и всё таки найдется решение, в файле нужно сперва скопировать вручную дипазон F3:F5, потом выделить G3 и после этого жмём на Вставить и сложить значения - выскакивает ошибка.
 
Всё, разобрался но опять не до конца  
 
Получилось вот что.  
Вставить и добавить выходит, но отмена действия получается только для ячейки G3. Для того чтобы получилось отменить все изменения нужно вставлять диапазон F3:F5 в дипазон G3:G5 весьма неудобно, согласитесь. Удобнее было бы вставить в G3 с возможность последующей отмены. Это реально?
 
{quote}{login=vikttur}{date=23.02.2012 06:26}{thema=}{post}Не слушайте предыдущего оратора, он перепутал с Ctrl+Х :){/post}{/quote} Ctrl+Х не удаляет данные.  
Это сочетание копирует их в буфер, и если им не воспользоваться, то данные возвращаются в исходную ячейку.
 
The_Prist  
 
Я заметил это постом выше)))  
добавил также работающий файл...  
кстати в том файле что Вы выложили, после кнопки отмена выскакивает почему то Run-Time Error '9'  
 
в том что я постом выше положил всё работает, кроме того что я описал в том же посте.
 
И чем тренировка на котах хуже?
Я сам - дурнее всякого примера! ...
 
всё верно, но я описывал еще один бок подобной программы  
 
Вставить и сложить выходит, но отмена действия получается только для ячейки G3. Для того чтобы получилось отменить все изменения нужно вставлять диапазон F3:F5 в дипазон G3:G5 весьма неудобно, согласитесь. Удобнее было бы вставить в G3 с возможность последующей отмены.
 
То Serge 007 - это кода как. В винде как правило, или в режиме редактирования ячейки, данные вырезаются(удаляются) в буфер.
Я сам - дурнее всякого примера! ...
 
KukLP  
я вообще не понял к чему ваш файл...  
там совершенно не то о чем сейчас речь.
 
А приложите пожалуйста файл где идёт запоминание всего листа.  
Не думаю что в документах в раёне 1-2 мб будут тормоза.
 
{quote}{login=marker_mc}{date=24.02.2012 12:45}{thema=}{post}  
там совершенно не то о чем сейчас речь.{/post}{/quote}Там речь о том, как складывать диапазоны не меняя исходных данных, вследствии чего операции отмены теряют смысл. Но вижу Вы легких путей не ищете. Удачи.
Я сам - дурнее всякого примера! ...
 
Мне нужно сложить 2 диапозона с заменой исходных данных с возможностью потом откатится, этот откат нужен только для того что если ИСКЛЮЧИТЕЛЬНО случайно выберишь для вставки не ту ячейку, что происходит крайне редко. А то что вы предложили, это тоже хорошо, но не для этой ситуации.
 
Можно всё таки приложить док, а то там много разных Selection не понял какой менять.
 
по-моему вы в любом диапазоне любого файле операцию СПЕЦВСТАВКА-ВСТАВИТЬ ЗНАЧЕНИЯ-СЛОЖИТЬ хотите использовать как готовую команду (и что главное с возможностью отмены)  
 
если это так и если я правильно понял все посты по этой теме то:  
 
макрос должен быть таким:  
 
1)начало  
2)скопируй куда-нибудь весь лист (или всю книгу еслы вы собираетесь копировать диапазон относящийся к неськолким листам сразу 'трехмерный диапазон')  
3)копируй  
4)осуществляй СПЕЦВСТАВКА-ВСТАВИТЬ ЗНАЧЕНИЯ-СЛОЖИТЬ  
5)конец  
 
макрос отмены  
1)возьми скопированный лист  
2) удали исходный лист  
3) переименуй взятый (бывший скопированный) на имя исходного  
 
Так вопрос нужно ли вам это?  
ведь каждый раз при пользовании этимм макросом у вас уйдёт и немного времени и немного ресурсов только для того чтобы создать исходный запасной  
и потом что делать со скопированным листом при закрытии книги?  
 
короче по-моему вам это не надо раз вы не будете делать этого в строго определенном диапазоне а в любом месте
 
Ого... Спасибо. На вашем примере всё отлично работает. Теперь буду ковырять и пытаться прикрутить к своей кнопке.
Страницы: 1
Читают тему
Наверх