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).