收到错误:运行时错误“1004”。应用程序定义或对象定义的错误。我在论坛上搜索了类似的主题但却无法得到一个好的答案。我试图从已关闭的工作簿中提取数据。这是我的代码示例。我需要源数据的最后一行,但是有很多工作簿,每一个都有不同的最后一行。
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
相同我最终想要得到它,它将循环通过其余的文件。但是因为在没有打开工作簿的情况下我还没有找到办法。我读过有人开发了一个代码,你不必打开工作簿,但是你需要预先确定的范围,而我的根据最后一行是不同的。代码的最后一部分是我开始尝试将代码合并到for循环中并使用相同的标准粘贴数据。
答案 0 :(得分:1)
所以你需要更换这个部分
Set wb2 = Workbooks.Open(...) .... wb2.Close
使用一些引用已关闭WB的公式并自动捕获其最后一行。为此,您需要在源表中始终填充一列。假设此列为A
。您可以尝试使用以下代码替换上面的代码:
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
循环许多工作簿(例如),每次更改变量fName
。
ps:设置一个公式并使其工作而不打开WB可以很好地处理Excel文件(即.xlsx
)但不太适合.csv
个文件,其中公式需要WB打开刷新。