2016-12-23 18 views
-1

VBAマクロを2つのExcelファイルで一意の識別子の一致を探すようにExcelで作成する方法についてのガイダンスを探しています一致する行データを抽出する。より分かりやすく入れ一致のためにデータを抽出するVBAマクロを作成する

  1. は、私は、彼らそれぞれが固有の識別子のためにそれらに存在する列を持っている、二つの別々のExcelファイルを持っています。

  2. 私はVBAマクロが、一意の識別子が他のファイル内にあるものと同じファイルの1つで一致するものを見つけるようにします。

  3. Excelファイルで一度一致するものが見つかると、その特定の行のデータを抽出して一致するものを探したいと思います。

  4. 理想的には、抽出されたデータを新しいExcelワークシートに入れたいと思います。

+0

2つの別々のExcelファイルで、 'file#1'で行を探して' file#2'で一致するファイルを探していますか?一度一致するものが見つかると、 'file#1'でその行を取り出し、新しいExcelファイル' file#3 'に入れたいのですか? – zedfoxus

+0

私はいくつかの仮定をした後、あなた自身の問題を解決するためのアイデアを与えるかもしれない答えを書いた。ご質問がある場合は、数日で返信することができます。 – zedfoxus

答えて

1

これは、あなたがしたいことにあなたを導く例です。

  • はその意志のコードを作成します
  • モジュールの上にいくつかの定数を追加VBAでモジュールを作成し
  • 開発ツールを有効に

    • :手順Here'reあなたは約取るか考える必要がありますワークブックが開いているかどうかを確認します。
    • - それがない場合は、それを開く
    • - ワークブックが存在しない場合は、それを作成し、それが
    • 一つ以上の本
    • 作成したコードを開くために上記のコードを使用するコードを作成して開きますその意志ファイル1の行をループ、ファイル2にチェックし、どこで一致が見つかったが、この記事を使用してエクセルに

      を開発者向けツールを有効に3

    をファイルに書き込み:https://msdn.microsoft.com/en-us/library/bb608625.aspx

    最初のファイルを開きます。その後、次のトピックが

    この記事モジュール

    使用を作成し、ステップ3までそれに従う示してモジュールを作成する - モジュールを作成:https://www.ablebits.com/office-addins-blog/2013/12/06/add-run-vba-macro-excel/

    は定数

    は、コードを書く作成しますファイル名とシート名の定数を宣言します。

    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 
    

    ファイルが存在しない場合には、以下のこのコードは、新しいファイルを作成し、ブックが開いているかどうかをチェックするコードを作成します。ファイルが開いていないことを報告します。私はちょうどVBA macro to copy data from one excel file to another答えでダンワグナーのコードを使用しています。コードの残りの部分は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冊、第2冊、データが貼り付けられる書籍)がすべて開かれます。最初のファイルは行単位で読み込まれます(第1ファイルと第2ファイルの共通フィールドとみなして第1セルのみが読み込まれます)。その後、ファイル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を作成しました。その中で私が持っている:私はコピーコードの任意の行をクリックするとF5押すと

    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 
    

    を持って、コピーコードサブルーチンが実行されます。これは、コードを通過し、その後結果ファイルには、次のようになります。ファイル1からのデータは3ファイルに行ってきましたが、ファイル2のUIDに一致した行だけがやったことを

    A B 
        ----- -------- 
    1 UID Name 
    2 1 John 
    3 3 Katie 
    

    注意。ファイル2はUID 2を持っていないので、ファイル1のMattの行は結果ファイルには移動しませんでした。

    うまくいけば、それがあなたの言いたいことがあります。

  • +0

    マクロを実行すると、エラーメッセージ "ランタイムエラー '9':範囲外のサブスクリプト"が表示され続けます。私がデバッグすると、コード "First_Value = wkbFirst.Worksheets(wstFirst).Range(" AI "&First_File_Counter).Value"でこの行が参照されます。一意識別子データが「A」ではなく「AI」列にあり、私のデバッグに役立つ提案があるので、元のコードを変更しましたか?ありがとう! – Mobuckts

    +0

    気にしないで、それを持っています!助けてくれてありがとう! – Mobuckts

    関連する問題