Событие изменения рабочего листа с несколькими вариантами выбора - PullRequest
0 голосов
/ 28 мая 2019

У меня есть лист, в котором я веду журнал изменений, которые происходят на нем, таких как данные, введенные в ячейку, удаленные данные и т. Д. Это прекрасно работает, за исключением случаев, когда происходит несколько выборок.

Например, еслиЯ выбрал B2, D2 и F2 и удалил содержимое ячеек. Событие изменения рабочего листа примет изменение только для первой ячейки, B2.Так что я понятия не имею, что случилось с другими клетками.

Есть ли способ, которым я могу обойти это и либо заставить его регистрировать изменения рабочего листа для других ячеек, либо останавливать многократное удаление выборок?

Вот мой код

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As 

Range)

Dim ws As Worksheet, iRow As Long, iCol As Long, Message As String, SheetId As String, iRowE As Long, iColE As Long, iRowB As Long, iColB As Long

Set ws = Sh
SheetId = Replace(ws.Name, " ", "")
SheetId = Left(SheetId, 2) & Right(SheetId, 2)

iRowB = Target.Row
iColB = Target.Column
iRowE = iRowB + Target.Rows.Count - 1
iColE = iColB + Target.Columns.Count - 1

Message = Format(Now(), "ddHHmmss") & Application.UserName & "-" & SheetId

For iRow = iRowB To iRowE
  For iCol = iColB To iColE
    Message = Message & "|" & Format(iRow, " 0") & Format(iCol, " 0") & "|" & CStr(ws.Cells(iRow, iCol).Text)
  Next iCol
Next iRow

If Not FileExists("L:\HC\" & ThisWorkbook.Name & Format(Now(), "YYYYMM") & ".Log") Then
  Call LogIt("L:\HC\" & ThisWorkbook.Name & Format(Now(), "YYYYMM") & ".Log", "ddHHmmssUSER-sheet|row col|value|row col|value")
End If

Call LogIt("L:\HC\" & ThisWorkbook.Name & Format(Now(), "YYYYMM") & ".Log", Message)

End Sub

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

Вместо того, чтобы циклически проходить по строкам и столбцам как таковым, вы можете проходить по каждой ячейке, которая была изменена.«Цель» - это диапазон, который можно указать как более 1 ячейки, если это то, что было изменено в процессе.

Dim objCell As Range

For Each objCell in Target
    ' Do Something
Next

Я вижу, что вы пытались сделать что-то подобное, но с использованием подхода ячейкидолжен давать вам каждый индивидуальный адрес, который изменился.

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

Я надеюсь, чтопомогает.

0 голосов
/ 28 мая 2019

Некоторые рекомендации:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim cell As Range

    'Loop all selections
    For Each cell In Target

        With cell
            Debug.Print .Address
        End With

    Next cell

    'Exit sub when selection is more than one cell
    If Target.Count > 1 Then
        Exit Sub
    End If

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