エクセルファイルをマッチングする方法

このQ&Aのポイント
  • 5月から新しい職場で支払処理をしているが、支払データと支出データをマッチングする方法を教えて欲しい。
  • 現在、支払の元になっている支払データと自分で入力した支出データを印字して読み合わせしているが、それをシステム化したい。
  • マッチングしたい箇所は支払金額、貸主名、支払先コードで、違っていた箇所はセルの色を変えて表示したい。
回答を見る
  • ベストアンサー

教えて下さい。2つエクセルファイルをマッチング(突合)する方法。

 5月から新しい職場で支払処理をしています。VBAの勉強を始めましたが分からない事だらけなのでお詳しい方に教えて頂ければと思います。 支払の元になっている支払データと、それを元に自分で支出システムに入力したデータを今は印字して読み合わせで確認しているのですが、それをシステム化したいと考えています。    マッチングしたい元のデータ(エクセル形式)にはA~AU列まであります。 支出システムに入力したものは後からエクセル形式で取り出せるのですがそちらの支出データはA~DP列まであります。    その中でマッチングを確認したい箇所は以下の3箇所です。 元データ M列の支払金額(数値) <=> 支出データ I列の支払額 元データ Q列の貸主名(文字列) <=> 支出データ S列の債権者 元データAR列の支払先(数値) <=> 支出データ F列の支払先コード    またマッチング後、違っていた箇所は支払先の数値が別のセルに表示されるか、違っていた箇所だけセルの色が変わって表示される様に分かりやすく確認できる様にしたいと考えています。  このような場合はどのような関数(VBA?)を使えばよいでしょうか?  VBAと関数の知識は多少持っているのですが、応用が利かず 行き詰ってしまい相談させて頂きました。  分かりにくい文章で申し訳ありませんが、どなたかご教授頂けると 本当に助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.4

#01です。#03にUPしたマクロに不適切な部分がありましたので差し替えます Sub Macro1() Const wbM As String = "元データ.xls" Const wsM As String = "支払いシート" Const wbS As String = "支出データ.xls" Const wsS As String = "支出シート" Dim idx As Long Dim psw As Integer Dim svAdrs As String Dim trg As Range  Application.ScreenUpdating = False  With Workbooks(wbS).Sheets(wsS)   For idx = 2 To .Range("F65536").End(xlUp).Row    psw = 0    Set trg = Workbooks(wbM).Sheets(wsM).Cells(1, "Q").EntireColumn _      .Find(.Cells(idx, "S").Value, LookIn:=xlValues)    If Not trg Is Nothing Then     svAdrs = trg.Address     psw = 1     Do      If .Cells(idx, "F") = Workbooks(wbM).Sheets(wsM).Cells(trg.Row, "AR") Then       psw = 2       If .Cells(idx, "I") = Workbooks(wbM).Sheets(wsM).Cells(trg.Row, "M") Then        psw = 3       End If      End If      Set trg = Workbooks(wbM).Sheets(wsM).Cells(1, "Q").EntireColumn _        .FindNext(trg)     Loop Until trg.Address = svAdrs    End If    Select Case psw     Case Is = 0      .Range(.Cells(idx, "A"), .Cells(idx, "DP")).Interior.ColorIndex = 3     Case Is = 1      .Range(.Cells(idx, "A"), .Cells(idx, "DP")).Interior.ColorIndex = 6     Case Is = 2      .Range(.Cells(idx, "A"), .Cells(idx, "DP")).Interior.ColorIndex = 8     Case Else      .Range(.Cells(idx, "A"), .Cells(idx, "DP")).Interior.ColorIndex = xlNone    End Select   Next idx  End With  Application.ScreenUpdating = True End Sub

comurice
質問者

お礼

しばらくお返事が出来ずに大変失礼いたしました。作って頂いたマクロですが、ちょっとうまく動作せずエラーが出てしまいました。 ですが、自分でも考えて出来るところまでやってみたいと思います。 本当にありがとうございました。

comurice
質問者

補足

自分で実際に色々とやってみたところ1つ追加したい部分がありまして、もしよかったら教えて下さい。 2行目から500行目くらいに(A列~DP列まで)データが入っているのですが、2行連続などで重複したデータが入っている部分があったら、それを確認できる様にしたいのですが何か良い関数などありますでしょうか? COUNTIF関数で試してみたのですが、一行丸ごと重複したデータを表示する事が出来ませんでした。度々の質問で申し訳ないです。

その他の回答 (3)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

>そのまま支出データの方で間違っている箇所を確認、変更したいと考えています 支出データのDQ列に同じようにSUMPRODUCT関数を入力すれば良いと思います。その値によって行の背景色を条件付き書式で設定することもできます。 =SUMPRODUCT(([支払いデータ.xls]支払いシート!$AR$2:$AR$1000=F2)*([支払いデータ.xls]支払いシート!$M$2:$M$1000=I2)*([支払いデータ.xls]支払いシート!$Q$2:$Q$1000=S2)) マクロならこのような感じになるかと思いますが、実際のデータを見ていないのでちゃんと動く自信はあまりありません。だめな場合はSUMPRODCT関数でチェックして下さい (自分なりに動作確認はしましたが、想定外のデータがあるのではないかと思います) マクロはALT+F11でVBE画面を開き、左上のVBA Projectで「支出シート」のシート名を右クリックし「挿入」→「標準モジュール」で表示される画面に貼り付けて下さい。 マクロの実行は両方のブックを開き、「支出シート」アクティブにした状態でALT+F8でマクロ一覧を開き、マクロ名を選択して「実行」ボタンです。 また2行目~4行目のブック名、シート名は実際の名前に修正が必要です Sub Macro1() Const wbM As String = "元データ.xls" Const wsM As String = "支払いシート" Const wbS As String = "支出データ.xls" Const wsS As String = "支出シート" Dim idx As Long Dim psw As Integer Dim svAdrs As String Dim trg As Range  Application.ScreenUpdating = False  With Workbooks(wbS).Sheets(wsS)   For idx = 2 To .Range("F65536").End(xlUp).Row    psw = 0    Set trg = Workbooks(wbM).Sheets(wsM).Cells(1, "Q").EntireColumn _      .Find(.Cells(idx, "S").Value, LookIn:=xlValues)    If Not trg Is Nothing Then     svAdrs = trg.Address     psw = 1     If .Cells(idx, "F") = Workbooks(wbM).Sheets(wsM).Cells(trg.Row, "AR") Then      psw = 2      If .Cells(idx, "I") = Workbooks(wbM).Sheets(wsM).Cells(trg.Row, "M") Then       psw = 3      End If     End If     Set trg = Workbooks(wbM).Sheets(wsM).Cells(1, "Q").EntireColumn _       .FindNext(trg)     Do Until trg.Address = svAdrs      If .Cells(idx, "F") = Workbooks(wbM).Sheets(wbM).Cells(trg.Row, "AR") Then       psw = 2       If .Cells(idx, "I") = Workbooks(wbM).Sheets(wbM).Cells(trg.Row, "M") Then        psw = 3       End If      End If     Loop    End If    Select Case psw     Case Is = 0      .Range(.Cells(idx, "A"), .Cells(idx, "DP")).Interior.ColorIndex = 3     Case Is = 1      .Range(.Cells(idx, "A"), .Cells(idx, "DP")).Interior.ColorIndex = 6     Case Is = 2      .Range(.Cells(idx, "A"), .Cells(idx, "DP")).Interior.ColorIndex = 8     Case Else      .Range(.Cells(idx, "A"), .Cells(idx, "DP")).Interior.ColorIndex = xlNone    End Select   Next idx  End With  Application.ScreenUpdating = True End Sub

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

#01です。補足ありがとうございました 元データのM,Q,ARと完全一致する支出データがあるかないかだけのチェックでよければSUMPRODUCT関数で可能です。まずその方法を説明します。 元データのAV2セルに =SUMPRODUCT(([支出データ.xls]支出シート!$I$2:$I$1000=M2)*([支出データ.xls]支出シート!$S$2:$S$1000=Q2)*([支出データ.xls]支出シート!$F$2:$F$1000=AR2)) と入力し下方向にコピーします。(BOOK名、シート名は修正してください。また両方のシートを開いておいて下さい) すると3項目が一致すると結果が正の数値となり、3項目ともに一致するデータがない場合は0になります。 結果が1なら合致する行は支出シートに1行のみ。2なら同じデータが2つ重複して存在することになります。 個人的にはこれだけでもかなり作業が楽になるとは思うのですが、もっときめ細かなチェックをお望みの場合は条件を再度補足お願いします。 例) 1)支出シートに貸し主が存在しない場合はQ列のセルの背景色を赤色にする 2)支出シートに貸し主は存在しているが、支払先コードがないときはAR列のセルの背景色を黄色にする 3)支出シートに貸し主、支出先コードが一致して支払額が合致しない場合はM列のセルの背景色を青色にする 4)支出シートに同じ貸し主、支払先コードのデータが複数存在するときはどうする、こうする… →VBAではこのパターンのCheckは処理的に面倒かも?

comurice
質問者

補足

早速の回答ありがとうございます。 感動しました。すばらしいですね。 自分ももっと勉強したくなりました。  甘えてしまって申し訳ないのですが、教えて頂いた数式を 少し変更して支出データのDQ列に結果を反映するようにいたしました。 =SUMPRODUCT(([元データ.xls]元データ!$M$2:$M$1000=I2)*([元データ.xls]元データ!$Q$2:$Q$1000=S2)*([元データ.xls]元データ!$AR$2:$AR$1000=F2)) 出来れば、そのまま支出データの方で間違っている箇所を確認、変更したいと考えています。 例に挙げて下さった 1)支出シートに貸し主が存在しない場合はQ列のセルの背景色を赤色にする 2)支出シートに貸し主は存在しているが、支払先コードがないときはAR列のセルの背景色を黄色にする 3)支出シートに貸し主、支出先コードが一致して支払額が合致しない場合はM列のセルの背景色を青色にする でかつ、その間違っている行を一行全部背景色を同じ色に変更することは可能でしょうか?条件付書式などでは全然ダメでした。 やっぱりVBAですかね?

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

補足要求です 目視で突合するなら不要かもしれませんが、VBAで機械的に突合するなら例えば伝票番号などユニークなマッチングキーが必要です。この場合マッチングキーは何ですか? 支払先コードがそうだというなら、同じ支払先コードが複数ある時は、どちらの行と突合するのかをどのように判断すればよいですか? また >元データ M列の支払金額(数値) <=> 支出データ I列の支払額 >元データ Q列の貸主名(文字列) <=> 支出データ S列の債権者 >元データAR列の支払先(数値) <=> 支出データ F列の支払先コード と、左右で表現が微妙に異なっていますが、これらは全く同じ値が入るのですか? 質問内容だけでは情報が欠けているように思います。

comurice
質問者

補足

ご回答ありがとうございます。 言葉足らずで申し訳ありませんでした。 まず、元データと支出データには表現が違っていますが それぞれ同じ値が入ります。 そして問題のマッチングキーですが、ご指摘の通り支払先コードが同じになってしまっている箇所が600件程のデータなのですが数箇所ありました。 しかし探したのですが他に個別の共通する番号が無く、元データと支出データでは順番が入れ替わってしまうので新しく番号を振り直す事も難しいです。 これでは機械的なマッチングは無理でしょうか? もし何か良い考えがございましたらお教え願います。 ご面倒をおかけしてすいません。

関連するQ&A

  • 近似値によるEXCELマッチング

    2つのシートがあり、両方ともA列に会社名があり、B列以降は異なった情報が入っています。 このA列の会社名をマッチングさせて、ひとつのシート上に、情報を並べたいのですが、この会社列のデータが、同じ会社(マッチングさせたい情報)でも ●一方はカタカナ半角、一方はカタカナ全角 だったり、 ●一方は“・”有、一方は無し だったり ●一方は“株式会社”あり、一方は無し、もしくは“(株)” といった具合でVLOOKUP関数によるマッチングはできないので、 近似値でのマッチングができる関数などがあれば、 ご教示頂ければと思います。 どうぞ宜しくお願い致します。

  • エクセル-抽出したデータや文字列を消さない方法

    他のファイルから例えばVLOOKUP関数で数値や文字列を抽出する場合、そのファイルが消えた場合抽出したデータや文字列も消えてしまいます。ファイルが消えてもデータや文字列を残すには別のセルにコピーして形式を選択して貼り付ければよいのですが、そうしなくても簡単に別のセルに数値や文字列として残す方法はないでしょうか。回答よろしくお願いいたします。

  • Excelで数値が文字列になっています

    Excel2010で「このセルにある数値がテキスト形式か、またはアポストロフィで始まっています」という警告が表示されたりして、計算が出来ません。 打ち直ししたり、「エラーチェックルール」で「文字列形式の数値、、またはアポストロフィで 始まる数値」のチェックを外したりして計算は出来るようになります。 「表示形式を変えてもセルの中の値は変化しません。数値データは数値のまま、文字列データは文字列のままです。」とは本当ですか? 本当ならば、数字の保存形式が文字列データかどうかを確かめる方法はありますか? なお、ISNUMBERという関数ではTRUEと出ます。

  • エクセルでセルの中身が漢字かどうか識別する方法は?

    セルの内容が、数値か、文字列か、空白かどうかは関数で出来るのですが、文字列の場合、それが漢字(ひらがな、かたかな含む)かそうではないのか識別できる関数またはVBAはないでしょうか?

  • エクセルについて

    どなたかご教示ください。 エクセルで、ある一つのセルに一定の文字列や数値が入力されたら、 それによって、違う列にある、ある一つのセルから横や盾方向に指定した数のセル数まで、一定の文字列や数値が入力される様に、なんて出来ますでしょうか? 小生、関数やVBAなるもの、よくわからないもので申し訳ありませんがよろしくお願いいたします。

  • Excel 2000 で近似値を取得する方法

    1行目がタイトル、2行目から数値のデータがA列~E列まで500行ほどあります。 D列は小数点第3位までの数値が並んでいます。 E列には0から始まって100まで偶数が並んでいます。 E列の数値に一番近い値をもつD列のデータをみて、A列とB列のデータを別シートに書き出したいのですが、 上手くいきません。 試して駄目だった方法は、 VLOOKUP関数:0.815と2.015の場合、2.015の値を取得したいのに0.815のデータになる。 EVEN関数:0.×××が沢山並ぶ場合2になるので比較ができない。 なにか関数で上手く組み合わせてできる方法は無いでしょうか? また、VBAでも可能であれば方法をご教示下さい。 お願いいたします。

  • EXCEL 語句中の文字とマッチングさせる式を教え

    EXCEL関数式について教えてください。 A列のセルに地区名”東京”と入れたら、C列セル中の営業所一覧の正式名称の中の語句とマッチングし、B列セルに(C列セルの語句の地区名”東京”でマッチング)”○○会社 東京営業所”と表示される式を教えて頂けないでしょうか? A列(入力) B列(自動表示させる)    C列(リスト)       マッチングワード(地区名) 東京     ○○会社 東京営業所   ○○会社 東京営業所       東京 埼玉     ▽△会社 埼玉営業所   ▽△会社 埼玉営業所       埼玉 *地区名はダブルません。

  • 表示されている文字列を取得するエクセル関数

    例えば、 A1セル「平成28年1月5日」(シリアル値で入力) A2セル「H28.1.5」(シリアル値で入力) A3セル「12345」(数値) と入っている場合に、 関数を使って、 B1セル「平成28年1月5日」(文字列) B2セル「H28.1.5」(文字列) B3セル「12345」(文字列) と表示させることはできるでしょうか? 形式を選択して貼り付け、とか、VBAでできるのはわかるのですが、 関数だけで(しかも、できれば汎用的な形の関数で) 実現できるのかが知りたいです。

  • 条件が多数のエクセルデータマッチング

    似たような質問探したのですが、不明のため質問します。 エクセルVBAで下記のマクロの作成したいのです。 ファイル1:aaa.XLS ・・・集計するデータ ファイル2:bbb.XLS ・・・マッチング判定のリスト 二つ用意します。 ファイル1にあるB列のデータ(文字)、ファイル2にA列にあるデータ(文字)が一致した場合、一致した行にあるファイル2のB列にある文字を一致したファイル1のS列に表示させるマクロの作成を考えてます。 ただそのファイル2のマッチング判定が100個あり、100個それぞれとのマッチングを考えてます。 つまりファイル2の001~100の通りのマッチングをするマクロ(プログラム)です。

  • エクセル関数について

    エクセルの関数について質問です。 例えば、 C1セルには、数値データが入っています。 A2~A10セルに日付データ。 B2~B10セルに数値データが入っている表があります。 B11セルの値に、(C1データ)-(A列の最新日付セルと同行のB列データ)を表示させたい場合、 どのような関数を作成すればよいですか。 宜しくお願いします。

専門家に質問してみよう