Re[5]: Как на VBA отловить удаление строки Excel?
От: Elena_ Россия  
Дата: 18.12.03 22:58
Оценка:
Здравствуйте, 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, и выполняем его, а потом снова заменяем

Мне кажется, что можно до стандартного добраться как-то лучше, но пока не могу сообразить как, мне просто никогда не был нужен стандартный режим в таких ситуациях.
Пользователь — друг программиста!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.