通过VBA复制另一个工作簿中的数据

这就是我想要做的事情,而且我有点麻烦。 我有一个工作簿,我想从不同的文件收集数据做这样的事情。

Do While THAT_DIFFERENT_FILE_SOMEWHERE_ON_MY_HDD.Cells(Rand, 1).Value <> "" And Rand < 65536 then 'I will search if the last row in my main worksheet is in this file... End Loop 

如果是这样,我会退出While循环,如果不是,我会复制一切。 其实这不会像我想要的那样工作,但我不会find正确的algorithm的麻烦。

我的问题是,我不知道如何访问不同的工作簿。

你可能喜欢函数GetInfoFromClosedFile()


编辑:由于上面的链接似乎不工作了,我添加替代链接1和替代链接2 +代码:

 Private Function GetInfoFromClosedFile(ByVal wbPath As String, _ wbName As String, wsName As String, cellRef As String) As Variant Dim arg As String GetInfoFromClosedFile = "" If Right(wbPath, 1) <> "" Then wbPath = wbPath & "" If Dir(wbPath & "" & wbName) = "" Then Exit Function arg = "'" & wbPath & "[" & wbName & "]" & _ wsName & "'!" & Range(cellRef).Address(True, True, xlR1C1) On Error Resume Next GetInfoFromClosedFile = ExecuteExcel4Macro(arg) End Function 

将数据从工作簿复制到另一个的最佳(也是最简单的)方法是使用Excel的对象模型。

 Option Explicit Sub test() Dim wb As Workbook, wb2 As Workbook Dim ws As Worksheet Dim vFile As Variant 'Set source workbook Set wb = ActiveWorkbook 'Open the target workbook vFile = Application.GetOpenFilename("Excel-files,*.xls", _ 1, "Select One File To Open", , False) 'if the user didn't select a file, exit sub If TypeName(vFile) = "Boolean" Then Exit Sub Workbooks.Open vFile 'Set targetworkbook Set wb2 = ActiveWorkbook 'For instance, copy data from a range in the first workbook to another range in the other workbook wb2.Worksheets("Sheet2").Range("C3:D4").Value = wb.Worksheets("Sheet1").Range("A1:B2").Value End Sub 

很less有理由不在Excel中打开多个工作簿。 重要的代码行是:

 Application.EnableEvents = False Application.ScreenUpdating = False 

…在代码运行时,您将看不到任何内容,并且不会运行与第二个工作簿的打开关联的代码。 那么有…

 Application.DisplayAlerts = False Application.Calculation = xlManual 

…以阻止您获得与第二个文件的内容相关的popup消息,并避免重新计算的速度缓慢。 确保在编程结束时将其设置回True / xlAutomatic

如果打开第二个工作簿不会引起性能问题,那么你也可以这样做。 实际上,打开第二个工作簿会使它在尝试debugging代码时非常有用,如果某些辅助文件不符合预期的格式

以下是关于使用多个Excel文件的一些专家指导,概述了可用于引用数据的不同方法

一个扩展问题将是如何循环包含在同一文件夹中的多个文件。 您可以使用Windows文件夹选取器:

 With Application.FileDialog(msoFileDialogFolderPicker) .Show If .Selected.Items.Count = 1 the InputFolder = .SelectedItems(1) End With FName = VBA.Dir(InputFolder) Do While FName <> "" '''Do function here FName = VBA.Dir() Loop 

希望以上的一些将是有用的

你正在寻找打开它们的语法:

 Dim wkbk As Workbook Set wkbk = Workbooks.Open("C:\MyDirectory\mysheet.xlsx") 

然后,你可以使用wkbk.Sheets(1).Range("3:3") (或任何你需要的)