Как на VBA отловить удаление строки Excel?
От: daniel default  
Дата: 17.12.03 10:36
Оценка:
Пользователь может вставить или удалить строку Excel. Как коректно определить эти события? (особенно удаление)
Re: Как на VBA отловить удаление строки Excel?
От: Elena_ Россия  
Дата: 17.12.03 10:54
Оценка:
Здравствуйте, daniel default, Вы писали:

DD>Пользователь может вставить или удалить строку Excel. Как коректно определить эти события? (особенно удаление)


Лучше всего просто перехватывать все запросы пользователя на вставку или удаление строки и подменять их своей процедурой — например, защитить лист и добавить свое меню для вставки и удаления строк.
Пользователь — друг программиста!
Re[2]: Как на VBA отловить удаление строки Excel?
От: daniel default  
Дата: 17.12.03 11:27
Оценка:
Здравствуйте, Elena_, Вы писали:

E_>Лучше всего просто перехватывать все запросы пользователя на вставку или удаление строки и подменять их своей процедурой — например, защитить лист и добавить свое меню для вставки и удаления строк.


Спасибо. Но похоже, это не лучшее решение в данном случае (я не планирую контролирвать вручную все участки таблицы, а только некоторые, что мне нужны). Нет ли какого другого способа?
Re[3]: Как на VBA отловить удаление строки Excel?
От: Elena_ Россия  
Дата: 17.12.03 13:58
Оценка:
Здравствуйте, daniel default, Вы писали:

DD>Здравствуйте, Elena_, Вы писали:


E_>>Лучше всего просто перехватывать все запросы пользователя на вставку или удаление строки и подменять их своей процедурой — например, защитить лист и добавить свое меню для вставки и удаления строк.


DD>Спасибо. Но похоже, это не лучшее решение в данном случае (я не планирую контролирвать вручную все участки таблицы, а только некоторые, что мне нужны). Нет ли какого другого способа?


Ну можно переустановить OnAction для встроенных меню — в правке и в правом глазе мыши на свою процедуру и там проверять, что выделено, если то, что Вам неинтересно, то стандартное действие,

соответствующий диалог вроде бы можно вызвать через xlDialogDataDelete,

если это как раз нужная область, то делать то, что нужно

Можно еще выкручиваться типа — написать пользовательскую функцию, которая каким-то образом зависит от этой области, поместить ее в какую-нибудь ячейку и отслеживать Calculate (я так отлавливаю выбор пользователем автофильтра), но наверное, это не очень удобный вариант.
Пользователь — друг программиста!
Re[4]: Как на VBA отловить удаление строки Excel?
От: daniel default  
Дата: 18.12.03 07:22
Оценка:
E_>Ну можно переустановить OnAction для встроенных меню — в правке и в правом глазе мыши на свою процедуру и там проверять, что выделено, если то, что Вам неинтересно, то стандартное действие,

Спасибо, Лена, похоже двигаться нужно именно в этом направлении. Только встает несколько вопросов (вы уж извините, я объектную модель Excel второй день только в глаза вижу )

1. Как добраться до объекта "Удалить строку", если на панель (в меню "Правка" или просто) он не вынесен (не могу найти его природную коллекцию)?
2. Как вернуть стандартную процедуру удаления строки? Или Excel сам это сделает по закрытии книги?

E_>соответствующий диалог вроде бы можно вызвать через xlDialogDataDelete,


Не могу понять в каком контексте он вызывается (даёт ошибку 1004 — app-def or obj-def error). Вот кусочек кода:

  Worksheets(2).Rows(415).Activate
  dlg = Application.Dialogs(xlDialogDataDelete).Show


Не пойму, xlDialogInsert проходит, а xlDialogDataDelete — нет...
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, и выполняем его, а потом снова заменяем

Мне кажется, что можно до стандартного добраться как-то лучше, но пока не могу сообразить как, мне просто никогда не был нужен стандартный режим в таких ситуациях.
Пользователь — друг программиста!
Re[6]: Как на VBA отловить удаление строки Excel?
От: daniel default  
Дата: 19.12.03 09:08
Оценка:
E_>Если еще актуально (днем у меня не было доступа в инет), то
E_>с диалогом дейстительно не получилось, пока не знаю почему, но вот так вроде работает

Что вы, Елена! Очень актуально и очень полезно! Спасибо!

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


Если найдёте решение, буду весьма признателен. Может это связано с FindControls Method? Я пробовал, но к сожалению, не получилось...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.