[VBA] Sub はサブルーチンのことです

VBE の置換機能でいらない記述を一斉に消します

 前回と同じように「開発」→「マクロ」→「編集」で VBE(Visual Basic Editor)を開きます。まずここで1つだけ作業をしておきます。コードウィンドウには次のような記述があると思います。

 ActiveWorkbook.Worksheets("いつ").Sort.SortFields.Clear

 冒頭に ActiveWorkbook. と添えることで、現在アクティブになっているワークブックに対する命令文になっています。今のところブックは1つしか使いませんので特に指定する必要はありません。そこでマクロの中に大量に含まれている ActiveWorkbook. を取り払ってすっきりさせましょう。

 通常のエクセルと同様に、VBE にも「置換」という機能が用意されています。まず編集中のマクロの中から ActiveWorkbook. という単語をコピーしておきます。最後の "." の部分を含めておくのを忘れないようにしてください。そして上のメニューから「編集」→「置換」を選択すると、次のようなダイアログが表示されます。

VBA置換ダイアログ

 「検索する文字列」の中にコピーした文字がそのまま入っているはずです。「置換後の文字列」は空白のままにして、右側の「すべて置換」というボタンをクリックします。これでマクロの中にある ActiveWorkbook. という文字列が全て削除されます。
 

オブジェクトとメソッド

 もう少しだけ整理しておきましょう。冒頭から最後まで眺めていくと、

 Sheets("いつ").Select
 Range("B2").Select
 ・・・・・・・・・
 Sheets("どこ").Select
 Range("B2").Select
 ・・・・・・・・・
 Sheets("誰").Select
 Range("B2").Select
 ・・・・・・・・・
 Sheets("何をした").Select
 Range("B2").Select
 ・・・・・・・・・

 このような記述が見られると思いますが、これも全て削ってしまいましょう。
「何か大事そうなコードだけど、本当に削っていいの?」と思われるかもしれませんが、結論からいうと削っていいのです。でも初めて登場するオブジェクトなので、せっかくですから説明してから消えてもらいます。
 英語の object とは「物体」を意味するやや抽象的な言葉ですが、VBA におけるオブジェクトは普段から感覚的にモノのように扱っているセルやワークシートを指します。
 皆さんがふだんワークシート上でセルをクリックして削除したり、移動させたりする操作は「セルというオブジェクト」に対して「消えなさい」とか「こっちに移動してね」と命令しているわけです。今の場合、Range("B2") がオブジェクトで、ワークシート上の「セルB2」を示しています。

 一方で Select はメソッドという種類の命令文です。Range("B2").Select は「セルB2を選択しなさい」という命令文になります。「うーん。聞けば聞くほど大切なコードな気がするよ。本当に消してしまっていいのかなー」と思うかもしれませんが、実のところまったく余計なコードなのです。ワークシートでセルをクリックするという行為は、人間が操作するうえでは必須ですが、プログラムでは必ずしも必要ありません。少し先取りになりますが、Range("B2") は並べ替えのときに key としてどのみち指定し直さなくてはなりません。なので Range("B2").Select を残しておくと指定が重複してしまいます。マクロ記録ではこういう2度手間がたくさんあります。なのですっきりしたコードに作り替えたいときは、「眼力(?)」によって、こういう無駄な記述を見つけて省いていく作業が必要になるのです。皆さんも VBA を勉強しながらこの「眼力」を養ってくださいな。
  

Sub はサブルーチンのことです

 さあこれで大幅なダイエットに成功です!
 これでコードもかなりスリムになりました。
 マクロの全文は次のような記述になっているはずです。

 Sub 並び替え()
 '並べ替え Macro

  Worksheets("いつ").Sort.SortFields.Clear
  Worksheets("いつ").Sort.SortFields.Add Key:=Range("B2"), SortOn _
    :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  With Worksheets("いつ").Sort
    .SetRange Range("B2:C6")
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
  End With

  Worksheets("どこ").Sort.SortFields.Clear
  Worksheets("どこ").Sort.SortFields.Add Key:=Range("B2"), SortOn _
    :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  With Worksheets("どこ").Sort
    .SetRange Range("B2:C6")
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
  End With

  Worksheets("誰").Sort.SortFields.Clear
  Worksheets("誰").Sort.SortFields.Add Key:=Range("B2"), SortOn _
    :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  With Worksheets("誰").Sort
    .SetRange Range("B2:C6")
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
  End With

  Worksheets("何をした").Sort.SortFields.Clear
  Worksheets("何をした").Sort.SortFields.Add Key:=Range("B2"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  With Worksheets("何をした").Sort
    .SetRange Range("B2:C6")
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
  End With

End Sub

 コードの冒頭に Sub ~ () 、末尾に End Sub という記述がありますね。このステートメントは「ここに一連のプログラムが記載されていますよ」ということをコンピューターに伝える役目を果たしている最も大切な部分なのです。マクロ記録であれば自動で挿入されますし、1から VBA を記述する場合は、この記述は必ず書いておかなければなりません。「~」はマクロの名前が入ります。今は「並び替え」となっています。
 Sub とはサブルーチンのことです。 Sub ~ () と End Sub に囲まれたマクロは別のマクロで呼び出して使えるので、あえてこのような名前がついているのです。

 「' 並べ替え Macro 」という部分はただのコメント文です。' という記号をつけておくと、「この部分はプログラムとなーんにも関係ありませんよ」ということをコンピューターに伝えます。コードの意味を自分で覚えておくため、或いは他の人にマクロを読んでもらうときのためのメモ帳として使います。

 さて、マクロ全体を眺めていると、何か同じような文の繰り返しであることに気づきますね。それはそうです。マクロを記録したときの手順を思い出してください。「いつ」シートを選択してデータを昇順に並べ替え、次は「どこ」シートを選択してデータを昇順に並べ替え、ということを繰り返していたのですから。そうすると、この一見やたらと長く見えるコードの集合も実質的には全体の 4 分の 1 について意味を理解すれば良いことになります。次回は「いつ」シートの操作に関わる部分だけを抜き出して、コードの意味を解説し、よりすっきりした形に修正したいと思います。

スポンサードリンク
末尾大型広告
末尾大型広告

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)