更新目标工作簿 – 从源工作簿中提取数据

我的问题如下:我给了多个人一本练习册。 他们在他们select的文件夹中有这个工作簿。 工作簿名称对于所有人员都是相同的,但文件夹位置不同。 假设通用文件名是MyData-1.xls。 现在我已经更新了这个工作簿,并且想要把它交给这些人。 但是,当他们收到新的(我们称之为MyData-2.xls)时,我想从他们的文件(MyData-1)中提取特定的数据部分,并自动将其放入新提供的(MyData-2)中。 这两个工作簿要复制/导入的列和单元格是相同的。 假设我想从MyData-1.xls,Sheet 1,单元格B8到C25 …的单元格数据(仅值)导入到MyData-2.xls工作簿中的相同位置。 我怎样才能在代码中指定(可能附加到一个macros驱动的导入数据现在button),我想这个数据带入这个新的工作簿。 我已经尝试在我自己的位置打开两个工作簿,并使用复制/粘贴特殊链接过程。 它工作得很好,但似乎在两个实体工作簿之间build立了一个硬连接。 我改变了源工作簿的名称,它仍然工作。 这使我相信两者之间有一个“硬连接”,这不会让我把目标(MyData-2.xls)工作手册给别人,让它find他们的源工作簿。

为了澄清我的理解,每个用户都有一个名为MyData-1.xls但具有不同位置的电子表格。 您希望向每个人发送一个新的电子表格MyData-2,它将自动从MyData-1.xls中的范围B8:C25中提取数据?

有这样做的各种select,下面我提供了一个这样做的方法。 简而言之,用户将打开MyData-2,单击一个button,代码将在其目录中searchMyData-1,打开工作簿,获取数据,将其粘贴到MyData-2中,然后closuresMyData-1。

Sub UpdateWorkbook() 'Identify workbook you would like to pull data from (same for all users) Dim TargetWorkbook As String TargetWorkbook = "MyData-1" 'Get the full path of that workbook by searching in a specified directory Dim TargetPathName As String TargetPathName = GetFilePath(TargetWorkbook) 'Retrieve data in range B8:C25, copy and paste, then close workbook Dim TargetRng As Range Application.ScreenUpdating = False Workbooks.Open Filename:=TargetPathName Set TargetRng = Sheets("Sheet1").Range("B8:C25") TargetRng.Copy Destination:=ThisWorkbook.Worksheets(1).Range("B8:C25") ActiveWorkbook.Close Application.ScreenUpdating = True End Sub Function GetFilePath(TargetWkbook As String) As String Dim FullFilePath As String Application.ScreenUpdating = False Application.DisplayAlerts = False Application.EnableEvents = False On Error Resume Next With Application.FileSearch .NewSearch .LookIn = "C:\" .FileType = msoFileTypeExcelWorkbooks .SearchSubFolders = True .Filename = TargetWkbook If .Execute > 0 Then FullFilePath = .FoundFiles(1) End If End With GetFilePath = FullFilePath Application.ScreenUpdating = True Application.DisplayAlerts = True Application.EnableEvents = True End Function 

作为解释:

  1. 在sub中,您首先需要指定工作簿MyData-1的名称
  2. 函数GetFilePath将获得workbbok的完整path名。 请注意,我已经设置它在“C:\”驱动器,你可能想要修改
  3. 一旦我们有完整的文件path,我们可以轻松打开工作簿并复制所需的范围。

请注意,closures屏幕更新以创build工作簿在复制数据时尚未打开的“错觉”。 另外,我在MyData-2的工作表上添加了一个button来触发代码,即用户打开工作簿,按下button,数据被导入。

最后,这个代码可以大大增加,你可能想要调整它。 例如,错误检查如果找不到文件,search多个目录(例如C:\,D:)…

希望这可以让你开始正确的轨道

您应该只使用复制/粘贴专用的值:

 Private Sub ImportData_Click() On Error GoTo OpenTheSheet Workbooks("MyData-1.xls").Activate GoTo SheetOpen OpenTheSheet: Workbooks.Open "MyData-1.xls" Workbooks("MyData-1.xls").Activate SheetOpen: On Error GoTo 0 Workbooks("MyData-1.xls").Worksheets("sheetwhatever").firstRange.Copy Workbooks("MyData-2.xls").Worksheets("anothersheet").yourRange.PasteSpecial(xlPasteValues) End Sub 

这可能会被清理一些,但是在VBA中做文件总是很麻烦,我可能会把开放代码放在一个函数中。 确保他们将新文件放在与旧文件相同的目录中。