Vba 从一个工作簿获取数据并添加到另一个工作簿的最有效方法是什么

Vba 从一个工作簿获取数据并添加到另一个工作簿的最有效方法是什么,vba,excel,Vba,Excel,我试图从一个工作簿中获取数据,并以最有效的方式将其添加到另一个工作簿中。我尝试过复制和粘贴值,这是我在大约5分钟内尝试过的效率最低的方法。我目前正在使用.value2=value2。使用此方法,打开一个35000KB工作簿并将其复制到另一个工作簿,然后关闭35000KB工作簿所需的总时间约为99秒。我想把速度加快一分钟,但显然越快越好。这是我正在使用的代码- Lastrow = fromWs.Range("A" & fromWs.Rows.Count).End(xlUp).Row to

我试图从一个工作簿中获取数据,并以最有效的方式将其添加到另一个工作簿中。我尝试过复制和粘贴值,这是我在大约5分钟内尝试过的效率最低的方法。我目前正在使用.value2=value2。使用此方法,打开一个35000KB工作簿并将其复制到另一个工作簿,然后关闭35000KB工作簿所需的总时间约为99秒。我想把速度加快一分钟,但显然越快越好。这是我正在使用的代码-

Lastrow = fromWs.Range("A" & fromWs.Rows.Count).End(xlUp).Row

toWs.Range("A2:CQ" & Lastrow - 13).Value2 = fromWs.Range("A15:CQ" & Lastrow).Value2

有没有关于如何大幅加速的想法?我已经有ScreenUpdate=False,计算设置为xlCalculation Manual等。谢谢

35 mb的工作簿非常大

以下是您可以练习的内容: 可以使用VBA创建引用已关闭工作簿的公式

对于本例,我将工作簿另存为

“C:\Users\dmorrison\Downloads\Closed_WB.xlsx” 为了找到已关闭工作簿中的最后一行,我将使用以下公式

=MATCH(9.99999999999999E+307, 'C:\Users\dmorrison\Downloads\[Closed_WB.xlsx]Sheet1'!$A:$A,TRUE)
我用VBA把这个公式放在Z1里

此公式仅查找数字,请使用其他公式查找文本 现在Z1表示关闭工作簿的最后一行

现在,我将参考公式置于
范围(“A2:CQ2”)

使用
autofill
将公式填充到最后一行

 .Range("A2:CQ2").AutoFill Destination:=.Range("A2:CQ" & LstRw), Type:=xlFillDefault
然后将这些公式转换为值

FrmLA_Rng.Value = FrmLA_Rng.Value
完整的代码如下所示:

Sub Get_Row()
    Dim wb As Workbook, sh As Worksheet, rng As Range, LstRw As Integer, FrmLA_Rng As Range

    Set wb = ThisWorkbook
    Set sh = wb.Sheets("Sheet1")

    With sh

        Set rng = .Range("Z1")
        rng = "=MATCH(9.99999999999999E+307, 'C:\Users\dmorrison\Downloads\[Closed_WB.xlsx]Sheet1'!$A:$A,TRUE)"
        LstRw = .Range("Z1") - 10
        Set FrmLA_Rng = .Range("A2:CQ" & LstRw)
        .Range("A2:CQ2") = "='C:\Users\dmorrison\Downloads\[Closed_WB.xlsx]Sheet1'!R[10]C"
        .Range("A2:CQ2").AutoFill Destination:=.Range("A2:CQ" & LstRw), Type:=xlFillDefault
        FrmLA_Rng.Value = FrmLA_Rng.Value

    End With

End Sub
还可以选择使用此公式(如果A列中没有空格)


打开文件需要多长时间?是否有数据一直到列
“CQ”
?如果不是,也许一种更动态的方法来发现数据的边缘会加快速度。关闭屏幕更新之类的小技巧(
Application.ScreenUpdate=False
)也可以提高速度。只要确保在进程完成或遇到任何错误时将其重新打开即可。打开该文件需要约20-25秒,使用.value=.value需要约50-75秒。到CQ一路上都有数据。我正在添加的报告已定义/设置,因此CQ将始终有数据。您是否尝试打开文件
ReadOnly
UpdateLinks=False
:看起来很酷。我试试这个。你认为这会提高性能多少?我不知道…我只是在小规模上测试了一下,让我们知道。
FrmLA_Rng.Value = FrmLA_Rng.Value
Sub Get_Row()
    Dim wb As Workbook, sh As Worksheet, rng As Range, LstRw As Integer, FrmLA_Rng As Range

    Set wb = ThisWorkbook
    Set sh = wb.Sheets("Sheet1")

    With sh

        Set rng = .Range("Z1")
        rng = "=MATCH(9.99999999999999E+307, 'C:\Users\dmorrison\Downloads\[Closed_WB.xlsx]Sheet1'!$A:$A,TRUE)"
        LstRw = .Range("Z1") - 10
        Set FrmLA_Rng = .Range("A2:CQ" & LstRw)
        .Range("A2:CQ2") = "='C:\Users\dmorrison\Downloads\[Closed_WB.xlsx]Sheet1'!R[10]C"
        .Range("A2:CQ2").AutoFill Destination:=.Range("A2:CQ" & LstRw), Type:=xlFillDefault
        FrmLA_Rng.Value = FrmLA_Rng.Value

    End With

End Sub
 "=COUNTA( 'C:\Users\dmorrison\Downloads\[Closed_WB.xlsx]Sheet1'!$A:$A)"