从VBA中已关闭的工作簿中提取数据

时间:2017-05-23 20:14:45

标签: excel vba excel-vba

收到错误:运行时错误“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循环中并使用相同的标准粘贴数据。

1 个答案:

答案 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打开刷新。