2013-04-17 2 views
1

У меня есть лист excel (2010), где я загружаю данные из базы данных, а затем отформатирую каждую строку на основе определенной ячейки в каждой строке. Код для форматирования занимает довольно много времени. Около 4 минут около 150 рядов и 15 колонн. Вот фрагмент кода. В основном это цикл, который проверяет значение row_type и соответственно устанавливает цвет шрифта, цвет фона и т. Д. Для каждой строки. Есть ли лучший способ сделать это, чем использовать цикл? Любые другие улучшения, которые я могу сделать, если цикл является ответом.Форматирование в excel vba занимает много времени

J = 1 
While J <= iNumRows 
    row_type = Worksheets("WaterFall").Range("WaterFallHeaders").Offset(J, -1).Cells(1, 1) 

    If row_type = "main_row" Then 
     With Worksheets("WaterFall").Range("WaterFallHeaders").Offset(J, 0).EntireRow.Font 
      .Bold = False 
      .ColorIndex = RGB(0, 0, 0) 
     End With 
     'yellow Description columns 
     With Worksheets("WaterFall").Range("WaterFallHeaders").Offset(J, 0).Resize(1, 5).Interior 
       .Color = RGB(204, 255, 204) 
     End With 
     'grey amount columns 
     With Worksheets("WaterFall").Range("WaterFallHeaders").Offset(J, 5).Resize(1, dtCount + 2).Interior 
      .Color = RGB(217, 217, 217) 
     End With 

     'blue action columns 
     With Worksheets("WaterFall").Range("WaterFallHeaders").Offset(J, 0).Cells(1, 1).Font 
      .Bold = True 
     End With 
     With Worksheets("WaterFall").Range("WaterFallHeaders").Offset(J, 0).Cells(1, 1).Interior 
       .Color = RGB(184, 204, 225) 
     End With 
    Else 
     With Worksheets("WaterFall").Range("WaterFallHeaders").Offset(J, 0).Resize(1, colCount - 1).Font 
      .Bold = True 
      .Color = RGB(51, 51, 255) 
     End With 
     With Worksheets("WaterFall").Range("WaterFallHeaders").Offset(J, 0).Resize(1, colCount - 1).Interior 
       .Color = RGB(255, 255, 204) 
     End With 
    End If 

    J = J + 1 



Wend 

Благодаря ...

+0

Не могли бы вы создать условный формат, который вы могли бы скопировать и вставить в диапазон? – AxGryndr

+0

Какова ценность 'iNumRows', если вы отлаживаете? Возможно ли, что цикл повторяется больше строк, чем вы хотите? –

+3

Другой вариант - установить Application.ScreenUpdating = false в начале и установить его true, когда вы закончите. Это может уменьшить время отклика. – AxGryndr

ответ

3

Это не похоже на то, что должно занять 4 минуты для завершения (например, Range.Autofill для ~ 100000 строк занимает около 90 секунд на моей машине).

Однако вы можете сделать код более эффективным, уменьшив количество вызовов на определенные объекты, включив в них более эффективное использование блоков With.

Это уменьшает количество раз, которое компилятор должен ссылаться на Worksheets("WaterFall").Range("WaterFallHeaders") на 1. Ранее вы ссылаетесь на это либо 3, либо 6 раз, в зависимости от того, с какой стороны If/Else.

Untested потому что у меня нет файла вашей книги, чтобы проверить его. Дайте мне знать, если это поможет, или если это дает вам какие-либо проблемы.

J = 1 
With Worksheets("WaterFall").Range("WaterFallHeaders") 
    While J <= iNumRows 
     row_type = .Offset(J, -1).Cells(1, 1) 

     If row_type = "main_row" Then 
      With .Offset(J, 0).EntireRow.Font 
       .Bold = False 
       .ColorIndex = RGB(0, 0, 0) 
      End With 

      'yellow Description columns 
      With .Offset(J, 0).Resize(1, 5).Interior 
       .Color = RGB(204, 255, 204) 
      End With 

      'grey amount columns 
      With .Offset(J, 5).Resize(1, dtCount + 2).Interior 
       .Color = RGB(217, 217, 217) 
      End With 

      'blue action columns 
      With .Offset(J, 0).Cells(1, 1) 
       .Font.Bold = True 
       .Interior.Color = RGB(184, 204, 225) 
      End With 
     Else 

      With .Offset(J, 0).Resize(1, colCount - 1) 
       With .Font 
        .Bold = True 
        .Color = RGB(51, 51, 255) 
       End With 
       .Interior.Color = RGB(255, 255, 204) 
      End With 
     End If 
    Wend 
End With 
Смежные вопросы