Здравствуйте, daniel default, Вы писали:
DD>Пользователь может вставить или удалить строку Excel. Как коректно определить эти события? (особенно удаление)
Лучше всего просто перехватывать все запросы пользователя на вставку или удаление строки и подменять их своей процедурой — например, защитить лист и добавить свое меню для вставки и удаления строк.
Здравствуйте, Elena_, Вы писали:
E_>Лучше всего просто перехватывать все запросы пользователя на вставку или удаление строки и подменять их своей процедурой — например, защитить лист и добавить свое меню для вставки и удаления строк.
Спасибо. Но похоже, это не лучшее решение в данном случае (я не планирую контролирвать вручную все участки таблицы, а только некоторые, что мне нужны). Нет ли какого другого способа?
Здравствуйте, daniel default, Вы писали:
DD>Здравствуйте, Elena_, Вы писали:
E_>>Лучше всего просто перехватывать все запросы пользователя на вставку или удаление строки и подменять их своей процедурой — например, защитить лист и добавить свое меню для вставки и удаления строк.
DD>Спасибо. Но похоже, это не лучшее решение в данном случае (я не планирую контролирвать вручную все участки таблицы, а только некоторые, что мне нужны). Нет ли какого другого способа?
Ну можно переустановить OnAction для встроенных меню — в правке и в правом глазе мыши на свою процедуру и там проверять, что выделено, если то, что Вам неинтересно, то стандартное действие,
соответствующий диалог вроде бы можно вызвать через xlDialogDataDelete,
если это как раз нужная область, то делать то, что нужно
Можно еще выкручиваться типа — написать пользовательскую функцию, которая каким-то образом зависит от этой области, поместить ее в какую-нибудь ячейку и отслеживать Calculate (я так отлавливаю выбор пользователем автофильтра), но наверное, это не очень удобный вариант.
E_>Ну можно переустановить OnAction для встроенных меню — в правке и в правом глазе мыши на свою процедуру и там проверять, что выделено, если то, что Вам неинтересно, то стандартное действие,
Спасибо, Лена, похоже двигаться нужно именно в этом направлении. Только встает несколько вопросов (вы уж извините, я объектную модель Excel второй день только в глаза вижу )
1. Как добраться до объекта "Удалить строку", если на панель (в меню "Правка" или просто) он не вынесен (не могу найти его природную коллекцию)?
2. Как вернуть стандартную процедуру удаления строки? Или Excel сам это сделает по закрытии книги?
E_>соответствующий диалог вроде бы можно вызвать через xlDialogDataDelete,
Не могу понять в каком контексте он вызывается (даёт ошибку 1004 — app-def or obj-def error). Вот кусочек кода:
Здравствуйте, daniel default, Вы писали:
E_>>Ну можно переустановить OnAction для встроенных меню — в правке и в правом глазе мыши на свою процедуру и там проверять, что выделено, если то, что Вам неинтересно, то стандартное действие,
DD>Спасибо, Лена, похоже двигаться нужно именно в этом направлении. Только встает несколько вопросов (вы уж извините, я объектную модель Excel второй день только в глаза вижу )
DD>1. Как добраться до объекта "Удалить строку", если на панель (в меню "Правка" или просто) он не вынесен (не могу найти его природную коллекцию)? DD>2. Как вернуть стандартную процедуру удаления строки? Или Excel сам это сделает по закрытии книги?
E_>>соответствующий диалог вроде бы можно вызвать через xlDialogDataDelete,
DD>Не могу понять в каком контексте он вызывается (даёт ошибку 1004 — app-def or obj-def error). Вот кусочек кода:
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, и выполняем его, а потом снова заменяем
Мне кажется, что можно до стандартного добраться как-то лучше, но пока не могу сообразить как, мне просто никогда не был нужен стандартный режим в таких ситуациях.
E_>Если еще актуально (днем у меня не было доступа в инет), то E_>с диалогом дейстительно не получилось, пока не знаю почему, но вот так вроде работает
Что вы, Елена! Очень актуально и очень полезно! Спасибо!
E_>Мне кажется, что можно до стандартного добраться как-то лучше, но пока не могу сообразить как, мне просто никогда не был нужен стандартный режим в таких ситуациях.
Если найдёте решение, буду весьма признателен. Может это связано с FindControls Method? Я пробовал, но к сожалению, не получилось...