[[20190306150824]] 『複数のシートの重複するデータをまとめて一覧にす』(SUGI) ページの最後に飛ぶ

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

 

『複数のシートの重複するデータをまとめて一覧にする』(SUGI)

エクセル初心者です。
1つのBOOKに朝、昼、夜、間とシートがあり
その各シートにB列4行以降にに名前が入り、C列4行以降に住所、
D列4行以降に年齢・・・と情報が続いています。
シートごとに同じデータが入っているのですが、
同じ人物が重複して入っています。

新しい別のシートに重複しない一覧を作成したいのですが、
どのようにしたらよいでしょうか?

新しいく作成するシートはデータの並びは同じでいいのですが、
1行目は項目としてB列2行目から作成したいです。

宜しくお願いいたします。

< 使用 Excel:unknown、使用 OS:unknown >


 >新しい別のシートに重複しない一覧を作成したいのですが、 
 これは名前だけですか?
 それとも同姓同名で住所や電話番号が一文字でも違えば、重複ではないとみなしますか?
 例)
 田中太郎 東京
 田中太郎 埼玉
 の場合、どちらも残すのか、片方だけなのか。

 一覧の作成頻度はどのくらいですか?
 一度だけですか? 毎朝ですか?

 一度だけの場合、「重複の削除」で調べてください。

 エクセルのバージョンを教えてください。
(稲葉) 2019/03/06(水) 15:55

 >新しい別のシートに重複しない一覧を作成したいのですが、 
 これは名前だけですか?
 それとも同姓同名で住所や電話番号が一文字でも違えば、重複ではないとみなし 
 ますか?
 →名前以外の部分も一覧に入れたいです。

 例)
 田中太郎 東京
 田中太郎 埼玉
 の場合、どちらも残すのか、片方だけなのか。
→想定していなかったのですが、両方残すほうがいいです。

 一覧の作成頻度はどのくらいですか?
→一度だけでなく、追加、変更、名前以外の情報の変更が発生するたびに
 一覧に反映していきたいです。頻度は1日1回ほどです。

 作業としてはその一覧をもとに 名前と情報のののったネームカード
 のようなものを別シートで作成します。
 変更や追加があった場合は朝、昼、夕のシートに修正して、
 ネームカードを印刷しなおして使用します。

 エクセルのバージョンを教えてください。
→失礼いたしました。2016です。
(SUGI) 2019/03/06(水) 16:49

 標準モジュールに張り付けてください。
 実行を押すと、「重複削除」というシートが作られ、そこに各シートのデータをコピーして重複を削除します。
    Sub 重複削除()
        Dim wsn As Variant
        Dim c As Long, cc As Long
        Dim i As Long
        Dim tmp As Variant
        Dim ary() As Variant
        If Evaluate("=NOT(ISREF(重複削除!A1))") Then Sheets.Add before:=Sheets(1): Sheets(1).Name = "重複削除"
        Sheets("重複削除").Cells.ClearContents
        c = 1
        cc = 0
        For Each wsn In Array("朝", "昼", "夜")
            With Sheets(wsn)
                If c = 1 Then
                    Do
                        c = c + 1
                        cc = cc + 1
                        Sheets("重複削除").Cells(1, cc).Value = .Cells(3, c).Value
                        ReDim Preserve ary(cc - 1): ary(cc - 1) = cc
                    Loop Until .Cells(3, c + 1).Value = ""
                End If
                tmp = .Range(.Cells(4, c), .Cells(Rows.Count, "B").End(xlUp)).Value
                Sheets("重複削除").Cells(Rows.Count, "A").End(xlUp).Offset(1).Resize(UBound(tmp, 1), UBound(tmp, 2)).Value = tmp
            End With
        Next wsn
        With Sheets("重複削除").Range("A1").CurrentRegion
            Debug.Print .Address
            .RemoveDuplicates _
                Columns:=(ary), _
                Header:=xlYes
        End With
    End Sub

     |[B]        |[C]   |[D] 
 [2] |朝シート   |      |    
 [3] |名前       |住所  |年齢
 [4] |上村 つばさ|茨城県|  45
 [5] |谷口 幾江  |茨城県|  46
 [6] |浜崎 伝三郎|東京都|  45
 [7] |望月 松代  |山形県|  39
 [8] |伊藤 貞郎  |広島県|  20
 [9] |杉田 季孝  |愛知県|  36
 [10]|藤本 たか子|新潟県|  39
 [11]|相馬 重文  |東京都|  40
 [12]|林田 都義  |京都府|  37
 [13]|杉田 伴助  |東京都|  35

     |[B]        |[C]   |[D] 
 [2] |昼シート   |      |    
 [3] |名前       |住所  |年齢
 [4] |上村 つばさ|茨城県|  50 ★
 [5] |谷口 幾江  |茨城県|  46
 [6] |浜崎 伝三郎|東京都|  45
 [7] |望月 松代  |山形県|  39
 [8] |伊藤 貞郎  |広島県|  20
 [9] |杉田 季孝  |愛知県|  36
 [10]|藤本 たか子|新潟県|  39
 [11]|相馬 重文  |東京都|  40
 [12]|林田 都義  |京都府|  37
 [13]|杉田 伴助  |東京都|  35

     |[B]        |[C]   |[D] 
 [2] |夜シート   |      |    
 [3] |名前       |住所  |年齢
 [4] |上村 つばさ|茨城県|  45
 [5] |谷口 幾江  |茨城県|  46
 [6] |浜崎 伝三郎|東京都|  45
 [7] |望月 松代  |山形県|  39
 [8] |伊藤 貞郎  |広島県|  20
 [9] |杉田 季孝  |愛知県|  36
 [10]|藤本 たか子|新潟県|  39
 [11]|相馬 重文  |東京都|  40
 [12]|林田 都義  |京都府|  37
 [13]|杉田 伴助  |埼玉県|  35 ★

 出力結果
     |[A]        |[B]   |[C] 
 [1] |名前       |住所  |年齢
 [2] |上村 つばさ|茨城県|  45 ★
 [3] |谷口 幾江  |茨城県|  46
 [4] |浜崎 伝三郎|東京都|  45
 [5] |望月 松代  |山形県|  39
 [6] |伊藤 貞郎  |広島県|  20
 [7] |杉田 季孝  |愛知県|  36
 [8] |藤本 たか子|新潟県|  39
 [9] |相馬 重文  |東京都|  40
 [10]|林田 都義  |京都府|  37
 [11]|杉田 伴助  |東京都|  35 ★
 [12]|上村 つばさ|茨城県|  50 ★
 [13]|杉田 伴助  |埼玉県|  35 ★

(稲葉) 2019/03/06(水) 18:03


回答ではありませんが。

>→一度だけでなく、追加、変更、名前以外の情報の変更が発生するたびに
> 一覧に反映していきたいです。

どういった理由で、重複が発生するのかわかりませんが、
変更する際は、重複の削除が先でないとだめでは?

(マナ) 2019/03/06(水) 19:02


 ありがとうございます。
 稲葉様、試してみて名前とC列のは一覧になったのですが
 D列の情報が反映されませんでした。
 なぜか教えていただけますでしょうか?

 また追加でA列にも記号が入っていて重複削除後の一覧の
 A列に反映させることはできますでしょうか。

 さらに各シートの重複削除して一覧に反映させる範囲を
 4〜50行に範囲設定することはできますでしょうか。

 マナ様
 各シート朝、昼、夕、の名簿はそれぞれの、参加者がリストになっていて
 多くは同じ人物が入っていて半分以上朝、昼、夕と重複しています。
 名前の後に続く情報の集計を数値で別のBookで計算し、
 埼玉県が何名、洋食が何名、という風に数を集計したものを作成しています。
 それとは別にネームカードに名前や情報が書いたものを印刷して使用しています。
 (↑それを今は手書きです)

 情報が変更し、ネームプレートを差し替えたり(昨日まで和食だったが、今日は洋食など)
 が頻繁に発生するため、作業は毎日あります。

 分かりにくいと思いますが、ご検討お願いいたします。

(SUGI) 2019/03/07(木) 10:09


 > D列の情報が反映されませんでした。
 >なぜか教えていただけますでしょうか?
 D3セルが空白になっていませんか?
 A3 B3 C3・・・と見ていって、空白になったらそこで表が終わり、というコードです。

 > また追加でA列にも記号が入っていて重複削除後の一覧の
 >A列に反映させることはできますでしょうか。
 >さらに各シートの重複削除して一覧に反映させる範囲を
 >4〜50行に範囲設定することはできますでしょうか。
 意味が分かりません。
 具体的な例を出してください。

(稲葉) 2019/03/07(木) 10:20


> D列の情報が反映されませんでした。
 >なぜか教えていただけますでしょうか?
 D3セルが空白になっていませんか?
 A3 B3 C3・・・と見ていって、空白になったらそこで表が終わり、というコードです。

 →なっていました。ありがとうございます。

 意味が分からラなかった部分下記もう一度
 ご検討ただけますでしょうか。
 最初にお伝えせず、後から気づいた内容です。

 ・朝、昼、夕それぞれのシートのA列には「S」「特」など
 記号が入っていて、重複削除した一覧のA列に反映させたい。
 (名前はB列、情報はC列以降に表示させたい。)
 先ほどのマクロを実行させたところ、重複削除のシートのA列に名前がありました。

 ・朝、昼、夕のシートのだいたい30行目以降に今は使っていない人の
 情報が残っています(復活するかもしれないので、完全に消していない)
 ここは一覧に表示させたくないので、4行目から30行目(余裕をつくって50行目でも)
 を重複削除したいです。

(SUGI) 2019/03/07(木) 15:10


 最初の要件が、B2からでしたね。すみません。

 >        c = 1
 これを c = 0

 >tmp = .Range(.Cells(4, c), .Cells(Rows.Count, "B").End(xlUp)).Value
 これを tmp = .Range(.Cells(4, c), .Cells(50, "A")).Value

 試してないけど、これでどうでしょうか?
(稲葉) 2019/03/07(木) 16:12

 確認が遅くなり申し訳ございません。
 記載いただいた物を試したのですが
 「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです」
 となり動きませんでした。

 何度も申し訳ございませんが、
 対処法を教授いただけますでしょうか?

 よろしくお願いいたします。
(SUGI) 2019/03/11(月) 11:26

 どの部分でしょうか?
 デバッグ画面で網掛けのコードを教えてください。
(稲葉) 2019/03/11(月) 11:59

 tmp = .Range(.Cells(4, c), .Cells(50, "A")).Value
 の部分は黄色く網掛けになりました。
 よろしくお願いいたします。
(SUGI) 2019/03/11(月) 14:42

 前回直してほしいところが漏れていたみたいです。
 全面差し替え
 あと確認でA列が異なって、他が同じ場合は、重複とみなしますか?
    |[A]|[B]        |[C]   |[D]
 [2]|S  |上村 つばさ|茨城県| 45
 [3]|特 |上村 つばさ|茨城県| 45
 この方は重複とみなすのか、そうでないのか。 コード上はみなしていません。

    Sub 重複削除()
        Dim wsn As Variant
        Dim c As Long, cc As Long
        Dim i As Long
        Dim tmp As Variant
        Dim ary() As Variant
        If Evaluate("=NOT(ISREF(重複削除!A1))") Then Sheets.Add before:=Sheets(1): Sheets(1).Name = "重複削除"
        Sheets("重複削除").Cells.ClearContents
        c = 0
        cc = 0
        For Each wsn In Array("朝", "昼", "夜")
            With Sheets(wsn)
                If c = 0 Then
                    Do
                        c = c + 1
                        cc = cc + 1
                        Sheets("重複削除").Cells(1, cc).Value = .Cells(3, c).Value
                        ReDim Preserve ary(cc - 1): ary(cc - 1) = cc
                    Loop Until .Cells(3, c + 1).Value = ""
                End If
                tmp = .Range(.Cells(4, c), .Cells(50, "A")).Value
                Sheets("重複削除").Cells(Rows.Count, "A").End(xlUp).Offset(1).Resize(UBound(tmp, 1), UBound(tmp, 2)).Value = tmp
            End With
        Next wsn
        With Sheets("重複削除").Range("A1").CurrentRegion
            Debug.Print .Address
            .RemoveDuplicates _
                Columns:=(ary), _
                Header:=xlYes
        End With
    End Sub
(稲葉) 2019/03/11(月) 15:55

 ありがとうございます。
 記載いただいたように重複とみなさないでいいです。
 希望通りのものができました。

 時間もかかってしまい申し訳ございませんでした。

 本当にありがとうございました。
(SUGI) 2019/03/11(月) 16:35

 上記の件でさらに質問です。

 今"朝", "昼", "夜"のシートを重複削除で一覧にできたのですが、
 同じブック内でさらに別のシートで"月", "火", "水"があり、
 今できている"重複削除"と別のシートで同じことをしたいのですが、
 どのようにすればいいでしょうか?

 自分なりに"重複削除"この部分の名前をかえて
 新規で標準モジュールを作成したのですが
 デバックが With Sheets(wsn)と網掛けされエラーになってしまいました。

 何度もすみませんがよろしくお願いいたします。
(SUGI) 2019/03/22(金) 16:00

 遅くなりました。
 しばらく腰を据えて返信できそうにないので、端的な返信になります。

         For Each wsn In Array("朝", "昼", "夜")
 この部分が実際にはないシート名を指定されているのではないでしょうか?

 同じ表構成であれば、こちらを書き換えることで対応できると思います。
(稲葉) 2019/03/25(月) 17:48

コメント返信:

[ 一覧(最新更新順) ]


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