在excel vba中格式化需要很长时间

时间:2013-04-17 19:00:28

标签: performance excel vba excel-vba excel-2010

我有一张excel(2010)表格,我从数据库加载数据,然后根据每行中的特定单元格格式化每一行。格式化代码需要很长时间。大约150行和15列约4分钟。这是代码的片段。基本上它是一个循环,它检查row_type的值,并相应地设置每一行的字体颜色,背景颜色等。有没有比使用循环更好的方法呢?如果循环是答案,我可以做出任何其他改进。

 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

...谢谢

1 个答案:

答案 0 :(得分:3)

这看起来不像需要4分钟完成的事情(例如,我的机器上大约需要90秒的Range.Autofill大约需要90秒。)

但是,您可以通过减少对某些对象的调用次数来提高代码效率,并且可以更好地使用With块。

这减少了编译器引用Worksheets("WaterFall").Range("WaterFallHeaders")为1的次数。以前,您可以参考3或6次,具体取决于If/Else的哪一侧。

未经测试,因为我没有您的工作簿文件来测试它。如果这有帮助,或者它给你带来任何问题,请告诉我。

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