Сбой при удалении значений ячеек Worksheet_Change - PullRequest
0 голосов
/ 15 января 2019

Я хотел бы запускать макрос (скажем, test1) непрерывно на листе всякий раз, когда значение в данном диапазоне (от F5 до LastRow). В этом отношении помогли события Worksheet_Activate и Worksheet_Change. Однако в Excel происходит сбой при удалении значений в диапазоне. Как пример:

F5 = 100, F6 = 120, F7 = 140

Предположим, значение F5 изменено на 120. Затем макрос и события работают нормально. Однако, когда все значения удалены (поэтому F5 до F7 пусты), Excel вылетает.

Я пытался запустить каждую строку в моем коде отдельно, но я не уверен, что вызывает сбой (возможно, цикл, как написано в макросе)?

Я новичок в VBA, и любая помощь очень ценится: -)

Sub TEST()

 Dim LastRow As Long
 Dim i As Long

 LastRow = Sheets("blad1").Range("F5").End(xlDown).Row

 For i = 5 To LastRow

 Range("Z" & i).Formula = "=ABS(F" & i & " -(J" & i & " *(100/21)))< 5" 
 'Checks if the value in column F matches the amount in column J for each 
 'cellin that column with a significance of 5. The return is shown as 
 'True or False.
  Next i

 For i = 5 To LastRow

 If Range("Z" & i) = True Then Range("F" & i).Interior.Color = RGB(255, 
 255, 255) Else: Range("F" & i).Interior.Color = RGB(255, 0, 0) 
 'If the 
 'value in column Z is True, then the cell colour in column F is white. 
 'If False, then red.
 Next i

 End Sub

 'These are the lines on the relevant worksheet:

 Private Sub Worksheet_Activate()

 Call test

 End Sub

 Private Sub Worksheet_Change(ByVal Target As Range)

 Dim LastRow As Long
 LastRow = Sheets("Test").Range("F5").End(xlDown).Row

 If Not Intersect(Target, Me.Range("F5:F" & LastRow)) Is Nothing Then
    Application.EnableEvents = False
    Call test
    Application.EnableEvents = True
  End If

 End Sub

1 Ответ

0 голосов
/ 15 января 2019

Линия

LastRow = Sheets("blad1").Range("F5").End(xlDown).Row

возвращает значение, равное абсолютной самой последней возможной строке (1048576), когда столбец F пуст. Затем остальная часть вашего макроса выполняет итерацию по всему листу, выполняя ваш код для каждой отдельной строки. Вы можете себе представить, что происходит, когда вы пытаетесь вставить 1048572 формулы в электронную таблицу. Лучшим вариантом было бы использовать

LastRow = Sheets("blad1").Range("F" & Rows.Count).End(xlUp).Row

Для поиска последней использованной строки снизу вверх. Тогда вы можете изменить свою Worksheet_Change логику на

If LastRow > 1 Then
    'Code Here
End if

EDIT:

Также стоит отметить, когда LastRow = Sheets("blad1").Range("F5").End(xlDown).Row, тогда этот код

If Not Intersect(Target, Me.Range("F5:F" & LastRow)) Is Nothing Then
    Application.EnableEvents = False
    Call test
    Application.EnableEvents = True
End If

всегда будет оценивать True, когда вы редактируете значения в столбце F для любого номера строки, большего чем строка 4, потому что Intersect() в основном говорит "Если диапазон один и диапазон два перекрывают значение true". Таким образом, Range("F7") находится в пределах Range("F5:F1048576") независимо от того, имеет ли оно значение.

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