[[20160509194850]] 『差分をポップアップ画面で一覧表示させる記述の仕』(ゆい) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『差分をポップアップ画面で一覧表示させる記述の仕方について』(ゆい)

VBA初心者です。どなたか下記の記述の仕方を教えていただけますでしょうか。

エクセルAのsheet1のA列にはあるが、エクセルBのsheet2のB列とC列の両方にない文字列をポップアップ画面で一覧表示させたいです。
また、両方過不足なくある場合は、「不一致はありません」とメッセージを表示したいです。

よろしくお願いします。

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 条件をもう少し明確にされたほうが、回答者とのやりとりが少なくすみ、早く解決に至ると思います。

 >>エクセルBのsheet2のB列とC列の両方にない文字列

 いずれかにあればいいのか、両方にないといけないのか?

 >>両方過不足なくある場合

 両方とは? Sheet2のB列およびC列? 
 また 過不足なくとは? 順番は異なっても全く同じということ?

(β) 2016/05/09(月) 20:14


ご指摘ありがとうございます。

 >>エクセルBのsheet2のB列とC列の両方にない文字列
 いずれかにあればいいのか、両方にないといけないのか?

⇒いずれかにあれば大丈夫です。

 >>両方過不足なくある場合
 両方とは? Sheet2のB列およびC列? 
 また 過不足なくとは? 順番は異なっても全く同じということ?

⇒エクセルAのsheet1のA列にある文字列全てが、

  エクセルBのsheet2のB列とC列のいずれかにあればという意味です。
 その列のどこかにあればいいので、順番は無視したいです。

わかりずらく申し訳ありませんが、お願いします。
(ゆい) 2016/05/09(月) 20:21


 21:17 おばかなところがありましたのでちょこっと変更。

 要件誤解しているかもしれませんが・・・

 マクロブックとは別に BookA.xlsx と BookB.xlsx があって BookA.xlsx の A列と BookB.xlsxのB列、C列を比較。
 実行時には BookA.xlsxもBookB.xlsxも開かれているという前提です。

 Sub Test()
    Dim rA As Range
    Dim rBB As Range
    Dim rBC As Range
    Dim dic As Object
    Dim c As Range

    Set dic = CreateObject("Scripting.Dictionary")

    With Workbooks("BookA.xlsx").Sheets("Sheet1")
        Set rA = .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
    End With

    With Workbooks("BookB.xlsx").Sheets("Sheet2")
        Set rBB = .Range("B1", .Range("B" & .Rows.Count).End(xlUp))
        Set rBC = .Range("C1", .Range("C" & .Rows.Count).End(xlUp))
    End With

    For Each c In rA
        dic(c.Value) = True
    Next

    For Each c In Union(rBB, rBC)
        If dic.exists(c.Value) Then dic.Remove c.Value
    Next

    If dic.Count = 0 Then
        MsgBox "すべてありましたよ"
    Else
        MsgBox "以下が、ありませんでした。" & vbLf & Join(dic.keys, vbLf)
    End If

 End Sub

(β) 2016/05/09(月) 20:48


ありがとうございます。

大変参考になります。

一点お聞きしたいのですが

 Dim c As Range

の「c」は何を意味していますか?

(ゆい) 2016/05/09(月) 21:33


 変数名は、それぞれ好きな文字列でいいわけですが、なんとなく、多くの人が共通で使っている変数名があります。
 たとえば 行をあらわす変数は i を使うことが少なくないですし、列は j とか。
 c も、わりあいと使われていますね。 セルオブジェクトに使うことが多いでしょう。
 Cell の 頭文字?

(β) 2016/05/09(月) 22:11


 ところで、アップしたコードはシンプルとはいえ、Dictionaryを使っています。
 また、ループ処理も行っています。

 質問文の中に、【VBA初心者です】という表現がありました。
 アップしたコードをご理解いただければ結構なんですが、なんだかわからない。
 応用が利かないので参考にならないということでしたらマクロブックのシートを作業シートにして、
 フィルターオプション(フィルター詳細設定)を2回使って求める情報を抽出することができます。
 この操作をマクロ記録すれば、基本的な処理コードも生成されますが、何よりも、シート上の作業で結果がでます。

 もし、そちらのほうが、とっつきやすいということであれば、操作手順をアップしますけど、いかがですか?

(β) 2016/05/09(月) 22:47


 ちょっと気になりましたので。

 説明では A列 とか B列 と表現されています。
 コードでは、それぞれの1行目からのデータを対象にしています。

 もし、1行目がタイトル行、チェックすべきデータは2行目からということであったり
 BookBのB,C列は、タイトル行が結合セルになっているということであれば、コード、あるいは
 そのあと申し上げたフィルターオプション操作手順も少しかわってきます。

(β) 2016/05/10(火) 09:23


変数宣言の意味も分からない初心者にDictionaryは無理がある。
言われる通り、フィルタオプション案を教えてあげるのが良さそうだ。

因みに、セルオブジェクトというものはない。あるのはRangeオブジェクトだ。
しいて言うなら、Cellsプロパティによって取得されるRangeオブジェクト、
ならある。

(とおりすがり) 2016/05/10(火) 09:45


 申し上げた操作手順を書いておきます。
 なお、BookA,BookBともに、1行目から処理対象のデータという前提です。

 以下手順では、関連の各領域を隣接しないようにしています。
 実際の操作としては隣接していてもいいのですが、マクロ処理をする場合に、領域指定を簡単にできるように
 各領域間には空白列なり空白行が入るようにしています。

 ●準備工程

  1.マクロブックの作業シートのセルをすべて選んでクリア
  2.A1に適当なタイトル。"項目" としましょうか。
  3.A2 から下に BookBのB列のデータをコピペ、続けて、その下にBookBのC列のデータをコピペ
  4.C1に"項目"、C2から下に BookAのA列のデータをコピペ
  5.C列を選択して重複の削除

 ●フィルターオプション用に、抽出条件を完全一致にするために

  6.E1 に "項目"
  7.E2 に ="="&C2 といれてこれを下にC列のデータ最後の行までフィルコピー

 ●1回目のフィルターオプション

  8.A1 を選択して フィルター詳細設定
  9.でてきたダイアログで
  1)指定した範囲(O) を選び
  2)リスト範囲(L) に A1:A●(●は実際のデータ最終行)
  3)検索条件範囲(C) に E1:E●(●は実際のデータ最終行)
  4)抽出範囲(T) に G1
  5)重複するレコードを無視する(R)にチェック
  6)OKボタン

 ★ここで、G列に抽出されたものの行数が C列(E列)と同じなら、すべて存在したということになります。
  また、抽出がなければ、C列のコード(もともとBookAにあったコード)すべてが
  BookBになかったということになります。

 ●もし、行数が少なければ、なにかしら、存在しないコートがあったということになりますので、続けて以下。

  10.G2:G● を選択し、Ctrl/c
  11.K4を選択して、形式を選択して貼り付け、行列を入れ替える にチェックしてOK
  12.K1 に "項目"、K2 に ="<>"&K4 。K1:K2を選択して右にフィルコピー

 ●2回目のフィルターオプション

  13.フィルター詳細設定
  14.でてきたダイアログで
  1)指定した範囲(O) を選び
  2)リスト範囲(L) に C1:C●(●は実際のデータ最終行)
  3)検索条件範囲(C) に K1:■2(■は実際のデータ最終列記号)
  4)抽出範囲(T) に I1
  5)OKボタン

 ★これで、I列に、BookAにあって、BookBになかったものが抽出されます。

(β) 2016/05/10(火) 16:54


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.