Excel 创建VBA宏以提取匹配数据

Excel 创建VBA宏以提取匹配数据,excel,data-extraction,Excel,Data Extraction,我正在寻找有关如何在Excel中构建VBA宏(我以前从未创建过)的指导,该宏将在两个单独的Excel文件中查找唯一标识符匹配,然后提取匹配的伴随行数据 更清楚地说: 我有两个单独的excel文件,每个文件中都有一列用于唯一标识符 我希望VBA宏在其中一个文件中查找匹配项,其中唯一标识符与另一个文件中的相同 在Excel文件中找到匹配项后,我想提取找到匹配项的特定行的数据 理想情况下,我希望将提取的数据放入新的excel工作表中 这是一个可以引导你做你想做的事情的例子。以下是您必须采取或考虑的步骤

我正在寻找有关如何在Excel中构建VBA宏(我以前从未创建过)的指导,该宏将在两个单独的Excel文件中查找唯一标识符匹配,然后提取匹配的伴随行数据

更清楚地说:

  • 我有两个单独的excel文件,每个文件中都有一列用于唯一标识符

  • 我希望VBA宏在其中一个文件中查找匹配项,其中唯一标识符与另一个文件中的相同

  • 在Excel文件中找到匹配项后,我想提取找到匹配项的特定行的数据

  • 理想情况下,我希望将提取的数据放入新的excel工作表中


  • 这是一个可以引导你做你想做的事情的例子。以下是您必须采取或考虑的步骤:

    • 启用开发人员工具
    • 在VBA中创建模块
    • 在模块顶部添加一些常量
    • 创建检查工作簿是否打开的代码
    • --如果不是,打开它
    • --如果工作簿不存在,请创建并打开它
    • 创建使用上述代码打开一本或多本书的代码
    • 创建代码,循环文件1中的行,签入文件2,在找到匹配项的地方写入文件3
    在Excel中启用开发人员工具

    使用本文:

    打开第一个文件。然后创建一个模块,如下一个主题所示

    创建模块

    使用本文并遵循它直到第3步-创建模块:

    创建常量

    编写下面的代码来声明文件名和工作表名的常量

    Const FIRST_FILE_NAME As String = "Book1.xlsx" ' This current file
    Const SECOND_FILE_NAME As String = "Book2.xlsx"
    Const RESULTANT_FILE_NAME As String = "Result.xlsx"
    
    Const wstFirst As String = "Sheet1" ' Sheet name of first file
    Const wstSecond As String = "Sheet1"
    Const wstResultant As String = "Sheet1"
    
    创建检查工作簿是否打开的代码

    将此代码写在常量声明代码下面

    ' Check if a workbook is open; if inexistant, create one
    Function Isworkbookopen(FileName As String)
    
        Dim ff As Long, ErrNo As Long
        Dim wkb As Workbook
        Dim nam As String
    
        wbname = FileName
    
        On Error Resume Next
        ff = FreeFile()
        Open FileName For Input Lock Read As #ff
        Close ff
    
        ErrNo = Err
    
        On Error GoTo 0
        Select Case ErrNo
            Case 0: Isworkbookopen = False
            Case 70: Isworkbookopen = True
            Case 53:
                Workbooks.Add
                ActiveWorkbook.SaveAs FileName:=RESULTANT_FILE_NAME
                Isworkbookopen = False
            Case Else: Error ErrNo
        End Select
    
    End Function
    
    如果文件不存在,请创建一个新文件并报告该文件未打开。我只是用丹·瓦格纳的密码来回答。代码的其余部分也是对Dan代码的修改

    创建打开书本的代码

    在剩下的代码下面写下这段代码。此代码将采用文件名和引用变量。若工作簿未打开,请打开它并将其分配给引用变量。您必须自己阅读
    ByRef

    ' Open a workbook and pass the reference back
    Private Sub OpenBook(FileName As String, ByRef wkb As Workbook)
        ret = Isworkbookopen(FileName)
        If ret = False Then
            Set wkb = Workbooks.Open(FileName)
        Else
            Set wkb = Workbooks(FileName)
        End If
    End Sub
    
    创建执行循环并在结果文件中插入数据的代码

    在当前代码的底部编写此代码。此代码将打开所有3本书(第一本书、第二本书和将粘贴数据的结果书)。第一个文件逐行读取(假设第一个单元格是第一个文件和第二个文件之间的公共字段,则只读取第一个单元格)。然后,文件1

    Sub copydata()
    
        Dim wkbFirst As Workbook
        Dim wkbSecond As Workbook
        Dim wkbResultant As Workbook
    
        ' open all 3 files
        OpenBook FIRST_FILE_NAME, wkbFirst
        OpenBook SECOND_FILE_NAME, wkbSecond
        OpenBook RESULTANT_FILE_NAME, wkbResultant
    
        Dim First_File_Counter As Integer, Second_File_Counter As Integer, Resultant_File_Counter As Integer
        Dim First_Value As String, Second_Value As String
        Resultant_File_Counter = 1
    
        ' loop from row 1 to a large number for file #1
        For First_File_Counter = 1 To 10000
    
            ' get value of A1, then A2 and so on during each loop
            ' if that cell does not have a value, assume that there're no more rows of data
            First_Value = wkbFirst.Worksheets(wstFirst).Range("A" & First_File_Counter).Value
            If IsNull(First_Value) Or Len(Trim(First_Value)) = 0 Then Exit For
    
            ' loop from row 1 to a large number for file #2
            ' and look up information obtained from file #1 in file #2
            For Second_File_Counter = 1 To 10000
                Second_Value = wkbSecond.Worksheets(wstSecond).Range("A" & Second_File_Counter).Value
                If IsNull(Second_Value) Or Len(Trim(Second_Value)) = 0 Then Exit For
    
                ' if first file's A1 matches any of the rows in this second file
                ' copy the row from first file into the resultant file
                If First_Value = Second_Value Then
                    wkbFirst.Worksheets(wstFirst).Rows(First_File_Counter).EntireRow.Copy
                    wkbResultant.Worksheets(wstResultant).Rows(Resultant_File_Counter).Select
                    wkbResultant.Worksheets(wstResultant).Paste
                    Resultant_File_Counter = Resultant_File_Counter + 1
                    Exit For
                End If
            Next
        Next
    
    End Sub
    
    示例

    我创建了Book1.xlsx。在这方面,我有:

        A    B
      ----- --------
    1  UID  Name
    2   1   John
    3   2   Matt
    4   3   Katie
    
    Book2.xlsx具有

        A    B
      ----- --------
    1  UID  Address
    2   1   100 2nd St, Chicago
    3   3   Lukas Tower, Houston
    
    当我单击任何一行copycode并按F5时,copycode子例程将运行。它将遍历代码,然后生成的文件将如下所示:

        A    B
      ----- --------
    1  UID  Name
    2   1   John
    3   3   Katie
    
    请注意,文件1中的数据进入文件3,但只有文件2中具有匹配UID的行进入。Matt在文件1中的行没有转到结果文件,因为文件2没有UID 2


    希望这会让你明白。

    在你的两个单独的excel文件中,你是否逐行查看
    文件1
    并在
    文件2
    中找到匹配项?一旦找到匹配项,您是否希望将
    文件1
    中的行放入新的excel
    文件3
    ?在做了一些假设后,我写了一个答案,可能会给您解决自己问题的想法。如果您有任何问题,我可能会在几天后与您联系。当我运行宏时,会不断收到错误消息“运行时错误'9':子脚本超出范围”。当我去调试时,它在代码“First_Value=wkbFirst.Worksheets(wstFirst).Range(“AI”&First_File_Counter).Value”中引用这一行。我修改了源代码,因为我的唯一标识符数据在“AI”列中,而不是在“A”列中,有什么建议可以帮助我调试吗?谢谢