重複しないリストを作成する(並べ替えを行い、最後に元に戻す)

この講座は有料講座です。
講座の購入後ご覧になれます。

ログインアカウントの新規作成

解説

重複して取引先名が出現するリストを元にして、重複しないリストを作ります。(ただし、あらかじめ取引先名で並べ替えがされていません。また、元データには番号が振られていません)

この教材についての過去の質問・感想

9059 : 小川慶一の回答 (2017-10-15 12:24:43)

浦山大さん:

添削を返送します。

Option Explicit
 
Dim ws As Worksheet
'Dim cCo, cMx, cMigi As Long 'よくコメントで纏めてあるのを見かけるのでやってみました、問題なく動く
Dim cCo As Long, cMx As Long, cMigi As Long '←vb6.0では、都度型指定が必要
Dim namae As String     '別解、理解できました、使えてます。
 
Sub Zentai()
    Set ws = Worksheets("main")     '見本と"main"2枚なので明示
    cMx = Range("B" & ws.Rows.Count).End(xlUp).Row
    cCo = 2
    cMigi = 2
        '↓インデント不正
        Tooshibanngou   '通番を振る
    cCo = 2     'プロシージャ内で設定し直す方がスマートなんですか?
        '↓インデント不正
        Narabekae_B     'B列で並べ替える
        Create_List         'リストを作成する
    cCo = 2     'プロシージャ内で設定し直す方がスマートなんですか?
        '↓インデント不正
        Narabekae_A     'A列で並べ替える(並び順を元に戻す)
        Sakujo_Tooshibangou '通番を削除する、これで元通り
End Sub
 
Sub Tooshibanngou()
    'autofillも試してみましょう
    For cCo = 2 To cMx
        ws.Range("A" & cCo).Value = cCo - 1
    Next
End Sub
 
Sub Narabekae_B()
    With ws
        '↓インデント不正
'    .Sort.SortFields.Clear
'    .Sort.SortFields.Add _
'        Key:=Range("B1"), _
'        SortOn:=xlSortOnValues, _
'        Order:=xlAscending, _
'        DataOption:=xlSortNormal
    
        .Sort.SortFields.Clear
        .Sort.SortFields.Add _
            Key:=Range("B1"), _
            SortOn:=xlSortOnValues, _
            Order:=xlAscending, _
            DataOption:=xlSortNormal
        With .Sort
            .SetRange Range("A1:B" & cMx)
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End With
End Sub
 
Sub Create_List()
    For cCo = 2 To cMx
        If ws.Range("B" & cCo) <> namae Then
            namae = ws.Range("B" & cCo).Value
            ws.Range("D" & cMigi).Value = cMigi - 1
            ws.Range("E" & cMigi).Value = namae
            cMigi = cMigi + 1
        End If
    Next
End Sub

'Narabekae_B参照のこと
Sub Narabekae_A()
    With ws
    .Sort.SortFields.Clear
    .Sort.SortFields.Add _
        Key:=Range("A1"), _
        SortOn:=xlSortOnValues, _
        Order:=xlAscending, _
        DataOption:=xlSortNormal
        With .Sort
            .SetRange Range("A1:B" & cMx)
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End With
End Sub
 
Sub Sakujo_Tooshibangou()
    ws.Range("A2:A" & cMx).ClearContents
End Sub


9050 : 浦山大さんのコメント (2017-10-13 10:04:46)

Zentaiというプロシージャに処理をまとめました。
確認の意味で一度見て頂けると嬉しいです。
部分部分は問題ないと思います(ちゃんと動きました)。

・インデントの位置は大丈夫でしょうか?
・一つひとつ細切れにしてチェックしながら取り組めました。
 →いつも先生の仰っているパーツごとに細かく…の意味がとてもよ  くわかりました。実務でも使えそうです。
・早速、実務で作成した長いマクロも整理していきたいと思います。

Option Explicit

Dim ws As Worksheet
Dim cCo, cMx, cMigi As Long 'よくコメントで纏めてあるのを見かけるのでやってみました、問題なく動く
Dim namae As String     '別解、理解できました、使えてます。

Sub Zentai()
    Set ws = Worksheets("main")     '見本と"main"2枚なので明示
    cMx = Range("B" & ws.Rows.Count).End(xlUp).Row
    cCo = 2
    cMigi = 2
        Tooshibanngou   '通番を振る
    cCo = 2     'プロシージャ内で設定し直す方がスマートなんですか?
        Narabekae_B     'B列で並べ替える
        Create_List         'リストを作成する
    cCo = 2     'プロシージャ内で設定し直す方がスマートなんですか?
        Narabekae_A     'A列で並べ替える(並び順を元に戻す)
        Sakujo_Tooshibangou '通番を削除する、これで元通り
End Sub

Sub Tooshibanngou()
    For cCo = 2 To cMx
        ws.Range("A" & cCo).Value = cCo - 1
    Next
End Sub

Sub Narabekae_B()
    With ws
    .Sort.SortFields.Clear
    .Sort.SortFields.Add _
        Key:=Range("B1"), _
        SortOn:=xlSortOnValues, _
        Order:=xlAscending, _
        DataOption:=xlSortNormal
        With .Sort
            .SetRange Range("A1:B" & cMx)
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End With
End Sub

Sub Create_List()
    For cCo = 2 To cMx
        If ws.Range("B" & cCo) <> namae Then
            namae = ws.Range("B" & cCo).Value
            ws.Range("D" & cMigi).Value = cMigi - 1
            ws.Range("E" & cMigi).Value = namae
            cMigi = cMigi + 1
        End If
    Next
End Sub

Sub Narabekae_A()
    With ws
    .Sort.SortFields.Clear
    .Sort.SortFields.Add _
        Key:=Range("A1"), _
        SortOn:=xlSortOnValues, _
        Order:=xlAscending, _
        DataOption:=xlSortNormal
        With .Sort
            .SetRange Range("A1:B" & cMx)
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End With
End Sub

Sub Sakujo_Tooshibangou()
    ws.Range("A2:A" & cMx).ClearContents
End Sub


8926 : 小川慶一の回答 (2017-09-25 16:05:09)

浦山大さん:

> 添削してもらうととってもよくわかります。
> ありがとうございます!

という言い方もできますし、自分で書いてみるとよく分かる、とも言えますね (^^

ひきつづきお楽しみください☆



> 小川先生
> 添削頂きましてありがとうございます。
> 自分の書いたコードと小川先生のコードを見比べてみました。
>
> >'↓丁寧にやるなら、以下のとおり、range("xx") の手前に wFm. をつけま
> >す。でないと、アクティブシートが wFm でないときに誤動作する可能性
> >が高いです。
> > ' (「並べ替え対象は wFm で、諸条件の設定はアクティブシート」とな>ってしまうため)
> > ' シートが1枚しかないか、このマクロ実行時には絶対に
> >worksheets("main") がアクティブになっているという保証があれば
> >話は別ですが。
>
> 見直してみたら、Rangeの前にwFmが抜けていますね。
>
> > ' あるいは、この並べ替えが実行されるより前に、 wFm を明示的にアク>ティブにしておくこと。
>
> 添削頂いたコードに記載があったように、
> 最初の段階でニックネームを付けて、誤動作を防ぐように致します。
>
> ①明示的に宣言できる部分は宣言
> ②並べ替えが実行される前に、wFmを明示的にアクティブにしておく。
> 練習する度に頂いたコードを見ながら、
> 添削頂いた点が体得できているか確認します。
>
> 添削してもらうととってもよくわかります。
> ありがとうございます!


8918 : 浦山大さんのコメント (2017-09-23 18:23:48)

小川先生
添削頂きましてありがとうございます。
自分の書いたコードと小川先生のコードを見比べてみました。

>'↓丁寧にやるなら、以下のとおり、range("xx") の手前に wFm. をつけま
>す。でないと、アクティブシートが wFm でないときに誤動作する可能性
>が高いです。
> ' (「並べ替え対象は wFm で、諸条件の設定はアクティブシート」とな>ってしまうため)
> ' シートが1枚しかないか、このマクロ実行時には絶対に
>worksheets("main") がアクティブになっているという保証があれば
>話は別ですが。

見直してみたら、Rangeの前にwFmが抜けていますね。

> ' あるいは、この並べ替えが実行されるより前に、 wFm を明示的にアク>ティブにしておくこと。

添削頂いたコードに記載があったように、
最初の段階でニックネームを付けて、誤動作を防ぐように致します。

①明示的に宣言できる部分は宣言
②並べ替えが実行される前に、wFmを明示的にアクティブにしておく。
練習する度に頂いたコードを見ながら、
添削頂いた点が体得できているか確認します。

添削してもらうととってもよくわかります。
ありがとうございます!


8913 : 小川慶一の回答 (2017-09-18 19:38:21)

浦山大さん:

添削を返送します。

> ※記法、インデント等問題ないでしょうか?

一箇所だけ要修正でした。

> ※並べ替えが大変(ごちゃごちゃ)でした。

特に並べ替えでよくある注意点として、シートを明示している部分とアクティブシートでの作業と記載されている部分が混在してしまうことがあります。
どちらかに統一しましょう。

> 基礎編で実施していることについてはサラサラ書けています。不思議です…。

身体で覚えているということでしょうね (^^

> また、今までブレークポイントをあまり使ってこなかったんですが、使い方が今回の練習で体得できました。途中途中でしっかり検証、実験しながらでないと訳がわからなくなってしまいますね。Debug.Printも入れながら作業するようにしています。

ブレークポイント設定等のデバッグのノウハウには、ある程度のスケールのプログラムを書きはじめてようやく実感できるような面がありますね (^^

ひきつづき、お楽しみください☆

Sub renshu_ogawa1()
    Dim wFm As Worksheet
    Dim cMx As Long
    Dim cGyo As Long
    Dim cMigi As Long
        '↓以下2行はインデント過多です (^^; ogawa
        cMx = Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row
        cMigi = 2
    
    For cGyo = 2 To cMx
        Range("A" & cGyo).Value = cGyo - 1
    Next
    
    Set wFm = ActiveWorkbook.Worksheets("main") 'ブレークポイント①↑通し番号を振る
    
    '↓丁寧にやるなら、以下のとおり、range("xx") の手前に wFm. をつけます。でないと、アクティブシートが wFm でないときに誤動作する可能性が高いです。
    '  (「並べ替え対象は wFm で、諸条件の設定はアクティブシート」となってしまうため)
    '  シートが1枚しかないか、このマクロ実行時には絶対に worksheets("main") がアクティブになっているという保証があれば話は別ですが。
    '  あるいは、この並べ替えが実行されるより前に、 wFm を明示的にアクティブにしておくこと。
    With wFm.Sort
            .SortFields.Clear
            .SortFields.Add Key:=wFm.Range("B1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange wFm.Range("A1:B" & cMx)
            .Header = xlYes
            .Orientation = xlTopToBottom
            .Apply
    End With
    
    For cGyo = 2 To cMx 'ブレークポイント②↑B列で並べ替え
        If Range("B" & cGyo).Value <> Range("B" & cGyo - 1).Value Then
            Range("D" & cMigi).Value = cMigi - 1
            Range("E" & cMigi).Value = Range("B" & cGyo).Value
            cMigi = cMigi + 1
        End If
    Next
    
    With wFm.Sort   'ブレークポイント③↑リスト書き出しまで
            .SortFields.Clear
            .SortFields.Add Key:=wFm.Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange wFm.Range("A1:B" & cMx)
            .Header = xlYes
            .Orientation = xlTopToBottom
            .Apply
    End With
    
    Range("A2:A" & cMx).ClearContents   'ブレークポイント④↑A列で並べ替え
End Sub     '⑤番号を消す-A列を削除
Sub renshu_ogawa2() '↓ここまですれば、アクティブシートがどれであろうと動作します。
    Dim wFm As Worksheet
    Dim cMx As Long
    Dim cGyo As Long
    Dim cMigi As Long
    
    Set wFm = ActiveWorkbook.Worksheets("main") 'この段階で、シートへの参照設定(ニックネームつけ)を早々にする。以降では、セルを指定する部分で wFm. とシートを明示する。
    
    cMx = wFm.Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row
    cMigi = 2
    
    For cGyo = 2 To cMx
        wFm.Range("A" & cGyo).Value = cGyo - 1
    Next
    
'    Set wFm = ActiveWorkbook.Worksheets("main")
    
    With wFm.Sort
            .SortFields.Clear
            .SortFields.Add Key:=wFm.Range("B1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange wFm.Range("A1:B" & cMx)
            .Header = xlYes
            .Orientation = xlTopToBottom
            .Apply
    End With
    
    For cGyo = 2 To cMx
        If wFm.Range("B" & cGyo).Value <> wFm.Range("B" & cGyo - 1).Value Then
            wFm.Range("D" & cMigi).Value = cMigi - 1
            wFm.Range("E" & cMigi).Value = wFm.Range("B" & cGyo).Value
            cMigi = cMigi + 1
        End If
    Next
    
    With wFm.Sort
            .SortFields.Clear
            .SortFields.Add Key:=wFm.Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange wFm.Range("A1:B" & cMx)
            .Header = xlYes
            .Orientation = xlTopToBottom
            .Apply
    End With
    
    wFm.Range("A2:A" & cMx).ClearContents
End Sub


8910 : 浦山大さんのコメント (2017-09-18 16:10:42)

1~10までの動画を拝見させて頂いて、自分で作ってみました。

※記法、インデント等問題ないでしょうか?
※並べ替えが大変(ごちゃごちゃ)でした。
→過去の皆さんのコメント等参考にさせて頂いて自分なりに編集してみました。
■動作は確認しました、意図通りに動いています。
■別解の様に変数namaeを使用するのにもチャレンジしてみます。

基礎編で実施していることについてはサラサラ書けています。不思議です…。

また、今までブレークポイントをあまり使ってこなかったんですが、使い方が今回の練習で体得できました。途中途中でしっかり検証、実験しながらでないと訳がわからなくなってしまいますね。Debug.Printも入れながら作業するようにしています。

Sub renshu()
    Dim wFm As Worksheet
    Dim cMx As Long
    Dim cGyo As Long
    Dim cMigi As Long
        cMx = Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row
        cMigi = 2
    
    For cGyo = 2 To cMx
        Range("A" & cGyo).Value = cGyo - 1
    Next
    
    Set wFm = ActiveWorkbook.Worksheets("main") 'ブレークポイント①↑通し番号を振る
    
    With wFm.Sort
            .SortFields.Clear
            .SortFields.Add Key:=Range("B1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange Range("A1:B" & cMx)
            .Header = xlYes
            .Orientation = xlTopToBottom
            .Apply
    End With
    
    For cGyo = 2 To cMx 'ブレークポイント②↑B列で並べ替え
        If Range("B" & cGyo).Value <> Range("B" & cGyo - 1).Value Then
            Range("D" & cMigi).Value = cMigi - 1
            Range("E" & cMigi).Value = Range("B" & cGyo).Value
            cMigi = cMigi + 1
        End If
    Next
    
    With wFm.Sort   'ブレークポイント③↑リスト書き出しまで
            .SortFields.Clear
            .SortFields.Add Key:=Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange Range("A1:B" & cMx)
            .Header = xlYes
            .Orientation = xlTopToBottom
            .Apply
    End With
    
    Range("A2:A" & cMx).ClearContents   'ブレークポイント④↑A列で並べ替え
End Sub     '⑤番号を消す-A列を削除


4347 : 山田 将之さんのコメント (2015-05-22 06:24:29)

理解しました。


2593 : 小川慶一の回答 (2014-09-30 10:40:05)

明石 照伸 さん:

>元のリストの並びを元の順に戻すために
>行っていたのですね。

先の先まで考えて前もって準備すると、こういう流れになります。

>毎回ライブ感があって
>とても頭と心に響く動画解説ですね。(^^

ありがとうございます ヾ(´ー`)ノ


2587 : 明石 照伸さんのコメント (2014-09-30 01:25:31)

お世話になります。

元のリストに番号を振って、
最後に削除するのが、最初
意味がわからなかったのですが(^^;、

元のリストの並びを元の順に戻すために
行っていたのですね。

一時的に元データを整形・加工して
処理しやすくすることで、マクロ作成を
楽にしているのですね。
非常に勉強になりました。(^^

毎回ライブ感があって
とても頭と心に響く動画解説ですね。(^^


2579 : 小川慶一の回答 (2014-09-29 13:27:52)

匿名 さん:

似たような問題をたくさん解いていく中で、知識が身体に定着していきますね。
楽しんでください!

>伝票マクロ、とても勉強になります。
>ひとつひとつのスキルを大切にして頑張ります。


2573 : 受講生さんのコメント (2014-09-28 12:56:52)

伝票マクロ、とても勉強になります。
ひとつひとつのスキルを大切にして頑張ります。


933 : 小川慶一の回答 (2014-01-06 10:36:45)

>自分の頭で書けるように、何回も復習したいと思います。

OK、がんばって!応援して升!


915 : 受講生さんのコメント (2014-01-05 20:36:03)

自分の頭で書けるように、何回も復習したいと思います。


3日がかりのその仕事、3分で終わらせる方法教えます。ガラパゴスタディーオンライン講座 ユーザー登録

本講座の動画一覧

  1. 【動画1】 すべてのシートを順に処理する
    【動画1】 すべてのシートを順に処理する 未習得
  2. 【動画2】 所定のシート以外すべてを削除する
    【動画2】 所定のシート以外すべてを削除する 未習得
  3. 【動画3】 所定の条件に一致しないシートすべてを削除する
    【動画3】 所定の条件に一致しないシートすべてを削除する 未習得
  4. 【動画4】 警告ダイアログを出さずにシートを削除する
    【動画4】 警告ダイアログを出さずにシートを削除する 未習得
  5. 【動画5】 複数シートを作成し、取引先名リストにあるのと同じ名前を順に割り当てる
    【動画5】 複数シートを作成し、取引先名リストにあるのと同じ名前を順に割り当てる 未習得
  6. 【動画6】 テンプレートシートを複数コピーし、取引先名リストにあるのと同じ名前を順に割り当てる
    【動画6】 テンプレートシートを複数コピーし、取引先名リストにあるのと同じ名前を順に割り当てる 未習得
  7. 【動画7】 あらかじめ並べ替えられているリストから重複しないリストを作成する
    【動画7】 あらかじめ並べ替えられているリストから重複しないリストを作成する 未習得
  8. 【動画8】 重複しないリストを作成し、新規シート作成時にリストからシート名を生成する
    【動画8】 重複しないリストを作成し、新規シート作成時にリストからシート名を生成する 未習得
  9. 【動画9】 重複しないリストを作成する(並べ替えから行う)
    【動画9】 重複しないリストを作成する(並べ替えから行う) 未習得
  10. 【動画10】 重複しないリストを作成する(並べ替えを行い、最後に元に戻す)
    【動画10】 重複しないリストを作成する(並べ替えを行い、最後に元に戻す) 未習得
  11. 【動画11】 取引記録に登場するすべての取引先名のシートを作成する
    【動画11】 取引記録に登場するすべての取引先名のシートを作成する 未習得
  12. 【動画12】 取引記録に登場するすべての取引先名のシートを作成する(IDの割り振りも行う)
    【動画12】 取引記録に登場するすべての取引先名のシートを作成する(IDの割り振りも行う) 未習得
  13. 【動画13】 取引先ごとに作成したシートにデータ転記を行う
    【動画13】 取引先ごとに作成したシートにデータ転記を行う 未習得
  14. 【動画14】 取引先ごとに作成したシートにデータ転記を行う2
    【動画14】 取引先ごとに作成したシートにデータ転記を行う2 未習得
  15. 【動画15】 データ転記先のシートすべてに対し、罫線を引く等の後処理をする
    【動画15】 データ転記先のシートすべてに対し、罫線を引く等の後処理をする 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ