エクセルマクロ オンライン講座コメント紹介

コメント紹介
   └ 解説「伝票作成マクロ」
       └ 重複しないリストを作成する(並べ替えを行い、最後に元に戻す)

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

[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列を削除

 


[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

 


まずはここから!スマホでも学べる無料動画講座

今なら先着30名限定で無料!定価4,800円の、初心者のためのエクセルマクロ動画講座。
  1. Excel 97~Excel 2016まですべて対応。動画本数20本、総再生時間2時間44分53秒
  2. PC, Mac, iPhone, iPad, Androidのお好みの環境で、いつでも好きなときに学べます。
2004年から10年間述べ3,000名以上に実施した研修の経験と実績を集約した講座です。
いますぐ無料で試してください。

トップへ