Как записать удаление события в Excel - PullRequest
1 голос
/ 07 сентября 2010

У меня есть ситуация, когда мне нужно знать, было ли вручную выполнено удаление какой-либо строки в моей электронной таблице. Как я могу записать это событие в vba.

Ответы [ 3 ]

1 голос
/ 11 августа 2011
Private Sub Worksheet_Change(ByVal Target As Range)
    'UsedRange works fine provided there is always something in Row1
    'Declare varY from a Module and set from Workbook_Open or Sheet.Activate,
    'or undo first sheet change, but set variable

    If Target.Columns.Count = 16384 Then
        Select Case Sheet1.UsedRange.Rows.Count
            Case Is > Sheet1.Range("" & varY & "").Rows.Count
                MsgBox "insert row"
                Sheet2.Rows(Target.Rows.Address).Insert Shift:=xlDown, _
                    CopyOrigin:=xlFormatFromLeftOrAbove
            Case Is < Sheet1.Range("" & varY & "").Rows.Count
                MsgBox "delete row"
                Sheet2.Rows(Target.Rows.Address).Delete Shift:=xlUp
        End Select
    Else: Sheet2.Range(Target.Address).Value = Target.Value
    End If
    varY = Sheet1.UsedRange.Address
End Sub
0 голосов
/ 10 сентября 2010

Вы всегда можете сделать что-то вроде:

Public lngPreviousRow As Long
Public lngCurrentRow As Long

Private Sub Worksheet_Calculate()
    lngCurrentRow = Me.Range("rngLastRow").Row

    If lngCurrentRow  < lngPreviousRow Then
        MsgBox "Row deleted"
    End If

    lngPreviousRow = lngCurrentRow
End Sub

Пока вы устанавливаете lngPreviousRow изначально (Workbook_Open, например), он всегда будет обнаруживать удаление строки, независимо от вставки строки и т. Д.

0 голосов
/ 07 сентября 2010

Excel не предоставляет хороший способ определить, была ли удалена строка или столбец.Один из способов сделать это - использовать определенное имя и событие Calculate.Например, если вы заботитесь о первых 1000 строках, назовите ячейку A1001 как «rngLastRow».Затем используйте этот код в событии вычисления листа

Private Sub Worksheet_Calculate()

    If Me.Range("rngLastRow").Row < 1001 Then
        MsgBox "Row deleted"
    End If

End Sub

Он не скажет вам, какая строка была удалена, поэтому вам понадобится что-то другое, если вам нужно это знать.вы хотите просто запретить людям удалять строки, вы можете использовать формулу массива в скрытом столбце.Опять же, предполагая, что ваше приложение использует первые 1000 строк, выберите A1: A1000 (или какой-либо другой пустой столбец) и введите = 1 и подтвердите его, нажав Control + Enter.Это создаст массив в A1: A1000.Когда пользователь пытается удалить строку, он получит бесполезное сообщение «Вы не можете изменить часть массива.», Но он не сможет удалить строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...