Recursive Workbook_SheetChange - PullRequest
       0

Recursive Workbook_SheetChange

1 голос
/ 11 января 2020

Есть ли способ, которым я могу временно отключить событие Workbook_SheetChange перед моим временем l oop и восстановить его на wend?

Я полагаю, что я сам в рекурсивном l oop. Динамически изменяя значение и инициируя новую активную ячейку, я отключаю событие Workbook_SheetChange. Что было бы хорошо, за исключением того, что я нахожусь в рутине SheetChange в то время.

Не хорошо.

Цель состоит в том, чтобы помочь мне выучить мои линии для моей роли в театральном представлении, заставив меня введите мои строки, за которыми автоматически следует следующая строка (и) другого актера (ов) до моей следующей строки. Которые, конечно, представляют мои реплики.

Идея здесь состоит в том, чтобы либо автоматически заполнить ячейку в столбце А, когда соответствующая ячейка в столбце c не оценена как «Кондон» (Моя роль в пьесе Гаупмана ) или сравните (проанализированное содержимое) ячейки в столбце A с (проанализированным содержимым) соответствующей ячейки в столбце B (через подпрограмму CleanCode не показано).

Я хочу заполнить ячейку / столбец A с соответствующей ячейкой / столбцом B ТОЛЬКО КОГДА я активен в активной строке, и ячейка в столбце C в этой строке НЕ является «Condon». Но затем я хочу заполнить каждую ячейку столбца A каждой последующей строки значением ее столбца B, пока ее столбец C снова не станет "Condon" (или, в конечном счете, пустым, чтобы остановить - но это позже)

Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range)

If ActiveCell.Column <> 1 Then Exit Sub 'Only interested in column A activity

Dim ColA As String
Dim ColB As String
Dim CellA As Range
Dim CellB As Range

If ActiveCell.Address = "$A$1" Then    'Avoid error messages when resetting cursor
    Exit Sub
End If

Set CellA = ActiveCell.Offset(-1, 0)    'Point back to row just processed (col A)
Set CellB = ActiveCell.Offset(-1, 1)    ' (col B)

If Len(CellA.Value) > 0 Then   'Does previous cell in A column contain a value?
    ColA = CleanCode(CellA)    'Remove all but alpha and capitalize values in column A cell
    ColB = CleanCode(CellB)    'Remove all but alpha and capitalize values in column B cell

    If (ColA <> ColB) Then     'If they don't match show contents of Column B cell
        If (MsgBox(CellB, vbRetryCancel) = vbRetry) Then 
            CellA.Select       'Continue anyway on retry 
        End If
    Else
        While (ActiveCell.Offset(0, 2)) <> "Condon" 'Unless cell in column C = Condon (test case)
'OOPS! I think next statement invokes a Workbook_SheetChange event
            ActiveCell.Offset(0, 0) = ActiveCell.Offset(0, 1) 'Populate cell in column A with B 
            ActiveCell.Offset(1, 0).Select   'point to the next row
        Wend
    End If
End If
End Sub

Так есть ли способ, которым я могу временно отключить событие Workbook_SheetChange перед моим временем l oop и восстановить его на wend? Или есть даже лучший способ?

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

1 Ответ

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

Я видел, как предыдущий комментарий отключил событие: вот еще одно предложение, по которому Вы можете изменить код

ActiveCell.Offset(1, 0).Select

на

Set ActiveCell= ActiveCell.Offset(1, 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...