Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 加速此代码(打开工作簿)_Excel_Vba - Fatal编程技术网

Excel 加速此代码(打开工作簿)

Excel 加速此代码(打开工作簿),excel,vba,Excel,Vba,我一直在尝试加快这段代码的运行速度,因为它目前需要约22秒的时间,我相信它可以比我目前的能力水平做得更聪明 我相信延迟是由打开其他工作簿引起的,所以我只是想弄清楚如何使这个过程更智能化 基本上,我有60个版本的电子表格(每个部门1个),每天早上通过BisTalk生成数据表时,使用此代码更新数据,从而为部门提供最新的工资支出预测 它打开这些工作表是为了刷新文档中的数据(基本上只需要打开然后关闭这3个工作簿),因此,当部门打开文档并运行执行以下宏的更新按钮时,所做的更改可以从1个工作簿中完成,并流经

我一直在尝试加快这段代码的运行速度,因为它目前需要约22秒的时间,我相信它可以比我目前的能力水平做得更聪明

我相信延迟是由打开其他工作簿引起的,所以我只是想弄清楚如何使这个过程更智能化

基本上,我有60个版本的电子表格(每个部门1个),每天早上通过BisTalk生成数据表时,使用此代码更新数据,从而为部门提供最新的工资支出预测

它打开这些工作表是为了刷新文档中的数据(基本上只需要打开然后关闭这3个工作簿),因此,当部门打开文档并运行执行以下宏的更新按钮时,所做的更改可以从1个工作簿中完成,并流经所有60个工作簿

编辑:在打开wb3(6.8s)和wb5(5.8s)的过程中,始终使用下面的方法和计时器。因此,如果我能以某种方式加快速度,它将产生巨大的影响,宏的其余部分需要3.25秒来处理

Public CalcState As Long
Public EventState As Boolean
Public PageBreakState As Boolean

Sub OptimizeCode_Begin()

Application.ScreenUpdating = False

EventState = Application.EnableEvents
Application.EnableEvents = False

CalcState = Application.Calculation
Application.Calculation = xlCalculationManual

PageBreakState = ActiveSheet.DisplayPageBreaks
ActiveSheet.DisplayPageBreaks = False

End Sub

Sub OptimizeCode_End()

ActiveSheet.DisplayPageBreaks = PageBreakState
Application.Calculation = CalcState
Application.EnableEvents = EventState
Application.ScreenUpdating = True

End Sub


Sub UpdateForecaster()

' UpdateForecaster
' *************************************

' Blocking the ability to pause macro due to sensitive information
    Application.EnableCancelKey = xlDisabled

'Optimize Code
  Call OptimizeCode_Begin


Dim Main As Workbook
Set Main = ActiveWorkbook
Dim wb2 As Workbook
Dim wb3 As Workbook
Dim wb4 As Workbook
Dim wb5 As Workbook

'Opening Data Sheets
    Set wb2 = Workbooks.Open("Sheet with the workbook paths, so can easily be updated within rather than updating the code on the 60 versions of this document for each store", ReadOnly:=True)
Dim directory1 As String
Dim directory2 As String
    directory1 = Worksheets("Sheet1").Range("A2").Value
    directory2 = Worksheets("Sheet1").Range("A4").Value

    Set wb3 = Workbooks.Open(directory1, ReadOnly:=True, Password:="password")
    Set wb4 = Workbooks.Open(directory2, ReadOnly:=True)
    Set wb5 = Workbooks.Open(Filename:= _
    "datasheet", ReadOnly:=True, Password:="password")
    wb5.Close
    Main.Activate

'Refreshing Cell Information
    Range("D4").Formula = "=d97"
    Range("D5").Formula = "=d98"
    Range("D6").Formula = "=d99"
    Range("D7").Formula = "=d100"
    Range("D10").Formula = "=d103"
    Range("D11").Formula = "=d104"
    Range("D12").Formula = "=d105"
    Range("D13").Formula = "=d106"

    ('Same as above across other columns to refresh')              

    ' Close Workbooks
    wb3.Close False
    wb4.Close False
    wb2.Close False

'Optimize Code
  Call OptimizeCode_End

End Sub

看起来,将此速度提高一个适当幅度的一个quickfire方法是将其他工作簿文件更改为binary.xlsb,这将这些文件的加载时间减少到原来的三分之一。

Range(“D4:D7”)。Formula=“=D97”
<代码>范围(“D10:D13”)。公式=“=D103”。您可以将公式写入整个范围,Excel将更新相关引用。因此,您可能可以简化对其他列所做的任何操作。事实上,如果您需要多个列来完成相同的操作,例如:
Range(“D4:D7,F4:F7,H4:H7…等”)。Formula=“=D97”
无论哪种方式,对
Range
对象的迭代都很慢。所以你可能想问一个问题“我需要公式吗?”。如果答案是否定的,那么你可能希望通过更快的内存工作。酷,这很好知道,更新了上述内容,以简化为只有3行的范围,而不是过多的范围。我相信它减少了一点运行时间,似乎是~19秒运行,所以很有帮助。如果您使用
Timer
并进行一些
调试,ThanksIt将有助于您加快代码速度。在代码中打印
语句,找出占用时间最多的地方Tanks@TimWilliams,这非常有帮助。发现我的
Call OptimizeCode\u End
部分出错,否则我可能不会发现。因此,在背景中出错的地方刮去了9。首当其冲的是工作簿的打开,特别是因为它是一个大文件,每个帐户的预算信息都需要~6秒才能打开。