Почему Excel создает sh событие Worksheet_Change, которое меняет рабочий лист? - PullRequest
0 голосов
/ 18 января 2020
Private Sub Worksheet_Change(ByVal Target As Range)

Dim lrow1 As Long
Dim lrow2 As Long
Dim cell As Range
Dim sell As Range

lrow1 = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
lrow2 = Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row

For Each cell In Sheets("Sheet2").Range("A1:A" & lrow2)
    For Each sell In Sheets("Sheet1").Range("A1:A" & lrow1)
        If cell.Value = sell.Value Then
            cell.Offset(0, 1).Value = sell.Offset(0, 1).Value
        End If
    Next sell
Next cell

End Sub

Первая запись работает, информация выводится правильно. Со второй записью Excel вылетает.

1 Ответ

0 голосов
/ 18 января 2020

Я пытался реорганизовать ваш код и очистить его в некоторых частях.

Прочитать комментарии кода и настроить его в соответствии с вашими потребностями.

РЕДАКТИРОВАТЬ: я предполагаю, что ваш код находится в sheet1, в противном случае вам нужно будет проверить, не пересекается ли целевой диапазон события с диапазоном, который изменяется в этой строке: evalCellSheet2.Offset(0, 1).Value = evalCellSheet1.Offset(0, 1).Value

Private Sub Worksheet_Change(ByVal Target As Range)

    ' Give meaningful names to your variables
    Dim evalSheet1 As Worksheet
    Dim evalSheet2 As Worksheet

    ' Try not to use variable names that may conflict with Excel/VBA objects, properties, etc,
    Dim evalCellSheet1 As Range
    Dim evalCellSheet2 As Range

    Dim lastRowSheet1 As Long
    Dim lastRowSheet2 As Long

    ' Fully qualify objects
    Set evalSheet1 = ThisWorkbook.Sheets("Sheet1")
    Set evalSheet2 = ThisWorkbook.Sheets("Sheet2")

    ' Reuse objects you have already set
    lastRowSheet1 = evalSheet1.Cells(evalSheet1.Rows.Count, 1).End(xlUp).Row
    lastRowSheet2 = evalSheet2.Cells(evalSheet2.Rows.Count, 1).End(xlUp).Row

    For Each evalCellSheet2 In evalSheet2.Range("A1:A" & lastRowSheet2)
        For Each evalCellSheet1 In Sheets("Sheet1").Range("A1:A" & lastRowSheet1)
            If evalCellSheet2.Value = evalCellSheet1.Value Then
                ' As you're changing values, disable events and then reenable it
                Application.EnableEvents = False
                evalCellSheet2.Offset(0, 1).Value = evalCellSheet1.Offset(0, 1).Value
                Application.EnableEvents = True
            End If
        Next evalCellSheet1
    Next evalCellSheet2

End Sub

Дайте мне знать, если он работает

...