Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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
Vba 加快Excel宏的打开速度_Vba_Excel - Fatal编程技术网

Vba 加快Excel宏的打开速度

Vba 加快Excel宏的打开速度,vba,excel,Vba,Excel,因此,此Excel文件的整个范围是将其他27个外部文件逐个复制并粘贴到当前Excel文件。为了说明我的意思,下面是代码示例和模拟捕获图片 宏(行#包括空格行): 1。导入子组件 在我的档案里,我有27个这样的潜艇。它比这个例子长。我真正的宏总共有179行。在本例中,它只有51行 唯一要更改的是第6行VBA代码中的行号作为单词行 Sub Import_NJ() Dim Row As Integer, PathFileOpen As String, NameFileOpen As

因此,此Excel文件的整个范围是将其他27个外部文件逐个复制并粘贴到当前Excel文件。为了说明我的意思,下面是代码示例和模拟捕获图片

宏(行#包括空格行): 1。导入子组件

在我的档案里,我有27个这样的潜艇。它比这个例子长。我真正的宏总共有179行。在本例中,它只有51行

唯一要更改的是第6行VBA代码中的行号作为单词行

    Sub Import_NJ()

    Dim Row As Integer, PathFileOpen As String, NameFileOpen As String, 
    TypeFileOpen As String, FullFileName As String, TabCopy As String, ModelFileName As String

    Let Row = Worksheets("Control_Table").Cells("2", "D").Value
    Let PathFileOpen = Worksheets("Control_Table").Cells(Row, "A").Text
    Let NameFileOpen = Worksheets("Control_Table").Cells(Row, "B").Text
    Let TypeFileOpen = Worksheets("Control_Table").Cells(Row, "C").Text
    Let FullFileName = PathFileOpen & "\" & NameFileOpen & TypeFileOpen
    Let TabCopy = Worksheets("Control_Table").Cells(Row, "J").Text
    Let ModelFileName = Worksheets("Control_Table").Cells("10", "B").Text

        Application.AskToUpdateLinks = False
        Application.DisplayAlerts = False
        Application.Calculation = xlCalculationManual
        Workbooks.Open FileName:=FullFileName, UpdateLinks:=0

    'Copy Income Statement
        Workbooks(NameFileOpen).Worksheets("Total_Reports").Cells("9", "C").Resize(5, 120).Copy         'Revenues
        Workbooks(ModelFileName).Worksheets(TabCopy).Cells("4", "AW").Resize(5, 120).PasteSpecial xlPasteValues
        Workbooks(NameFileOpen).Worksheets("Total_Reports").Cells("18", "C").Resize(4, 120).Copy        'Prod Costs
        Workbooks(ModelFileName).Worksheets(TabCopy).Cells("11", "AW").Resize(4, 120).PasteSpecial xlPasteValues
        Workbooks(NameFileOpen).Worksheets("Total_Reports").Cells("25", "C").Resize(26, 120).Copy       'Employee Related thru maintenance
        Workbooks(ModelFileName).Worksheets(TabCopy).Cells("17", "AW").Resize(26, 120).PasteSpecial xlPasteValues
        Workbooks(NameFileOpen).Worksheets("Total_Reports").Cells("53", "C").Resize(3, 120).Copy       'D&A
        Workbooks(ModelFileName).Worksheets(TabCopy).Cells("46", "AW").Resize(3, 120).PasteSpecial xlPasteValues



        Application.CutCopyMode = False
        Workbooks(NameFileOpen).Close
        Application.DisplayAlerts = True

    End Sub
  • 批量导入子系统
  • 虽然它只显示了7次呼叫,但我的文件中有27次呼叫

        Sub batch_import()
        With Application
    
            Call Import_NJ   
            Call Import_MD 
            Call Import_PA   
            Call Import_OKC 
            Call Import_CA    
            Call Import_HI 
            Call Import_IN    
    
        End With
    
            Application.Calculation = xlCalculationAutomatic
            ActiveWorkbook.Save
            Application.DisplayAlerts = True
    
            MsgBox _
            ("Batch loading Completed.")
    
        End Sub
    
    我尝试的是:

  • 关闭每个子对象中的自动计算,如第一个示例宏中所示。还有尽可能多的其他应用程序

  • 我没有关闭屏幕更新,因为我的经理想看到它

  • 我在Patch sub的末尾激活自动计算

  • 我想阻碍整个过程的原因是,我在模块中有超过27个SUB。此外,工作表中还填写了大量公式


    关于打开文件并运行它,有没有办法加快宏的速度?如果我需要更多地讨论这个问题,请告诉我。提前感谢您,并通读我的问题。:)

    您只是在粘贴值;而是直接传输值,并从考虑中删除剪贴板。源或目标都可以在具有。。。以…结束

    这个,

    变成

    With Workbooks(NameFileOpen).Worksheets("Total_Reports")
        Workbooks(ModelFileName).Worksheets(TabCopy).Cells("4", "AW").Resize(5, 120) = _
            .Cells("9", "C").Resize(5, 120).Value2         'Revenues
        Workbooks(ModelFileName).Worksheets(TabCopy).Cells("11", "AW").Resize(4, 120) = _
            .Cells("18", "C").Resize(4, 120).Value2        'Prod Costs
        Workbooks(ModelFileName).Worksheets(TabCopy).Cells("17", "AW").Resize(26, 120) = _
            .Cells("25", "C").Resize(26, 120).Value2       'Employee Related thru maintenance
        Workbooks(ModelFileName).Worksheets(TabCopy).Cells("46", "AW") = _
            .Cells("53", "C").Resize(3, 120).Value2        'D&A
    End With
    

    如注释中所述,如果外部文件位于或超过1Mb文件大小区域,请将其另存为.XLSB(excel二进制文件)以减少加载时间。

    您可以通过定义工作表对象变量进一步澄清代码

    这是与@Jeeped post相同的代码部分

    Dim wsTR As Worksheet
    Dim wsTC As Worksheet
    
    Set wsTR = Workbooks(NameFileOpen).Worksheets("Total_Reports")
    Set wsTC = Workbooks(ModelFileName).Worksheets(TabCopy)
    
    
    wsTC.Cells(4, "AW").Resize(5, 120) = wsTR.Cells(9, "C").Resize(5, 120).Value2       ' Revenues
    wsTC.Cells(11, "AW").Resize(4, 120) = wsTR.Cells(18, "C").Resize(4, 120).Value2     ' Prod Costs
    wsTC.Cells(17, "AW").Resize(26, 120) = wsTR.Cells(25, "C").Resize(26, 120).Value2   ' Employee Related thru maintenance
    wsTC.Cells(46, "AW") = wsTR.Cells(53, "C").Resize(3, 120).Value2                    ' D&A
    

    .Cells(“9”,“C”)
    而不是
    .Cells(9,“C”)
    实际工作吗?我不知道。你的问题是你与电子表格本身的交互太多,这就是为什么它需要一段时间才能运行。根据经验,您应该避免复制和粘贴、选择、激活。。。。任何直接“接触”对象/应用程序的行为都应该避免costs@Jeeped-是的!我也不知道,只是检查了一下,它就行了。漂亮的“把戏”@嘲笑。那确实管用!哈索,上面的代码有效,是吗?只是速度慢/可以改进吗?这可能比现在更好。另外,正如@DougCoats所提到的,不要
    。复制
    /
    。粘贴
    ,尤其是当您只需要值时。您可以这样做:
    Range([destination Range])。Value=Range([copy Range])。Value
    哪个应该更快。为什么使用“Value2”而不是“Value”。或者就是这样?在我更改代码后,我会尝试使用XLSB。Value2是没有区域货币或日期标记的原始基础值。它比.Value稍微快一点,但您可能会将日期(如2017年8月14日)更改为42961,您可以将其格式化回2017年8月14日。这一个非常优雅!我试试看。
    Dim wsTR As Worksheet
    Dim wsTC As Worksheet
    
    Set wsTR = Workbooks(NameFileOpen).Worksheets("Total_Reports")
    Set wsTC = Workbooks(ModelFileName).Worksheets(TabCopy)
    
    
    wsTC.Cells(4, "AW").Resize(5, 120) = wsTR.Cells(9, "C").Resize(5, 120).Value2       ' Revenues
    wsTC.Cells(11, "AW").Resize(4, 120) = wsTR.Cells(18, "C").Resize(4, 120).Value2     ' Prod Costs
    wsTC.Cells(17, "AW").Resize(26, 120) = wsTR.Cells(25, "C").Resize(26, 120).Value2   ' Employee Related thru maintenance
    wsTC.Cells(46, "AW") = wsTR.Cells(53, "C").Resize(3, 120).Value2                    ' D&A