在VBA中从已closures的工作簿中提取数据

收到错误:运行时错误“1004”。 应用程序定义或对象定义的错误。 我已经search了类似的主题论坛,但永远得不到一个好的答案。 我正试图从一个封闭的工作簿中提取数据。 这是我的代码的示例。 我需要源数据的最后一行,但是有许多工作簿,每一行都会有不同的最后一行。

Option Explicit Sub CopyFromClosedWorkbook2() ' Defines variables Dim wb1 As Workbook, wb2 As Workbook Dim fname As String, fpath As String, shtname As String Dim tgtlr As Long Dim current_lcn As Long Dim current_row As Long Dim i As Long: i = 2 ' Disable screen updating to reduce screen flicker Application.ScreenUpdating = False ' Define which workbook is which current_lcn = Cells(2, 3).Value Set wb1 = Workbooks("RBOM test.xlsm") tgtlr = Cells(Rows.Count, 3).End(xlUp).Row fpath = "C:\users\folder1\My Documents\folder2\folder3\" fname = "filename.xlsx": shtname = "filename" With ThisWorkbook.Sheets("Sheet1").Range("AQ2:FO2") .Formula = "=INDEX('" & fpath & "[" & fname & "]" & shtname & "'!A:A, COUNTA('" & fpath & "[" & fname & "]" & shtname & "'!$A:$A)-1)" .Value = .Value End With ' Re-enable screen updating Application.ScreenUpdating = True End Sub 

文件名与shtname相同

我最终希望得到它,以便在其余的文件中循环。 但是,因为我没有find一种方法来做到这一点,而无需打开工作簿。 我读过有人开发了一个代码,你不必打开工作簿,但是你需要预先确定的范围,而我的不同取决于最后一行。 代码的最后一部分是我将代码合并到for循环中的尝试,并将数据粘贴到相同的条件下。

所以你需要更换这个部分

 Set wb2 = Workbooks.Open(...) .... wb2.Close 

用一些公式引用封闭的WB并自动捕获它的最后一行。 为此,您需要始终填充源表中的一列。 假设这个列是A 你可以尝试用这个replace上面的代码:

 Dim fName As String, fPath As String, shtName As String fPath = "C:\Users\folder1\My Documents\folder2\folder3\" fName = "filename.xlsx": shtName = "mySheet" With ThisWorkbook.Sheets("Sheet1").Range("AQ2:FO2") .Formula = "=INDEX('" & fPath & "[" & fName & "]" & shtName & _ "'!A:A, COUNTA('" & fPath & "[" & fName & "]" & shtName & "'!$A:$A)-1)" .Value = .Value End With 

这将通过一个公式从封闭的WB中获取最后一行,然后修改该值。 现在,您可以循环使用Dir (例如)的许多工作簿,通过​​每次更改variablesfName

ps:设置一个公式并使其在不打开WB的情况下工作,对于Excel文件(即.xlsx )工作得很好,但对于.csv文件则不太好,公式需要WB打开刷新。