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

时间:2010-03-11 17:44:08

标签: excel vba excel-vba

我的问题如下: 我给多个人提供了一本工作簿。他们将此工作簿放在他们选择的文件夹中。所有人的工作簿名称都相同,但文件夹位置不同。 我们假设公共文件名是MyData-1.xls。 现在我已经更新了工作簿,并想把它交给这些人。然而,当他们收到新的(我们称之为MyData-2.xls)时,我希望从他们的文件(MyData-1)中提取他们数据的特定部分并自动放入提供的新数据(MyData-2)。 要复制/导入的列和单元格对于两个工作簿都是相同的。假设我想将单元格数据(仅限值)从MyData-1.xls,Sheet 1,单元格B8到C25 ......导入到MyData-2.xls工作簿中的相同位置。如何在代码中指定(可能附加到宏驱动的导入数据现在按钮)我希望将此数据带入此新工作簿。我通过打开两个工作簿并使用链接进程复制/粘贴特殊功能在我自己的位置尝试了它。它工作得很好,但它似乎在两个物理工作簿之间创建了一个硬链接。我更改了源工作簿的名称,它仍然有效。这让我相信两者之间存在“硬链接”,这使我无法将目标(MyData-2.xls)工作簿交给其他人并让它找到他们的源工作簿。

2 个答案:

答案 0 :(得分:2)

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

这样做有各种各样的选择,下面我提供了一种方法。简而言之,用户将打开MyData-2,单击一个按钮,代码将在其目录中搜索MyData-1,打开工作簿,获取数据,将其粘贴到MyData-2中,然后关闭MyData-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. 在子文档中,您首先需要指定工作簿MyData-1
  2. 的名称
  3. 然后,函数GetFilePath将获取workbbok的完整路径名。请注意,我已将其设置为查看“C:\”驱动器,您可能需要修改
  4. 一旦我们拥有完整的文件路径,我们就可以轻松打开工作簿并复制所需的范围。
  5. 请注意,屏幕更新已关闭,以创建复制数据时尚未打开工作簿的“幻觉”。另外,我在MyData-2的工作表上添加了一个按钮来触发代码,即用户打开工作簿,按下按钮,然后导入数据。

    最后,此代码可能会显着增强,您可能需要调整它。例如,错误检查是否找不到文件,在多个目录中搜索(例如C:\,D :) ...

    希望这能让你开始走上正确的道路

答案 1 :(得分:1)

您应该仅对值使用copy / paste-special:

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中执行文件时总是很麻烦,我可能会把开放代码放在一个函数中。 确保他们将新文件放在与旧文件相同的目录中。