• 締切済み

エクセル マクロ 複数のシート間で、セルの組み合わせがマッチしない行を、別シートへ移動する方法教えてください!!

Sheet1には今月の、Sheet2には先月の顧客NO.、会社名、商品名、金額データがあります。Sheet1にはエリア情報がありますが、Sheet2にはありません。 これらエリア情報を除く4つのセルの内容、全てマッチしている行はそのままで、1つでも違う組み合わせのあるものがあれば、Sheet3ヘ移動したいのですが。。 つまり今月新しく上がってきたもののみを行ごと、別のシートに移動できればと思います。 下記のイメージです。 <Sheet1> 今月分 No. 会社    商品    金額   エリア 123 ABC商事  ペン    ¥500   新宿区    456 DEFコープ ノート   ¥200   渋谷区 789 GHI     DVD    ¥30000  中野区 113 UFP     CD ¥25000  港区 <Sheet2> 先月分 No. 会社    商品    金額 155 XXX    クリップ  ¥4000 456 DEFコープ ノート   ¥200 113 UFP     CD     ¥25000 <Sheet3> 今月NEW分 123 ABC商事  ペン    ¥500   新宿区 789 GHI     DVD    ¥30000  中野区 どなたか分かる方いらっしゃいますか? 教えてください!!

みんなの回答

回答No.4

簡単なコードにも拘わらずなかなか回答が付かないようなので、一案。 Sheet1(今月分)1行目:見出し、 2行目~:データ Sheet2(前月分)1行目:見出し、 2行目~:データ Sheet3(抽出分)1行目:見出し、 2行目~:抽出データ '------------------------------------------------------ Sub Test()   Dim R As Long   Dim LastRow As Long   Dim myCell As Range      With Sheets("Sheet3")     .Select     .Cells.Clear   End With         With Sheets("Sheet2")     For R = 2 To .Range("A65536").End(xlUp).Row       .Cells(R, "G") = .Cells(R, "A") & .Cells(R, "B") & .Cells(R, "C") & .Cells(R, "D")     Next R   End With   With Sheets("Sheet1")     For R = 2 To .Range("A65536").End(xlUp).Row       .Cells(R, "G") = .Cells(R, "A") & .Cells(R, "B") & .Cells(R, "C") & .Cells(R, "D")     Next R          For R = 2 To .Range("A65536").End(xlUp).Row       Set myCell = Sheets("Sheet2").Columns("G").Find(.Cells(R, "G"), , xlValues, xlWhole)       If myCell Is Nothing Then         LastRow = Sheets("Sheet3").Range("A65536").End(xlUp).Row + 1         .Rows(R).Copy Sheets("Sheet3").Cells(LastRow, "A")       End If     Next R              .Rows(1).Copy Sheets("Sheet3").Cells(1, "A")   End With         Sheets("Sheet3").Columns("G").Delete xlShiftToLeft   Sheets("Sheet2").Columns("G").Delete xlShiftToLeft   Sheets("Sheet1").Columns("G").Delete xlShiftToLeft End Sub '-------------------------------------------------------------------------------- コードを見てもらえれば分かると思いますが、 Sheet1,2 の”No.と会社と商品と金額”を結合したものを使用してない列(今回は、G列)にセットしそれを検索に使ってます。 また、Sheet3の見出しは、Sheet1の見出しをコピーしてます。 それから、も少し短いコードで、かつ作業列を使わない方法もありますが、それだとデータ件数が多いと遅くなるので速い方法にしました。 質問では「移動」となってますが、一応、「コピー」にしてあります。 以上です。  

cygnet
質問者

お礼

kobouzu_suさん ありがとうございした。 .Rows(R).Copy Sheets("Sheet3").Cells(LastRow, "A")を .Rows(R).Copy Sheets("Sheet3").Cells(R, "A") に変更して成功しました!

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.3

失礼しました。 複数テーブルの単純なクエリならSELECTできましたが 結合や Exsits は EXCEL ではできないようです。 Access にデータをインポートしてでの上記クエリを使用しての 操作はできます。 抽出後、Excel にエクスポートすれば簡単です。 もしくは上記参考HPの方法で行うには Data1 側のみ Select でレコードセット 作成し、 data2 はEXCELで開きワークシートの操作で1件ずつ データを検索してみれば可能かと思います。 やはりAccess上で行った操作が一番簡単です。

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.2

NO1.です。 クエリに誤りがありました。 以下のクエリと置き換えてください。 ___________________________________________________ SELECT * FROM DATA1 where NOT EXISTS ( Select * from DATA2 where (DATA1.[No] = DATA2.[No]) AND (DATA1.会社 = DATA2.会社) AND (DATA1.商品 = DATA2.商品) AND (DATA1.金額 = DATA2.金額) ) _______________________________________________________________ 以上

cygnet
質問者

お礼

ありがとうございます。 頂いたサイトとNOBNNNさんからのクエリを元に修正したのですが、 SELECT のところで、コンパイルエラーが出てしまいます。 objRecordset.Open SELECT * FROM DATA1 where NOT EXISTS ( Select * from DATA2 where (DATA1.[No] = DATA2.[No]) AND (DATA1.会社 = DATA2.会社) AND (DATA1.商品 = DATA2.商品) AND (DATA1.金額 = DATA2.金額) ) objConnection, adOpenStatic, adLockOptimistic, adCmdText どこがいけないのでしょうか?

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.1

ACCESS 2003 なら簡単にできます。 クエリで 二つのテーブルを比較すればよいわです。 ______________________________________________________________ ◆ Sheet1もしくはSheet2 にしか存在しないデータを抽出 Select No,会社,商品,金額 FROM Sheet1_TBL INNER Join Sheet2_TBL On key NOT ( Sheet1_TBL.No = Sheet2_TBL.No and Sheet1_TBL.会社 = Sheet2_TBL.会社 and Sheet1_TBL.商品 = Sheet2_TBL.商品 and Sheet1_TBL.金額 = Sheet2_TBL.金額) ____________________________________________________________ このクエリを EXCEL でAccess と同じように Excelシートを テーブルに見立てて ADO で抽出できます。 参考HP  → ADO を使用して Excel ワークシートにクエリを実行する http://www.microsoft.com/japan/technet/scriptcenter/resources/officetips/jun05/tips0607.mspx を参考にプログラムを作成してみてください

関連するQ&A

  • Excelでのリンク機能関数

    シート1が以下のようにあったとします。 A B 1 No.1 abc 2 No.2 def 3 No.3 ghi 4 No.4 jkl シート2で、A1に「No.1」と記入するとB1に「abc」と表示したいのです。 A B 1 No.1 abc 2 No.2 def 3 No.3 ghi 4 No.4 jkl ↑ ↑ 手動 自動表示 このように出来る関数はありますか? また、使い方のサンプルなどもあればありがたいです。 よろしくお願いします。

  • エクセルで一つのセルに数式を二つ以上入力する方法はありますか?

    エクセルで一つのセルに数式を二つ以上入力する方法はありますか? 昨晩から プルダウンメニューで ある文字列を選び、その文字列により、違った計算をさせて、その答えをセルに表示させようとしていますが、全く上手くいきません・・・。 Sheet1の任意のセルに ABC, DEF, GHI, JKL と言う文字列を作り、プルダウンメニューで選べる様にしました。 そして、選んだ文字列により、下記の通り 切捨ての簡単な計算をさせて、その答えを Sheet2 の任意のセルに表示させたいと思ってます。 Sheet2の任意のセルにこの様な数式を教えて頂きまして入力しましたが、上手く行きませんでした。 =IF(F3="ABC", ROUNDDOWN(H3,2)*0.976),"DEF",ROUNDDOWN(H3,2)*0.976),"GHI", ROUNDDOWN(H3,2)*0.975), "JKL", ROUNDDOWN(H3,2)*0.978) 何かと試行錯誤してますが、全く分りません・・・(>_<)。 どなたか助けて下さい(/_;)

  • エクセルのシート1にある文字や数値をシート2の指定した場所へ飛ばす事が

    エクセルのシート1にある文字や数値をシート2の指定した場所へ飛ばす事が出来ますでしょうか? 出来るようであれば、ぜひご教授ください。 シート1のA列にNo.、B列に東京23区名、C列に数値A、D列に数値B、E列に数値C、F列に計、最後の行に合計のリストがあります。 例えば、シート1のリストの文京に数値Aが11、数値Bが12、数値Cが13。新宿に数値Aが14、数値Cが15。杉並に数値Bが16。練馬に数値Bが17、数値Cが18と入力された時、シート2の指定の場所、ABC1にNo.の2、ABC2に文京、A3に数値Aの11、B3に数値Bの12、C3に数値Cの13、ABC4に合計の36。DEF1にNo.の4、DEF2に新宿、D3に数値Aの14、F3に数値Cの15、DEF4に合計の29。ABC6にNo.の5、ABC7に杉並、B8に数値Bの16、ABC9に合計の16。DEF6にNo.の7、DEF7に練馬、E8に数値Bの17、F8に数値Cの18、DEF9に合計の35。 このような、文字と数値をシート2へ出力する事が出来ますでしょうか? ようするに、シート1のリストに数値を入れたら、シート2へ自動的にNo.・文字・数値などが表示される。 説明が下手ですみません。 文字での説明は難しいですね。少しでもわかりやすく表にしてみました。 シート1    A   B      C      D      E      F 1  No.  区名   数値A   数値B   数値C    計 2  1   千代田    3  2   文京    11     12      13     36 4  3   中野 5  4   新宿    14             15     29 5  5   杉並          16             16 6  6   世田谷 8  7   練馬          17      18      35 9  8   台東 10  9   荒川 11  合  計     25     45      46     116 シート2    A    B     C     D     E     F 1       2                 4 2       文京              新宿 3  11    12    13     14          15 4       36                29 5 6       5                 7 7       杉並              練馬 8       16                17     18 9       16                35 10 今月はこのようになったり、来月は他の区になったりします。 おわかりになりますでしょうか? 出来ましたら、具体的にわかりやすくご教授をお願い致します。 それでは、宜しくお願い致します。

  • エクセルの表を別のシートに縦に数行おきに書き移したい

    エクセルのSheet1  A商品名 B種別 C金額 D 説明 ・・・・ とまとめてあるデータを、別のシートの表に縦に数行おきに転記したいのです。たとえば sheet2の D3は空欄 D4にsheet1のA2 D5にsheet1のB2 D6にsheet1のC2 D7にsheet1のD2 D8にsheet1のE2 D9は空欄 そして、7行おきに違う商品のデータになり、繰り返します。 (A3~D9までを太いカラー罫線で囲んだフォーマットが商品個数分、空欄で既にsheet2に書き込まれています) 関数で効率よく、データを書き写すことが出来ますでしょうか? よろしくお願いいたします。

  • エクセルで複数シートを一覧表にするには?

    教えてください。エクセルで複数シートを自動で別のシートに転記したいのですが、 やり方がわかりません。 各シートの空白部分を除いてデーターがある分だけを取り出して、金額に数式を入れて 合計金額を追加したいのですが・・・・・。 下記のような感じでできますか? 宜しくお願いいたします。    Sheet1     商品名  単価  数量        ****   000  000        ****    00   00   Sheet2     商品名  単価  数量        ****   000  000        ****    00   00   Sheet3     商品名  単価  数量        ****   000  000        ****    00   00 をSheet4に   シート名 商品名  単価  数量  金額   Sheet1  ****   000  000  0000(単価×数量)          ****    00   00  0000(単価×数量)                    合計金額  000   Sheet2 商品名  単価  数量  金額         ****   000  000  0000(単価×数量)         ****    00   00  0000(単価×数量)                   合計金額  000    Sheet3 商品名  単価  数量  金額         ****   000  000  0000(単価×数量)         ****    00   00  0000(単価×数量)                   合計金額  000

  • EXCELのグラフ作成と関数について

    エクセルで最終的にグラフ作成をしたいのですが、うまく出来ません。 簡単に操作できる方法教えてください。 ※なるべく少ない関数の使用で。 エクセルの表は以下の通りです。 コード 企業名 金額 02 ABC 500円 01 DEF 900円 02 ABC 300円 03 GHI 400円 01 DEF 600円 ・ ・ ・ と続きます。 ・全体の売り上げの「ABC」「DEF」「GHI」はどれだけの 割合を占めているか ・円グラフで表したい 以上、よろしくお願い致します。

  • VLOOKUPで検索したデータを元にVLOOKUP

    集計シートにてVLOOKUPでソースシートAから検索したデータ"ABC"(URL文字列)が存在します。 このデータABCを、ソースシートBから検索して、データ"yahoo!"を取り出したいと考えています。 ソースシートA ABC 100 DEF 200 GHI 300 集計シート ABC 100 (セルの実態はVLOOKUP関数) ソースシートB ABC yahoo! DEF google GHI 楽天 作りたいシート ABC yahoo! 100 これを実現するための関数をご教示頂きたく思っております。 情報不足でしたら可能な限り追加で説明させて頂きますのでどうかよろしくお願いします。 ※アクセス等でABCをキーに結合させてしまえば楽かもしれませんが、実作業する人間がアクセスに不慣れなためエクセルで実現したいです。

  • エクセルのシート間で複数条件にて照合させたい。

    1.【Sheet1のデータ例】※補助元帳データ(Excel) ---------------------------------------------------------------------------------- A B C D E F G H ・・・・ 1| No. 日付 区分A 区分B 取引先 借方 貸方 2| 78 2/1 A 1010 A商事 5,000 3| 12 2/1 B 1020 B商事 2,000 4| 50 2/1 A 1050 C(カ) 1,050 5| 44 2/2 A 1100 (カ)D 8,400 6| 94 2/3 C 1700 (ユ)Q 5,500 7| 51 2/4 B 1010 P興業 4,200 ・| ・ ・ ・ ・ ・ ・ ・ ・| ・ ・ ・ ・ ・ ・ ・ ・| ・ ・ ・ ・ ・ ・ ・ ---------------------------------------------------------------------------------- 2.【Sheet2のデータ例】※入金データ(Excel) ---------------------------------------------------------------------------------- A B C D E F G H ・・・・ 1| 日付 区分 借方 貸方 摘要 2| 2/1 CC 1,050 3| 2/1 2,000 4| 2/1 5,000 5| 2/2 CC 8,400 6| 2/3 5,500 7| 2/4 CC 4,200 ・| ・ ・ ・ ・ ・ ・ ・ ・| ・ ・ ・ ・ ・ ・ ・ ・| ・ ・ ・ ・ ・ ・ ・ ---------------------------------------------------------------------------------- 上記のようなエクセル シートがあります 1.[sheet1]と[sheet2]の日付と金額を照合させて2つの条件が一致するデータを探す 2.一致するデータの行を[sheet1]と[sheet2]ともに塗りつぶしをする(薄い黄色) 3.日付と金額が一致している行が複数あるなら対象データ(行)を薄いピンクに塗りつぶす 4.一致しないデータを[sheet3]に日付と金額のみ貼り付ける 上記のようなことをしたいのですが 関数では限界があり悩んでいます。 VBAを試してみたいのですが知恵を拝借できないでしょうか。 よろしくお願い致します。

  • エクセル-数式-別シートリンク

    お世話になっております。 エクセル数式について質問です。 品名 個数 金額 入荷日 出荷日 備考 のり 52  500  10月8日      はり 250  30   9月4日 10月8日 pen 300   80   8月25日 10/21日 とあるとします。 別のシートに、入荷日10月分だけのリスト、 また別のシートに出荷日10月分だけのリストの金額の合計を リンクさせたいとおもいます。 その数式をぜひ教えていただければとても助かります。 よろしくお願い致します。

  • VBSのADODB.Streamで先頭に「追記」

    こんにちは、 VBSのADODB.Streamでファイルを操作しています。 単純なことですが、どうしたらよいか、わからないことがあります。 test.txt の中身は abc def ghi となっています。 これを 123 abc def ghi のように変更したいのです。 ファイルの内容をいったんすべて読み込んで、Position = 0にして、123を書き込んで、読み込んだ残りを書き込めばよいのですが、ファイルのサイズが大きくなるとかなり無駄のように思います。 もっとスマートに、先頭に書き込んで、「書き込んだ分だけ残りは後ろに押し出される」・・・みたいな命令はできないのでしょうか? できなければバッチファイルで処理しようかと思っています。