Небольшая неисправность, без исключений, когда Application.ScreenUpdating = False используется VB.NET

Я столкнулся с чем-то, чего я раньше не видел, Application.ScreenUpdating = False, в результате чего саба немного плохо себя ведет. Это не выдает ошибку, но это вызывает отключение на одну ошибку в результате при включении.

    Try
        'Globals.ThisWorkbook.Application.ScreenUpdating = False
        'if this on sub behaves unexpectedly
        For n = 13 To Globals.ThisWorkbook.Worksheets.Count

            Globals.ThisWorkbook.Worksheets(n).Activate()
            Call ESLAUpdateReportPosition(True)

        Next
        'Globals.ThisWorkbook.Application.ScreenUpdating = True

    Catch ex As Exception
        '...Error Handling
    End Try

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

   SumCount1 = CurrentSheet.Cells(2, 6).value

1 ответ

Решение

Проблема в том, чтобы попытаться принять это значение. Поскольку эта ячейка в рабочей книге считает количество раз, которое элемент используется в столбце, он не обновляется до тех пор, пока For цикл завершен. Таким образом, я мог бы отменить обновление экрана на 1 итерацию и заставить его работать, но когда мне пришлось изменить несколько листов, обновление этого значения не удалось (хотя, казалось, оно обновлялось несколько раз с большим количеством итераций).

Исправить это довольно просто, попросите Excel "обновить" или вычислите значения в формулах, которые вам нужны. Так что для приведенного выше примера вы бы использовали:

    CurrentSheet.Cells(2, 6).Calculate()
    SumCount1 = CurrentSheet.Cells(2, 6).value

Теперь вам нужно быть осторожным, так как это не приведет к обновлению ячеек, на которые есть ссылки в этой ячейке (если они также имеют формулы). Если вам нужно обновить группу ячеек, вы можете обновить весь лист, не указав ячейку: .Cells.Calculate или вы могли бы сделать пересчет всего с Application.CalculateFull()

Другие вопросы по тегам