Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Home : Excel 2016)
2つのリストを比較してする処理について
投稿日時: 18/07/15 22:20:33
投稿者: 初心者A

初めて投稿致します。
宜しくお願いします。
 
最近VBAを勉強し始め、少しずつ業務改善をしていこうと考えているのですが、なかなかうまくいきません。
教えていただければ、幸いです。
 
A10人とB200人のリスト(人名)があり
AとBのリストを照合して一緒の名前があれば、その名前をリストBから削除する(リストAはそのまま)。
そうでない場合(リストAに名前があってリストBに名前がない場合)リストAの名前を削除する(リストBはそのまま)。
という処理をしていきたいんですが…
 
分かる方いらっしゃいましたら、教えてください。
宜しくお願い致します。
 
 

回答
投稿日時: 18/07/15 23:03:22
投稿者: simple

Bのリストの下から上に向かって1つずつ繰り返し作業をします。
ワークシート関数CountIfを使って、それがAのリストにあるかどうか判定ができますから、
ある場合には、Bのその項目を削除すればよいでしょう。
# 作業にあたってはバックアップをとっておかれることをお薦めします。

回答
投稿日時: 18/07/16 09:23:34
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

AとBのリストを照合して
 一緒の名前があれば、その名前をリストBから削除する(リストAはそのまま)。
 そうでない場合(リストAに名前があってリストBに名前がない場合)リストAの名前を削除する(リストBは そのまま)。

 
この説明を図式化すると
IF A=B Then
   B削除
ElseIf A有+B無 Then
   A削除
End If
となるが、
条件として、B有+A無が抜けている
それを問題視しているわけではなく、
結果的に
前者の条件(A=B)の時のAだけが残ってしまいます。
それでよいのでしょうか?
 
この処理を次回も実行する場合、次回は、後者の条件でAが削除されることになります。
つまり、前者のAも削除したほうがよいのではないか?
ということです。
 
以上、処理仕様の確認です。
 
目視で処理する場合は、それほど問題にはなりませんが、
VBAで処理する場合
(1)各々のデータの並び(昇順/降順・ランダム)を定義する必要があります。
 複数のデータ件数を扱う場合、ループ処理が前提となります。
 ループには、「For 〜Next」と「Do〜 Loop」という方法がありそれを決めるための条件になります。
(2)各々の表が、同一シート内なのか/別シートなのか?
  ループにおいては、行番号を使用するのが一般的で、且つ、削除を前提とする場合は
  下からアクセスするのが常套手段です。
  二つの表が同一シートにある場合、結構、難しいと思います。
  「削除」ではなく、「B表」を別個に作成する方法ならば、その条件はかなり緩和されます。
 
このような観点で、仕様を検討してみてはいかがでしょうか?
 
 
 
 

回答
投稿日時: 18/07/16 10:20:20
投稿者: simple

条件は余りよく見ていませんでした。
個数を小さくしてモデルで考えることにして、

sheet1          Sheet2
    A列             A列
1行  a        1行   e
2    b        2     a
3    c        3     b
4    d        4     f
              5     g

のとき、どんな結果にしたいのでしょうか?

投稿日時: 18/07/16 23:00:51
投稿者: 初心者A

simple様、WinArrow様、早速のご返答ありがとうございます。
説明不足で大変申し訳ありません。
 
仕様の確認ですが、
A=B→B削除 A有+B無→A削除 B有+A無→Bはそのまま
という処理をしていきたいです。
 
本を見ながらFor〜Nextとかも使ってみたんですが、
AもBも消えてしまったりと…うまくいきません。 
 
表にかんしては同一シートを考えていましたが、どちらでも大丈夫です。
B表を別に作成する方法ですね。ありがとうございます。いろいろ調べてみます。
 
ちなみに
 
sheet1 Sheet2
    A列 A列
1行 a 1行 e
2 b 2 a
3 c 3 b
4 d 4 f
              5 g
    ↓
sheet1 Sheet2
    A列 A列
1行 a 1行 e
2 b 2
3 3
4 4 f
              5 g
 
こうなります。
 
お二人ともありがとうございます。

回答
投稿日時: 18/07/16 23:39:25
投稿者: simple

念のための確認ができました。

   Aリスト   Bリスト
   a         e
   b         a
   c         b
   d         f
             g

(1)Bリストの各要素について、CountIfでAリストにあるかを判定して、
   あれば、 右の列に消去フラッグ(例:1)を立てる。
(2)Aリストの各要素について、CountIfでBリストにあるかを判定して、
   なければ、右の列に消去フラッグ(例:1)を立てる。
(3)消去フラッグの立っている行を消去
(4)ダミーのフラッグ列を消去
と、こんな手順でやってみてください。
WorksheetFunctionを頭につければ、ワークシート関数が使えます。
頑張って下さいね。

投稿日時: 18/07/17 21:36:54
投稿者: 初心者A

simple様ありがとうございます。
 
countifを使用してやってみたいと思います。

回答
投稿日時: 18/07/18 09:29:37
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

本を見ながらFor〜Nextとかも使ってみたんですが、
AもBも消えてしまったりと…うまくいきません。 

 
このあたりは、たぶん勘違いがると思います。
今後の参考になると思いますので、掲示すれば、アドバイスが貰えると思います。

回答
投稿日時: 18/07/18 17:04:43
投稿者: TAKA君

はじめまして。
Sheet1のA列にAリスト、B列にBリストが存在すると仮定したマクロです。
参考になれば幸いです。わからないところあれば聞いてください。
 
 
Sub 回答例()
    Dim i As Long, Lr As Long, Fc As Range
    With ThisWorkbook.Sheets("Sheet1")
        Lr = .Range("A1").End(xlDown).Row
        For i = 2 To Lr
            Set Fc = .Range("B:B").Find(WHAT:=.Cells(i, "A").Value)
            If Fc Is Nothing Then
                .Cells(i, "A").Delete SHIFT:=xlUp 'B列になかった場合の処理
                i = i - 1
            Else
                Fc.Delete SHIFT:=xlUp 'B列にあった場合の処理
            End If
        Next i
    End With
End Sub

回答
投稿日時: 18/07/18 23:08:01
投稿者: WinArrow
投稿者のウェブサイトに移動

再掲
最初の質問の内容は、多分にコード作成依頼と受け取られそうな感じがします、。

引用:
本を見ながらFor〜Nextとかも使ってみたんですが、
AもBも消えてしまったりと…うまくいきません。

ということならば、自分で作成したコードを掲示して、添削してもらう方が
スキルアップにつながります。
 
回答者がコードを回答したとしても、基本的に正解でないと考えた方がよいでしょう。
それは、あなたの説明した内容に、まだ、説明しきれていないところがあったり、
回答者の推測が外れていたりすることがあるからです。
それも含めて、実際の場面に適用して「正解」とするにはあなたです。
 
 

トピックに返信