• ベストアンサー

他シートのセルを比較する方法

題名記載の詳細を以下に記します (状態)  シート1   →比較対象  シート2   →セルに記載した内容はシート1と比較して列行がバラバラ (困っている点)  上記状態の2つのシートを、マクロで比較させて、条件が不一致のセルの色(何色でも)を変化させようと考えています ただ、どうもうまくいかず有識者の知識をお借りしたいと思い投稿しました 直接コードを記述頂ければ助かりますが、類似のサイトがあれば自主的に学習しますので、アドバイスを頂ければ幸いです 因みに、私のVBA知識はほぼ初心者です

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! >条件が不一致のセルの色(何色でも)を変化させようと・・・ とありますが、 具体的な条件提示がないので、仮にSheet1のデータでSheet2にない場合 そのデータセルの色を変える!という解釈でのコードの一例です。 標準モジュールにコピー&ペーストしてマクロを実行してみてください。 Sub test() Dim c As Range, i As Long, j As Long Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = Worksheets("Sheet1") '←「Sheet1」は実際のシート名に! Set ws2 = Worksheets("Sheet2") '←「Sheet2」も・・・ i = ws2.UsedRange.Rows.Count j = ws2.UsedRange.Columns.Count ws1.Cells.Interior.ColorIndex = xlNone For Each c In ws1.UsedRange If c <> "" And WorksheetFunction.CountIf(Range(ws2.Cells(1, 1), ws2.Cells(i, j)), c) = 0 Then c.Interior.ColorIndex = 6 '←黄色にしています。 End If Next c End Sub ※ Sheet2のA1セルが空白の場合はダミーとして何かA1セルに入力しておいてください。 (Sheet2の最終行・最終列の取得ができないため) ※ 一発で解決!という訳にはいかないと思います。 あくまで叩き台としての投稿です。m(_ _)m

nicknick1225
質問者

お礼

ありがとうございます 今回のケースはこのマクロで補完出来そうです ただ、1点ご教授願いたいのですがですが… 1 For each文を調べたのですがイマイチ理解出来ず、具体的な動作のイメージ(どのように比較対象を検索させているのか)を教えていただけませんか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

続けてお邪魔します。 >cに関してはアクティブシートのRANGEを宣言と言うよりも、WS1をForeach文で範囲を指定させてい>るという認識でよろしいでしょうか に関してですが、 質問文では範囲が明確でないので、あのようなコードにしましたが、 範囲がはっきりわかっているのであれば For Each c In Selection ←範囲指定している範囲内のそれぞれの「c」という意味 処理 Next c と一緒のコトになります。 ※ 変数「c」を何型で宣言するか? についてですが、 ↓のURLの中間よりやや下の部分 「固有オブジェクト型を指定するメリット」 のところが参考にならないでしょうか? http://officetanaka.net/excel/vba/error/compilation_error/error_18.htm この程度でごめんなさいね。m(_ _)m

nicknick1225
質問者

お礼

構文一例の提供及び、細かな説明、ありがとうございます 非常にわかりやすく、理解出来ました

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

No.1です。 >For~Each に関してですが・・・ 前回のコード内で i・j はSheet2の最終行・最終列を取得しています。 COUNTIF関数の「範囲」を指定するためです。 次にCOUNTIF関数の「検索条件」が アクティブSheetの「c」になります。 この「c」をFor~Next で順番にループしています。 仮に↓の画像がSheet1だとすると For Each c In ws1.UsedRange ・・・ ・・・ Next c これで太線内(A2:F4)が「Usedrange」となります。 これをA2から右(列方向)に順番にループすることになります。 前回のコードで >If c <> "" And WorksheetFunction.CountIf(Range(ws2.Cells(1, 1), ws2.Cells(i, j)), c) = 0 Then に該当するデータは 1~10 です。 ※ 見た目は空白でも、数式等が入っていれば「Usedrange」となりますので、 範囲はもっと広がる可能性があります。 この程度で参考になりますかね?m(_ _)m

nicknick1225
質問者

お礼

細部迄ご説明ありがとうございます 最後にもう一点質問させてください cに関してはアクティブシートのRANGEを宣言と言うよりも、WS1をForeach文で範囲を指定させているという認識でよろしいでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excelマクロでセルの比較

    Excelマクロでセルの比較 まだマクロ初心者なので、詳しいことがわからなくて困っております。 例)●前提として何行目まであるかは変化します     (A列)(B列) (1行目) 35  35 (2行目) 26  26 (3行目) 13  13 (n行目) 12  12 ※n=最終行 【やりたいこと】 このようにシートに入力されていたとして、 「A1=B1?」⇒「A2=B2?」⇒「A3=B3?」⇒「An=Bn?」と比較を進めていき不一致の有無を出す。 もし不一致がなければ、そのまま通過しその次のマクロを実行していく。 不一致があった場合には、不一致の行を別ファイルに出力してファイル保存し、ファイルを閉じる。 マクロを実行している元のファイルは、保存せずにファイルを閉じる) 行の長さが変化するため、その変化にも対応した処理を実行したいと思っております。 本やサイトで調べてみたのですが、基礎知識がないためうまく処理をさせるマクロを作ることが出来ませんでした。 このようなマクロが可能なのかもわかりませんが、出来ましたらこのマクロを教えていただけますでしょうか。 宜しくお願いいたします。

  • 二つのシートのセルを比較して、あるセルの値が一致した場合に、片方のセル

    二つのシートのセルを比較して、あるセルの値が一致した場合に、片方のセルの値を 別のシートに設定するには、どうしたらいいでしょうか? [シート1] --|A---B---C---D---E --+---+---+---+---+--- 01|A1 ??? 02|A2 yyy 03|B1 ??? 04|C1 sss [シート2] --|A---B---C---D---E --+---+---+---+---+--- 01|A1 aaa 02|A3 bbb 03|B0 xxx 04|B1 ccc 05|C1 sss シート1 [Aのセル]とシート2の[Aのセル] を比較し、同じ値だった場合に、 シート2の [B] の値を シート1の[C]に設定するための関数はどのようにしたら良いでしょうか? 最終的に、シート1が --|A---B---C---D---E --+---+---+---+---+--- 01|A1 ??? aaa 02|A2 yyy 03|B1 ??? ccc 04|C1 sss sss となります。 Excelの関数あマクロは、どうしても分からなく質問させてもらいました。 申し訳ありませんが、ご教授宜しくお願い致します。

  • 別シート同士のセルを比較して一致したらセルに代入をしたいと考えています

    別シート同士のセルを比較して一致したらセルに代入をしたいと考えています。 excelのVBAを使って行いたいのです book1のsheet1に A列     B列    C列       D列 2000     NEC   VL100 5000     Sony   vaio-200 3000     東芝     letsnote 単価、メーカー、型番、空き列があり 200行くらいです。 book2のsheet1に 同じく、単価、メーカー、型番がありますが 単価がsheet1とは異なり、違うメーカー型番の情報が 4000行くらいあります A列     B列    C列 5225     XXXX   XXXX 2200     NEC   VL100 5200     Sony   vaio-200 2684     XXXX   XXXX 2566     XXXX   XXXX 6000     東芝     letsnote ・・・・・・ ・・・・・・ そこで book1のB,C列のメーカーと型番が一致するものを book2のsheet1のB,C列から探し 一致したら、book1のsheet1のD列に book2 sheet1のA列の値を入れのです。 参考になるスクリプトを教えて頂けると大変助かります、 よろしくお願い致します。

  • エクセル セルの比較

    セルの比較について教えてください。 A1~A10と、B1~B10に文字が入っています。 Aがりんごのときは、Bは果物、 Aがキャベツのときは、Bは野菜 となっていなければなりません AとBの同じ行のセルの内容が、この条件と一致しないものが、1行から10行までひとつでもあった場合に、C1に『一致していない箇所があります』と出るようにしたいです。 マクロは使わないでお願いします。

  • 全シート内の差分比較とそのセル色塗りつぶしマクロ

    Excelファイルデータの差分比較とそのセル塗りつぶしのマクロを作成したいのですが、今の自分には、下記のマクロでとどまっており、 マクロを実行するファイル内シートにデータをコピーしたり、 マクロ内でその都度、シート名の記載の変更、差分比較データ範囲の変更が必要になり、大変不便で困っております。 やりたい事は、マクロでユーザがExcelのファイルを選択出来て、 そのファイルの中の全シートのデータについて、差分比較とそのそのセルの塗りつぶしをして、塗りつぶしをファイルへ反映させて保存させることです。 どうか、お分かりの方がいらっしゃいましたら、ご教示をお願い出来ますと大変助かります。 各シート内のデータは、列、行共にほぼ同じフォーマットで値が入っています。 それらのシート内のデータで修正した箇所を見つける為、差分比較がしたいです。 例えば、シートが3つの場合は、 1つ目のシートは修正前のデータ、 2つ目のシート内は1つ目のシートの値を部分的に修正したものです。 3つ目のシート内のデータも、1つ目のデータの値を更に再修正したものです。 この3つのシート内のデータを差分比較したいです。 シートの数は、選択したファイルによって異なります。 Sub TEST1() Dim s1, s2 As Worksheet 'Worksheetsオブジェクト用 Set s1 = Worksheets("修正前S装置検索システム") '比較元シート名 Set s2 = Worksheets("修正後装置検索システム") '比較先シート名 Dim arr1 As Variant, arr2 As Variant arr1 = s1.Range("$A$2:$W$548").Value arr2 = s2.Range("$A$2:$W$548").Value For i = 1 To UBound(arr1, 1) For j = 1 To UBound(arr1, 2) If arr1(i, j) <> arr2(i, j) Then '塗りつぶし処理 s1.Cells(i + 1, j).Interior.Color = RGB(255, 0, 0) s2.Cells(i + 1, j).Interior.Color = RGB(102, 255, 51) End If Next Next End Sub

  • シートのコピー、セル全体のコピーで列幅が変わる

    VBAから新しいブックへのシートコピー、セル全体のコピーをすると 列幅が変化し、印刷プレビューで確認してもコピー元とは異なっています。 列幅をみるとコピー元が15、コピー先が11になっていますが、ピクセルは両方とも 90となっていました。 VBAを使わず手動で試したところ、コピー元と同じ列幅でシートコピー、セル全体のコピーが できました。 VBAでは、コピー元とコピー先の列幅を一致させることはできないのでしょうか? なお、バージョンはExcel2003で、使用したメソッドはマクロ記録したものです。

  • エクセル:シート1のセルA1が0でなければ任意のマクロを実行したい

    エクセルマクロ(VBA)初心者です。よろしくお願いします。 (1)エクセルのsheet1のセルA1の値が”0(ゼロ)”でなければ、そのシート上で任意のマクロを実行し、ゼロであれば実行せずにsheet2へとぶ (2)同じようにsheet2のセルA1がゼロでなければ実効し、ゼロでなければsheet3へとぶ・・・の繰り返し(sheet50まであります。) このようなマクロ(標準モジュール)の書き方を教えてください。 よろしくお願いいたします。

  • セルの比較

    初投稿させていただきます。宜しくお願い致します。 office系のソフトは初心者で何とかならないものかと悩んでます。 excelで特定のセルのデータと行全体を比較して、一致する文字列を含んだセルを返してほしいのです。 それを各セルごとに行い、まとめて別のシートに出力させることは可能でしょうか? たとえば   A    B    C 1 あい  い   う 2 いか  う   えい 3 うみ  え   お 4 えい  お   か 5 うさ  か   き があって Cの各セルとA行全体を比較して結果を別に出力  ・・・ D 1    A3,A5 2    A4 3 4 5 ない場合は空白でも×でもいいのですが こんな感じにできないでしょうか。 実際のデータはファイルが別になっていてファイルAのC行とファイルBのB行のセル(200個くらい)との比較といった感じです。 いろいろ調べては見たのですが、うまくいかず・・・ 欲張った内容かも知れません。 すみませんがどなたかいい方法を教えて頂けませんか。

  • 比較して一致したら指定セルに貼り付け処理

    【Sheet1】の日付A1セルと【Sheet2】の日付A行を比較。 ※ 【Sheet1】の比較元はA1だけでいい 一致しなければ【Sheet2】のA行を一つ下げ、比較し直し、一致するまで比較 一致したら【Sheet1】のA列以降を全てコピーし【Sheet2】の一致した日付の隣B列に以下の様に貼り付けする 【Sheet1】            【Sheet2】     A        B   C       A 1 2008/1/2 0:45  72  99   1 2008/1/2 0:00 2 2008/1/2 1:00  76  84   2 2008/1/2 0:15 3 2008/1/2 1:15  19  45   3 2008/1/2 0:30 4 2008/1/2 1:30  30  78   4 2008/1/2 0:45 5 2008/1/2 1:45  56  33   5 2008/1/2 1:00 ↓『結果』 【Sheet2】    A          B 1 2008/1/2 0:00 2 2008/1/2 0:15 3 2008/1/2 0:30 4 2008/1/2 0:45  2008/1/2 0:45 72 99 5 2008/1/2 1:00  2008/1/2 1:00 76 84 6 2008/1/2 1:15  2008/1/2 1:15 19 45 7 2008/1/2 1:30  2008/1/2 1:30 30 78 8 2008/1/2 1:45  2008/1/2 1:45 56 33 -------------------------------------------------------------------------- Dim i As Integer Dim Com As Integer Dim s As Integer SheetName = "Sheet1" SheetName2 = "Sheet2" Do For Com = 1 To 20 ' Sheet1のA1とSheet2のA行セルが一致するまで比較 If StrComp(Worksheets(SheetName).Cells(1, 1), Worksheets(SheetName2).Cells(Com, 1), vbTextCompare) Then ' 一致したらA列をコピー Rows("1:1").Select Selection.Copy Else ' 一致しなければSheet2のAセルを一つ下げる WorkSheets(SheetName2).Cells(Com, 1).Offset(1, 0).Select End If Next ' 一致するまで比較 Loop Until StrComp(Cells(1, 1), Cells(s, 10)) -------------------------------------------------------------------------- Loop Untilの箇所で記述がおかしいせいかアプリケーション定義、またはオブジェクトエラーになってしまいます。 一致した時、Sheet1のA1列の情報をSheet2の指定箇所に格納する記述の仕方がどうしてもわかりません。 何かいい記述はないでしょうか? 質問が長くなってしまいましたが、どうか教えていただきたく思います。 よろしくお願いします。

  • VBAでマクロを走らせた日時をSheet2のAセルに入力する

    VBAでマクロを走らせた日時をSheet2のAセルに入力する はじめまして。 現在、ファイルを整理するマクロを使っています。 そのマクロを使った履歴を残す意味で、 いつマクロを走らせたかすぐにわかるように、 Sheet2のAのセル(2行目から)に走らせた日時を示したいと思っています。 マクロでの処理が終わったら、 毎回Sheet2に日時が入力されるようにするには、 どんな命令文を追記したらよいのでしょうか。 マクロに関しては知識がなく、 インターネットで調べて、 Sheets("Sheet2").Cells(R, "A").Value = Now というのを追記してみたのですが、 Sheet2に入力はされるものの、 Aセルの行がとびとびに入力されたり、 整理したファイルの数だけ(複数)入力されてしまいます。 マクロを1回走らせたら1つの日時が入力されるようにしたいです。 Sub ()とEnd Subの間にFor RとNext Rがあり、 作業が繰り返されているようです。 転記ができないため、マクロを示すことができません。 さすがに、これだけの情報では難しいでしょうか。 わかるかたがいらっしゃいましたら、 よろしくおねがいします。