Excel宏缓慢与许多床单

时间:2016-07-14 19:40:03

标签: excel vba

在工作中,我在Excel中使用VBA宏,对于表中的每一行,它需要生成具有特定格式的单个工作表。

我有一个运行正常的工作代码,但我遇到的问题是,每个新工作表需要更长的时间才能以二次方式复制,这意味着整个过程会缩放为行,这是不可接受的。

使用不同方法运行时间:

run time with different methods

我已经对代码的不同部分进行了计时,并得出结论,问题是时间的增加是文档中工作表数量的函数(如果我在创建新工作表之前删除每个新工作表,那么& #39; s没有时间的二次增加)。创建一个新工作表,然后从模板工作表复制似乎更快,但是是一个边际改进,并且生成的工作表格式不正确。

这是我的代码的相关部分:

Application.ScreenUpdating = False
CalcState = Application.Calculation
Application.Calculation = xlCalculationManual
Application.DisplayStatusBar = False
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False

For i = start To end
        ' Create new sheet from template
        Worksheets("Template").Copy After:=Worksheets(numsheets) 
        numsheets = numsheets + 1

        ' Change sheet's name
        item_index = Worksheets("Table").Cells(i, item).Value            
        name = "Item " & item_index
        ActiveSheet().Name = name

        ' Insert data
        Worksheets(name).Range("I30").Value = i

    End If
Next i

Application.ScreenUpdating = True
Application.Calculation = CalcState
Application.EnableEvents = True
Application.DisplayStatusBar = True

有没有办法对此进行优化,以免我的运行时间增加?

谢谢!

2 个答案:

答案 0 :(得分:0)

在子行从代码的最顶部开始之前,将选项显式打开。

在子行之后直接放置Application.ScreenUpdating = False。

直接在End Sub行之前放置Application.ScreenUpdating = True。

声明所有变量。

对变量变量使用转换函数。

答案 1 :(得分:0)

我会首先将所有名称加载到数组中,以避免必须单独引用它们,例如:

`dim arrNames    As variant

Set arrNames = range(*itemlist*).value`

此外,在项目资源管理器中,我会将模板重命名为wksTemplate,以使引用更快一些。我认为您可以在创建每个工作表时设置对它的引用:

Set wksNew = wksTemplate.copy....

Then use that reference:

With wksNew
    .name = arrNames(I,1)
    .range("I30").value = i
End with

这可能有点帮助。