powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Before Delete Row(s) (Range) Event
7 сообщений из 7, страница 1 из 1
Before Delete Row(s) (Range) Event
    #39596906
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги!

Подскажите где ловить событие ПЕРЕД удалением содержимого целых строк (или выделенного Range).
Когда пользователь жмет Del
Мне бы с возможностью Cancel
...
Рейтинг: 0 / 0
Before Delete Row(s) (Range) Event
    #39596913
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет такого. Используй комбинацию Worksheet_Change и Undo.
...
Рейтинг: 0 / 0
Before Delete Row(s) (Range) Event
    #39596928
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaНет такого. Используй комбинацию Worksheet_Change и Undo.
Пичалько
...
Рейтинг: 0 / 0
Before Delete Row(s) (Range) Event
    #39596983
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разовью тему тогда

Private Sub Worksheet_Change(ByVal Target As Range)

отлавливает все действия
мне нужно ловить исключительно Delete Rows и Insert Rows
Как?
...
Рейтинг: 0 / 0
Before Delete Row(s) (Range) Event
    #39597097
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Before Delete Row(s) (Range) Event
    #39598143
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Опробовал несколько подходов.
Не могу сказать, что этот код элегантен и т.п., НО для моих целей вполне подходит

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
' this code copy to WorkSheet area

Dim lOldRowCount As Long


Private Sub Worksheet_Activate()
    ActiveSheet.UsedRange
    lOldRowCount = ActiveSheet.UsedRange.Rows.Count
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lNewRowCount As Long

    ActiveSheet.UsedRange
    lNewRowCount = ActiveSheet.UsedRange.Rows.Count

    If lOldRowCount = lNewRowCount Then
        ElseIf lOldRowCount > lNewRowCount Then
            MsgBox ("Row Deleted")
             ' Call UndoLastAction() ' <<-- uncomment if it needs
            lOldRowCount = lNewRowCount
        ElseIf lOldRowCount < lNewRowCount Then
            MsgBox ("Row Inserted")
            lOldRowCount = lNewRowCount
    End If


End Sub

Sub UndoLastAction()

    With Application
        .EnableEvents = False
        .Undo
        .EnableEvents = True
    End With
...
Рейтинг: 0 / 0
Before Delete Row(s) (Range) Event
    #39598152
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В качестве интересного подхода предложить еще вот такой подход

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Private Sub Worksheet_Change(ByVal Target As Range)
   
  Dim i As Long, j As Long, k As Long, s As String
  i = Target.Columns.Count
  j = Selection.Columns.Count
  k = Columns.Count
   
  If i = k Or j = k Then
    s = Application.CommandBars(1).FindControl(ID:=128, Recursive:=True).Caption
    If InStr(s, "Insert Cells") Or InStr(s, "Вставить ячейки") Then
      MsgBox "Попытка вставки строк!", vbExclamation, "Отмена вставки строк"
      Application.EnableEvents = False
      Application.Undo
      Application.EnableEvents = True
    Else
      MsgBox "Строки были удалены", vbExclamation, "Не обрабатывать событие удаления"
    End If
    Exit Sub
  End If
    
  ' Ниже - код обработки  остальных случаев
  ' ...
  
End Sub
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Before Delete Row(s) (Range) Event
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]