Здравствуйте, daniel default, Вы писали:
E_>>Ну можно переустановить OnAction для встроенных меню — в правке и в правом глазе мыши на свою процедуру и там проверять, что выделено, если то, что Вам неинтересно, то стандартное действие,
DD>Спасибо, Лена, похоже двигаться нужно именно в этом направлении. Только встает несколько вопросов (вы уж извините, я объектную модель Excel второй день только в глаза вижу
)
DD>1. Как добраться до объекта "Удалить строку", если на панель (в меню "Правка" или просто) он не вынесен (не могу найти его природную коллекцию)?
DD>2. Как вернуть стандартную процедуру удаления строки? Или Excel сам это сделает по закрытии книги?
E_>>соответствующий диалог вроде бы можно вызвать через xlDialogDataDelete,
DD>Не могу понять в каком контексте он вызывается (даёт ошибку 1004 — app-def or obj-def error). Вот кусочек кода:
DD>DD> Worksheets(2).Rows(415).Activate
DD> dlg = Application.Dialogs(xlDialogDataDelete).Show
DD>
DD> Не пойму, xlDialogInsert проходит, а xlDialogDataDelete — нет...
Если еще актуально (днем у меня не было доступа в инет), то
с диалогом дейстительно не получилось, пока не знаю почему, но вот так вроде работает
Sub SetCustomDelete()
Dim cbc As Office.CommandBarControl
'---- Удалить из меню правого глаза мыши
For Each cbc In Application.CommandBars("Cell").Controls
If cbc.Caption = "&Удалить..." Then
cbc.OnAction = "CustomУдалить"
cbc.Tag = "CUSTOM_УДАЛИТЬ"
End If
Next cbc
'---- Удалить из основного меню
For Each cbc In Application.CommandBars("Worksheet Menu Bar").Controls("Правка").Controls
If cbc.Caption = "&Удалить..." Then
cbc.OnAction = "CustomУдалить"
cbc.Tag = "CUSTOM_УДАЛИТЬ"
End If
Next cbc
End Sub
Sub ResetDelete()
''' On Error Resume Next
Application.CommandBars("Cell").Reset
Application.CommandBars("Worksheet Menu Bar").Controls("Правка").Reset
On Error GoTo 0
'---- или более аккуратно в цикле удалить все с Tag = "CUSTOM_УДАЛИТЬ"
End Sub
Sub CustomУдалить()
If Selection.Address = "$A$1" Then
MsgBox "Не буду удалять"
Exit Sub
End If
ResetDelete
Dim cbc As Office.CommandBarControl
For Each cbc In Application.CommandBars("Cell").Controls
If cbc.Caption = "&Удалить..." Then
cbc.Execute
End If
Next cbc
SetCustomDelete
End Sub
То есть просто восстанавливаем стандартный OnAction, и выполняем его, а потом снова заменяем
Мне кажется, что можно до стандартного добраться как-то лучше, но пока не могу сообразить как, мне просто никогда не был нужен стандартный режим в таких ситуациях.