将基于标题的外部工作簿中的数据复制到另一个工作簿

时间:2016-04-30 22:02:28

标签: vba excel-vba excel

我希望这是一个提出这个问题的合适地方,因为我正处于疯狂的边缘。我很生疏,我对VBA没有经验(只有C ++,java)

问题: 我试图将数据从一个工作簿复制到另一个工作簿。

假设我有一个工作簿(称为DATA),其中包含几个填充数据的工作表。每列数据都有一个唯一的标题(同一行上的所有标题)。

另一方面,我有另一个工作簿(称为REPORT),其中一个工作表只包含数据的标题(在一行中)。它们的顺序与DATA工作簿中的顺序不同。例如,我在REPORT工作表中有3个标题,可以在DATA工作簿的不同工作表中找到。

我需要遍历DATA工作簿中的所有工作表,并在找到相同的标题时将整个列复制粘贴到REPORT工作表。

此图片可能有助于理解。 Explanation

提前感谢您的帮助。我已经搜索了很多这个代码,但发现了类似的东西,但没有设法理解任何。

首次尝试这样做,但收到运行时错误“1004”的错误。 有什么帮助吗?

Dim MyFile As String
Dim ws As Worksheet

''Workbook that contains one worksheet with all the headings ONLY NO DATA
Dim TargetWS As Worksheet
Set TargetWS = ActiveSheet
Dim TargetHeader As Range

''Location of Headers I want to search for in source file
Set TargetHeader = TargetWS.Range("A1:G")

''Source workbook that contains multiple sheets with data and headings _
not in same order as target file
Dim SourceWB As Workbook
Set SourceWB = Workbooks("Source.xlsx")
Dim SourceHeaderRow As Integer: SourceHeaderRow = 1
Dim SourceCell As Range

''Stores the col of the found value and the last row of data in that col
Dim RealLastRow As Long
Dim SourceCol As Integer

''Looping through all worksheets in source file, looking for the heading I want _
then copying that whole column to the target file I have
For Each ws In SourceWB.Sheets
    ws.Activate
    For Each Cell In TargetHeader
     If Cell.Value <> "" Then
            Set SourceCell = Rows(SourceHeaderRow).Find _
                (Cell.Value, LookIn:=xlValues, LookAt:=xlWhole)
         If Not SourceCell Is Nothing Then
                SourceCol = SourceCell.Column
                RealLastRow = Columns(SourceCol).Find("*", LookIn:=xlValues, _
                SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
                If RealLastRow > SourceHeaderRow Then
                 Range(Cells(SourceHeaderRow + 1, SourceCol), Cells(RealLastRow, _
                    SourceCol)).Copy
                 TargetWS.Cells(2, Cell.Column).PasteSpecial xlPasteValues
                 End If
         End If
      End If
    Next
Next

1 个答案:

答案 0 :(得分:0)

您的问题没有说明您实际上遇到的问题的哪个部分,所以我假设您不知道如何开始。请注意,此处的任何人都无法为您提供问题的完整解决方案 - 您可以自行决定。

让您开始工作的一些提示:

  1. 关于涉及多个工作簿的问题,你要问自己的第一个问题通常是 我将把我的宏附加到哪个工作簿上?

  2. 在您的情况下, REPORT 工作簿看起来像一个更健全的选项,因为您可能希望有人点击报表中的某些内容以生成它。你也可以反过来争论。

    1. 一旦选择了放置VBA的位置,就必须建立对其他工作簿的引用。
    2. 您必须使用Workbooks.Open从磁盘加载其他Excel文件,或者在Excel实例中同时打开两个工作簿,我建议您这样做,因为它更容易。在这种情况下,只需使用Workbooks对象建立引用。

      Dim exampleRefToDATA As Workbook: Set exampleRefToDATA = Workbooks("data.xlsx") ' or index

      1. 然后,循环浏览每个工作表
      2. 使用For Each ws As WorkSheet In exampleRefToDATA.WorkSheets之类的东西作为For Loop

        1. 在该循环中,使用类似
        2. 的内容遍历第一列

          For Each allName As Range In ws.Range(... for you to figure out ...)

          1. 在这个循环中,您必须通过执行另一个循环来查看该名称是否在您的REPORTS表格中
          2. For Each thisName As Range in Range(... seriously, there's enough on stackoverflow on how to properly iterate over the used range of a row ...)

            请注意此Range()来电与ActiveWorkbook.ActiveWorkSheet.Range相同,这是您的报告表。

            1. 然后检查是否相等并在必要时复制该行。同样,之前也已经介绍了复制行。
            2. 希望这对你有所帮助。