在工作中,我在Excel中使用VBA宏,对于表中的每一行,它需要生成具有特定格式的单个工作表。
我有一个运行正常的工作代码,但我遇到的问题是,每个新工作表需要更长的时间才能以二次方式复制,这意味着整个过程会缩放为行,这是不可接受的。
使用不同方法运行时间:
我已经对代码的不同部分进行了计时,并得出结论,问题是时间的增加是文档中工作表数量的函数(如果我在创建新工作表之前删除每个新工作表,那么& #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
有没有办法对此进行优化,以免我的运行时间增加?
谢谢!
答案 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
这可能有点帮助。