今回は登録したデータをソート(並び替え)するコードを書いていきます。

 

ですが実際にコードを書く前に、まずマクロの記録を行って実際どういうコードになるかを確認してみましょう。

 

これはすごく勉強になりますよ。それではいきましょう。

スポンサーリンク

マクロの記録とは?

例えばワークシート医薬品マスタに、上の画像のように登録されているとします。

 

皆さんは適当に薬品名だけで結構ですので、A2~A8に適当な薬品名を入れて下さい。

 

これをA列の薬品名でソート(並び替え)するのですが、一連の流れをマクロに記録していきたいと思います。

 

vba2-18-2開発タブにマクロの記録というのがあります。これをクリックして下さい。

 

vba2-18-3上のような画面が出てきますが、とりあえず無視してOKを押して下さい。

 

ここで注意!この後は薬品名でソートする以外のことは一切しないで下さい!

 

それではいきますよ。

 

vba2-18-4まずA1セルをクリック。

 

「右クリック → 並び替え → ユーザー設定の並び替え」を選択して下さい。

 

上のような画面が出てきます。

 

そこで右上の「先頭行をデータの見出しとして使用する」にチェックを入れ、OKを押します。

 

もし最優先されるキーの列のタブ(一番左側)が空欄の場合は薬品名を選択して下さい。

 

vba2-18-7昇順でソートされましたね。

 

vba2-18-8開発タブの記録終了をクリックします。

 

これで今行った一連の動作がコードで保存されています。それではコードを見てみましょう。

 

VBAの画面を開いて下さい。左側のプロジェクト画面に注目!

 

一番下に標準モジュールModule1というのがありますね。それをクリックすると右側に何やらコードが表示されています。

 

これが先ほどソートを行ったコードになります。実はこれを少し弄るだけでそのままシステムに使うことができるのです。

 

今回のように「この動作はどのようにコードを書けばいいのかな?」と思ったら、実際マクロで記録してみてそのコードを見てみて下さい。

 

これはすごく勉強になりますよ。

スポンサーリンク

記録したコードを使ってみよう

今回のコードは以下です。

Sub Macro1()

‘ Macro1 Macro


Range(“A1”).Select
ActiveWorkbook.Worksheets(“Sheet1”).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(“Sheet1”).Sort.SortFields.Add Key:=Range(“A2:A8”), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets(“Sheet1”).Sort
.SetRange Range(“A1:N8”)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub

 

まずコメントアウトについて説明します。


‘ Macro1 Macro

この部分色変わってますよね?これはコメントアウトと言いまして、コードの先頭に「’」を付けるとコメント扱いになる、というものになります。

 

コメントアウトは以下のような時に使います。

  • コードに解説を加える(今回なら「ソートするコード」みたいに)
  • 完成するまで実行してほしくないコードがある場合

「’」を付けて一時的にコメントアウトし、完成時に外すみたいな使い方ができます。

 

では実際のコードをみてみましょう。

Range(“A1”).Select

A1セルを選択(クリック)する。

 

これは削除してOKです。最初にA1セルをクリックしてソートしましたが、今回はデータが入力されているA1~A8セルならどこでもOKです。ですから削除してしまいましょう。

 

ActiveWorkbook.Worksheets(“医薬品マスタ”).Sort.SortFields.Clear

ワークシート医薬品マスタのSortFieldsをクリアする。これはソート前に行う儀式のようなものです。前にどのような条件でソートしたかをクリアする(初期化)ために行います。

 

ActiveWorkbook.Worksheets(“医薬品マスタ”).Sort.SortFields.Add Key: =Range(“A2:A8”), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

前半の

Sort.SortFields.Add Key:=Range(“A2:A8”),

これはどの列で並び替えを行うかを指定しています。

 

Range(“A2:A8”)

この書き方は初めて見ましたね。これはA2~A6セルという意味です。複数の隣接したセルを一括して指定する時に使用します。

 

でも今回はこのように書く必要はありません。今回はA列つまり薬品名のみでソートをかけます。

 

薬品名はどのセルに書いてありますか?A1セルですね。だからここはRange(“A1”)でOKです。

 

もし一般名で並び替えるならRange(“B1”)にしてあげるだけ。見出しのセルを書くと思って頂ければいいでしょう。

 

次の

「_ 」(スペース+アンダーバー)

これは次の行に続くという意味です。コードも長くなると画面に表示しきれない事があります。そんな時には上記を使用して次の行に繋げる事ができます。

 

SortOn:=xlSortOnValues,

これはValueでソートする。Valueは値、つまりセルの値で並び替えるという意味です。これは省略してもOKです。なぜなら省略した場合はセルの値で並び替えると認識されるからです。

 

Order:=xlAscending,

Ascendingは日本語で上昇という意味。ここでは昇順(123 abc あいうえお)で並び替えるという意味。ちなみに降順にしたいなら「xlDescending」になります。

 

DataOption:=xlSortNormal

直訳すると「普通に並び替える」。詳しく言うと「数値と文字データを別々に並び替える」。当たり前の事なのでこれも省略、つまり削除してもOK。

 

もう少しです!頑張りましょう。

With ActiveWorkbook.Worksheets(“医薬品マスタ”).Sort

With構文は省略でしたね。「アクティブなワークブックの中にある、ワークシート医薬品マスタをソートする。」これだとちょっとまずいですね。

 

次の行で.SetRange Range(“A1:N8”)ってありますよね。セルを指定しています。セルを指定する場合はワークシートをアクティブ(一番手前に表示)にする必要があるんですね。

 

上のコードだとワークシート医薬品マスタはまだアクティブになっていません。そこで、このように書けばいいでしょう。

 

Worksheets(“医薬品マスタ”).activate
Worksheets(“医薬品マスタ”).Sort

これに書き換えちゃいましょう。

 

.SetRange Range(“A1:N8”)

Rangeはセルです。並び替えを行うセルの範囲はA1~N8セルとする。でもこれって今回はA1~A8ですが、今後登録される薬の数によって変わりますよね。

 

ではどうしたらいいか。この前お話した、CurrentRegionを使えばいいのがわかりますか?

.SetRange Range(“A1”).CurrentRegion

と書き換えます。こうすれば薬がいくつ登録されても対応できますね。

 

.Header = xlYes

先頭が見出しかどうか。当然yesです。

 

.MatchCase = False

(アルファベットの)大文字と小文字を区別するという意味。これは基本False(区別しない)に設定します。ほぼ無視していい項目です。つまり削除できます。

 

.Orientation = xlTopToBottom

並び替えの方向です。「トップからボトムへ」、文字通り「上から下へ」という 意味。

 

.SortMethod = xlPinYin

「並び替えの方法はふりがなを使う」。読み方も並び替えに反映させますという意味です。基本はそうですよね。よってこちらも省略可能です。

 

ちなみに反映させない場合は「xlStroke」となります。

 

.Apply

適用する(上記の条件で並び替えを行う)という意味です。

 

色々手を加えた結果…

vba2-18-10上のようにすっきりしたコードになりました。

 

vba2-18-11ではこれをコピーします。

 

vba2-18-12医薬品新規登録画面で入力したデータをワークシートへ転記するコードの下に貼り付けましょう。

 

これでデータを登録する度に、薬品名の昇順で並び替えが行われます。実際に入力して確かめてみましょう。

 

今回はちょっと長かったですね。お疲れ様でした。

 

新規登録画面は次の講座で一旦完成となります。入力後の処理を行うコードについて解説します。

>>Excel VBA講座 目次はこちら