粘贴宏(文件到文件)提高速度

时间:2013-12-30 21:31:17

标签: excel vba excel-vba

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Workbooks.Open Filename:="Blah"

Windows("DDD.xlsm").Activate
Sheets("DDDDD").Select
Range("B4:E4500").Select
Application.CutCopyMode = False
Selection.Copy
Windows("Dude").Activate
Sheets("DDDDD").Select
Range("B4:E4").Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=False

2 个答案:

答案 0 :(得分:1)

试试这个。打开文件时,我认为你不会更快地得到它。

Sub Demo()
    ' Declare variables
    Dim wbSrc As Workbook
    Dim wsSrc As Worksheet
    Dim rSrc As Range
    Dim wbDst As Workbook
    Dim wsDst As Worksheet
    Dim rDst As Range

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    ' Avoid Select
    Set wbSrc = Workbooks.Open(Filename:="Blah")
    Set wsSrc = wbSrc.Sheets("DDDDD")
    Set rSrc = wsSrc.Range("B4:E4500")

    Set wbDst = Workbooks("Dude") ' Check this, may need to adjust
    Set wsDst = wbDst.Sheets("DDDDD")
    Set rDst = wsDst.Range("B4:E4500")

    ' Avoid clipboard
    rDst.Value = rSrc.Value

    ' restore settings
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

End Sub

另一种方法可能是使用ADO查询已关闭工作簿中的数据。

想到另一个appraoch:

Sub Demo()
    Dim ws As Worksheet
    Dim rng As Range

    Set ws = ActiveSheet ' <-- Change to your target sheet
    Set rng = ws.Range("B4:E4500")
    rng.FormulaR1C1 = "='Path\To\Your\File\[Blah.xls]DDDD'!RC"
    rng.Value = rng.Value
End Sub

这使用了这样一个事实,即在不打开工作簿的情况下,引用已关闭工作簿中的单元格的简单公式将更新。

ws引用您要将检索到的数据放入示例中的工作表(ActiveSheet,并根据您的需要进行更新。)

rng是您要放置检索到的数据的ws范围。

rng.FormulaR1C1 = ...rng的每个单元格中放置一个公式。在这种情况下,它引用已关闭工作簿中的相同单元格。从已关闭工作簿的完整路径,文件名和工作表名称构建公式。我使用R1C1样式来利用简单的RC语法来获取rng

中每个单元格的地址

rng.Value = rng.Value将公式转换为值(与复制,粘贴值相同,但更快更小)。如果你愿意,你可以保留公式。

答案 1 :(得分:0)

这篇文章包含几个可能对您有帮助的要点。 OZGRID-Optimize Slow VBA Code。帖子中的几点适用于您的情况,例如:绕过剪贴板,在执行代码时防止计算并停止屏幕闪烁等。