Excel VBA(マクロ)を使うと、コードを分割したくなることがあります。
特に様々な Excel ツールで共通して使うような部分があると、そこだけは分けておきたいと感じます。
さて、そのようなときに Call ステートメントを使うと便利です。
今日は Call ステートメントの使い方についてお話しします。
1、Call ステートメントの使い方
Call ステートメントの使い方
Call ステートメントはプロシージャを呼び出すのに使います。
以下のように記述します。
プロシージャとは VBA コードのかたまりで、1 つのプロシージャで1 つの役割を持っているイメージです。
プロシージャには、Sub プロシージャと Function プロシージャの2種類があります。
・・・Sub 〜 End Sub で囲まれる範囲
Function プロシージャ
・・・Function 〜 End Function で囲まれる範囲
Call ステートメントを使った一例 ①
Call ステートメントでSub プロシージャを呼び出すを呼び出す簡単な例を取り上げます。
1つのモジュールの中に Test1、Test2 の2つのプロシージャを作ります。
1 2 3 4 5 6 7 8 9 10 11 |
Sub Test1() MsgBox "おはようございます。" Call Test2 End Sub Sub Test2() MsgBox "こんにちは。" End Sub |
Test1 プロシージャを実行すると 2つのメッセージボックスが続けて出てきます。
最初に Test1 プロシージャの中で「おはようございます。」と表示させてから、Test2 プロシージャを呼び出しています。
Test2 プロシージャには「こんにちは。」というメッセージを表示させるだけの役割を持たせてあります。
Call ステートメントを使った一例 ②
さて、もう1つ例を示しておきますね。
次の Excel シートに入力された売上高と売上原価から原価率と利益率を計算して表示して、CSV ファイルに書き出すコードを取り上げます。
以下のようなコードを作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
Sub Calc() Dim Uriage As Double '売上高の年間合計' Dim Urigen As Double '売上原価の年間合計' Dim Genkaritsu As Double '原価率' Dim Riekiritsu As Double '利益率' Uriage = 0 Urigen = 0 '12ヶ月分の売上高、売上原価から原価率、利益率を計算' For i = 1 To 12 Uriage = Uriage + Cells(i + 4, 4) Urigen = Urigen + Cells(i + 4, 5) Genkaritsu = Application.Round(Urigen / Uriage, 3) '原価率の計算' Riekiritsu = 1 - Genkaritsu Cells(i + 4, 6) = Genkaritsu Cells(i + 4, 7) = Riekiritsu Next i Call Transform_to_Csv End Sub Sub Transform_to_Csv() Dim CsvFile As String Dim Book_Name As String Application.DisplayAlerts = False CsvFile = ThisWorkbook.Path & "\出力ファイル.csv" If Dir(CsvFile) = "" Then MsgBox "「出力ファイル.csv」が存在しません。" CSV_flag = 1 GoTo Label1 Else End If Workbooks.Open (CsvFile) Book_Name = ActiveWorkbook.Name ThisWorkbook.Worksheets("原価率・利益率").Range("A1:ZZ1000").Copy ActiveSheet.Range("A1:ZZ1000") Workbooks(Book_Name).Close SaveChanges:=True Application.DisplayAlerts = True Label1: End Sub |
Calc プロシージャを実行すると、原価率、利益率の計算が行われて同じフォルダの中にある CSVファイルに書き込まれます。
原価率、利益率の計算↓
CSVファイルへの書き込み ↓
Calc プロシージャの中で Call ステートメントを使って「Transform_to_Csv」という名前の Sub プロシージャを呼び出して、シートの内容を「出力ファイル.csv」に書き出しています。
Transform_to_Csv プロシージャは同じフォルダ内の CSVファイル(出力ファイル.csv)を開いて書き出す役割を持っています。
CSV ファイルに書き出す操作は独立しているので、そこだけは別のプロシージャにしておくと分かりやすいのです。
2、共通化したい部分を保存しておくと便利
いくつもの Excel シート内部の VBA コードで出てくる部分を共通化しておくのも良いと思います。
例えば、先の例では Transform_to_Csv プロシージャは calc プロシージャの中で呼び出しています。
私は、この Transform_to_Csv プロシージャを、様々な Excel シート内部の VBA コードで使うこので、Evernote に保存してあります。
そうすれば、使いたくなったときに Transform_to_Csv プロシージャをまるまるコピペできますので。
3、まとめ
Call ステートメントを使うことで、プロシージャを呼び出せます。
様々な VBA コードで共通して使いたい部分は Evernote やメモ帳に保存して起き、必要なときには独立したプロシージャとしてコピペして、Call ステートメントで呼び出すと良いでしょう。
編集後記
昨日(2/28)は確定申告業務から一時的に抜け出し、商工会議所青年部の関係で市役所へ。
色々と有意義な話が聞けました。
そして、商工会関係のことでも色々勉強しといた方がいいかもなぁ! って感じたこともありました。