マクロの部品化(Sub は Subroutine の略なのです)

 前回までに「いつ」シートに関するコードを完成させました:

 Sub 並べ替え()
  With Worksheets("いつ").Sort
    .SortFields.Clear
    .SortFields.Add Key:=Range("B2"), SortOn _
    :=xlSortOnValues, Order:=xlAscending
    .SetRange Range("B2:C6")
    .Apply
  End With
  ・・・・・・・・・

 以下は「いつ」のところが「どこ」「誰」「何をした」に変わるだけで、同じコードの繰り返しですから、それを3つ並べればマクロとしてきちんと機能します。しかし美しいマクロを完成させるためには、この繰返しはなるべく避けたいところです。そこで今回は マクロを部品化 ということを考えてみます。
 

Sub は Subroutine です

 以前にも少し触れましたが、マクロの冒頭に必ず記述される Sub とは Subroutine (サブルーチン)のことです。つまり Sub と End Sub で囲まれている部分は、他のマクロ(親マクロと呼びます)から呼び出すことができるのです。皆さんはマクロ名のあとに付けられている () を見て「何でこんな空白の () が必要なんだろう?」と疑問に感じたことはありませんか? 実はここに引数を入れて Subroutine を使うことができるのです。上の例でいえば、

With Worksheets("いつ").Sort

の中の「いつ」というところを引数として指定できるように変えてみます。 sheet の略号であるという意味を込めて引数を st としてみましょう。

With Worksheets(st As Integer).Sort

 この As Integer という部分は「ここに整数を入れます」という意味の変数のデータ型宣言です。データ型宣言に関してはもう少し先で詳しく扱うので、今はあまり気にしないでください。ここには 1, 2, 3, 4 という 4 つの数字が入ることを想定しています。この数字によって Worksheets コレクション( Excelの左下にあるシートの並んでいるところ)の左から何番目という形で Worksheet オブジェクトを参照できます。たとえば、

With Worksheets(3).Sort

という記述であれば、左から 3 番目のシートの Sort オブジェクトを取得するという記述になります。
 

マクロの呼び出し

 このように引数付きでマクロを呼び出す方法はとても簡単です。新しいマクロ(親マクロ)を作って、その中に部品として用いるマクロと引数を並べるだけです。いきなりですがマクロの全文を書いてみます。新しいマクロ名を「いつどこげーむ()」としましょう。

  Sub いつどこゲーム()

   並び替え 1
   並び替え 2
   並び替え 3
   並び替え 4

  End Sub

  Sub 並び替え(st As Integer)

  With Worksheets(st).Sort
   .SortFields.Clear
   .SortFields.Add Key:=Range("B2"), SortOn _
   :=xlSortOnValues, Order:=xlAscending
   .SetRange Range("B2:C6")
   .Apply
  End With

  End Sub

 こんなふうになります。こうするとまず引数 1 で並べ替えマクロが実行され、その次には引数 2 で、その次は引数 3 でといった具合に次々と繰り返しマクロが実行されていきます。マクロ記録ではあれほど長かったコードが見事に美しくまとまりましたね。次回は SetRange メソッドの引数を少しいじってみます。

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

コメントをどうぞ

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

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