Word VBA 2016, таблица: нет ответа при настройке затенения ячеек с помощью цикла

В Word 2016 VBA я хочу установить затенение каждой ячейки таблицы с помощью цикла. Похоже, что это работает для таблиц размером до 15*15. С таблицами, такими как 20*20 или больше, Word больше не отвечает. Выполнение программы кажется правильным, хотя при использовании одного шага. Я пробовал это для таблиц ок. 50*50. ScreenRefresh и ScreenUpdating, похоже, не имеют никакого влияния. В примере кода установка затенения каждой ячейки на один и тот же цвет фона предназначена только для демонстрации, наконец, я хочу применить более сложные настройки.

Sub TableCells_SetBackgroundColors()
' Set background color for each cell in Word table
' Application does not respond if table is larger than about 20*20
' debug  single step works in any case
'Application.ScreenUpdating = False

Dim i, k, cntCol, cntRow As Integer
cntCol = 15 ' 20 is not ok
cntRow = 15 ' 20 is not ok
If ActiveDocument.Tables.Count <> 0 Then
    ActiveDocument.Tables(1).Delete
End If
ActiveDocument.Tables.Add Range:=Selection.Range, _
                             numRows:=cntRow, _
                             NumColumns:=cntCol

Dim myTable As Word.Table
Set myTable = Selection.Tables(1)
With myTable.Borders
 .InsideLineStyle = wdLineStyleSingle
 .OutsideLineStyle = wdLineStyleSingle
End With
For i = 1 To cntRow Step 1
    For k = 1 To cntCol Step 1
        myTable.Cell(i, k).Shading.BackgroundPatternColor = wdColorRed
        'Application.ScreenRefresh
    Next k
Next i

'Application.ScreenUpdating = True

End Sub

2 ответа

Вступление: Парень, который прокомментировал здесь. Ваша проблема возникает из-за того, что выполнение кода занимает много времени, когда само приложение не делает никаких событий, насколько я знаю. Если это занимает больше времени, чем определенное время, приложение просто говорит, что оно больше не отвечает. Например, на моем компьютере приложение больше не отвечает даже с 15 строками и столбцами. Есть один метод, который предотвращает это: DoEvents, Ниже приведен ваш код с 3 добавленными мной строками, который прекрасно работает на моей машине. Ниже кода немного больше объяснения.

Sub TableCells_SetBackgroundColors()
' Set background color for each cell in Word table
' Application does not respond if table is larger than about 20*20
' debug  single step works in any case
'Application.ScreenUpdating = False

    Dim i, k, cntCol, cntRow As Integer


    cntCol = 21 ' 20 is not ok
    cntRow = 21 ' 20 is not ok
    If ActiveDocument.Tables.Count <> 0 Then
        ActiveDocument.Tables(1).Delete
    End If
    ActiveDocument.Tables.Add Range:=Selection.Range, _
                                 numRows:=cntRow, _
                                 NumColumns:=cntCol

    Dim myTable As Word.Table
    Set myTable = Selection.Tables(1)
    With myTable.Borders
     .InsideLineStyle = wdLineStyleSingle
     .OutsideLineStyle = wdLineStyleSingle
    End With
    For i = 1 To cntRow Step 1

        'New
        Application.StatusBar = "Row " & i & " of " & cntRow
        'New

        For k = 1 To cntCol Step 1
            'New and important
            DoEvents
            'New and important
            myTable.Cell(i, k).Shading.BackgroundPatternColor = wdColorRed
        Next k
    Next i

    'New
    Application.StatusBar = False
    'New

End Sub

Более подробное объяснение: По какой-то причине Word работает очень медленно, просматривая все ячейки таблицы и применяя к ним некоторое затенение. Это вызывает поведение, которое я описал выше. Чтобы приложение не отвечало, я вставил строку DoEvents в вашем цикле столбцов, чтобы приложение "понимало, что оно все еще живо" во время каждой итерации ячейки. Я не проверял, сколько затрат на производительность имеет метод DoEvents в этом случае, но если вы считаете его значительным, вы можете попытаться переместить DoEvents в цикл строк и посмотреть, все ли у вас в порядке. Что касается двух других строк с StatusBar, они не являются необходимыми для предотвращения ответа приложения, но я считаю их очень полезными, потому что они мешают пользователю / вам / мне беспокоиться о том, что приложение упало. Он покажет вам в строке состояния, в какой строке находится код в данный момент.

Статусбар во время исполнения:

введите описание изображения здесь

@Xam Eseerts

Спасибо за ваш ответ, который решает проблему. (До сих пор удивительно, как медленно работает Word здесь. Для моей задачи по созданию большой цветной таблицы я наконец-то переключился на Excel).

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