2016-11-19 9 views
2

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

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 
+0

Вы только что пробовали ждать, когда приложение больше не ответит? Когда выполнение кода занимает больше времени, то определенное время все офисные приложения показывают это поведение, насколько мне известно, но обычно вы все еще в порядке, если вы просто ждете. –

ответ

0

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

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 

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

Строка состояния во время выполнения:

enter image description here

0

@Xam Eseerts

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