• ベストアンサー

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

題名記載の詳細を以下に記します (状態)  シート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