EXCEL VBA Call の使い方 (サブルーチンの活用・プロシージャの連携)
EXCEL VBA Call の使い方 (サブルーチンの活用)
●はじめに
ここでは、Callの使い方を説明いたします。Callの使い方の例として、下図を参照して下さい。メインプログラムからサブプログラムへ処理を一時的に実行させる時に、Callを使用します。図の通りにメインプログラムがあり、処理の中でサブプログラムA・Bと順番に実行させる時などに使用します。サブプログラムについては、メインプログラムに同じプログラムを何回も記入するとメインプログラムが長くなったりしまうので、サブプログラムを利用しながらメインプログラムを整理しつつプログラムを作成します。
●それでは、コードを使ってCallの説明をいたします。
●メインプログラムとサブプログラムAとサブプログラムBがあります。メインプログラムは、プログラム全体の制御部分になっていて、品名・単価・数量を入力します。サブプログラムAは、単価×数量の計算を行い結果を合計に代入します。サブプログラムは、計算結果をメッセージボックスで表示します。
●プログラム説明 (Call)
下表は、メインプログラムとサブプログラムへ引数の引継ぎ状況をあらわす表です。引数を使うことで、メインプログラムとサブプログラム間のデータを引き継ぐ事ができます。
変数 | メインプログラム 引数の値 | サブプログラムA 引数の値 | サブプログラムB 引数の値 |
---|---|---|---|
Tanka (long:数値) | 98,000 | 98,000 | |
Kazu(Long:数値) | 5 | 5 | |
Gokei(Long:数値) | 490,000 | 490,000 | |
Hinmei (String:文字列) | ノートパソコン | ノートパソコン |
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 |
Sub Sub_main() 'メインプログラム Dim Tanka, Kazu, Gokei As Long Dim Hinmei As String Hinmei = inputBox("品名を入力してください") Tanka = inputBox("単価を入力してください") Kazu = inputBox("数量を入力してください") Call Sub_A(Tanka, Kazu, Gokei) Call Sub_B(Hinmei, Gokei) End Sub '--------------------------------------------------------------------------- Sub Sub_A(Tanka, Kazu, Gokei) 'サブプログラム A Gokei = Tanka * Kazu '------単価×数量の計算 End Sub '--------------------------------------------------------------------------- Sub Sub_B(Hinmei, Gokei) 'サブプログラム B MsgBox Hinmei & "の合計金額は、" & Gokei & "円です。" '-----品名の合計結果を表示" End Sub |
●実行結果 ※Callを使って、サブプログラムを実行しました。
プロシージャの連携 (親プロシージャ ⇔ 子プロシージャ) サブルーチンの活用方法
●プログラム説明 (プロシージャの連携)
下記のサンプルプログラムは、Subプロシージャを複数のプロシージャから呼び出して実行するサンプルプログラムです。具体的な処理内容としては、ワークシートに表の元となるデータが登録されていて、これを子のプロシージャ【サブルーチン】として①表全体に罫線を引く②先頭行(見出し)罫線と背景色を塗りつぶす③最終行に罫線と背景色を塗りつぶす④表全体の罫線と背景色を削除しますからの構成で作成しております。メインのプロシージャから順番に①~④へ実行される形となります。
●親プロシージャ = メインプログラム
●子プロシージャ = サブルーチン
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 63 64 65 |
' '******** AKIRA55.COM ******* https://akira55.com/call/ ' Sub Main02() 'メインプログラム ワークシートの表に罫線を引き、見出しと合計行を背景色で塗りつぶす。 Dim Hani, sentou, saigo As String Hani = Range("A3").CurrentRegion.Address(False, False) 'セルA3から始まる表の範囲を取得(アドレス) keisen_zentai (Hani) '①サブルーチン「keisen_zentai」へ・・・表全体に罫線を引く sentou = Range("A3").CurrentRegion.Rows(1).Address(False, False) 'セルA3から始まる表の先頭行を取得(アドレス) keisen_sentou (sentou) '②サブルーチン「keisen_sentou」へ・・・先頭行(見出し)罫線と背景色を塗りつぶす。 saigo = Range("A3").CurrentRegion.Rows(Range("A3").CurrentRegion.Rows.Count).Address(False, False) 'セルA3から始まる最終行を取得(アドレス) keisen_saigo (saigo) '③サブルーチン「keisen_saigo」へ・・・最終行に罫線と背景色を塗りつぶす。 MsgBox "表に罫線が引かれ、背景色が塗りつぶされました。" keisen_del (Hani) '④サブルーチン「keisen_del」へ・・・ 表全体の罫線と背景色を削除します。 MsgBox "罫線と背景色か削除されました。" End Sub ’------------------------------------------------------- Sub keisen_zentai(Hani As String) '表全体に罫線を引く Range(Hani).Borders.LineStyle = xlContinuous '格子罫線を作成:細実線 End Sub ’------------------------------------------------------- Sub keisen_sentou(sentou As String) '先頭行(見出し)罫線と背景色を塗りつぶす。 With Range(sentou) .Borders(xlEdgeBottom).LineStyle = xlSlantDashDot '先頭行:斜め破線・罫線位置下 .Interior.ColorIndex = 17 End With End Sub ’------------------------------------------------------- Sub keisen_saigo(saigo As String) '最終行に罫線と背景色を塗りつぶす。 With Range(saigo) .Borders(xlEdgeTop).LineStyle = xlDouble '最終行(合計):二重線・罫線位置上 .Interior.ColorIndex = 15 End With End Sub ’------------------------------------------------------- Sub keisen_del(Hani As String) '表全体の罫線と背景色を削除します。 With Range(Hani) '表全体を指定します。 .Borders.LineStyle = xlLineStyleNone '罫線を削除(格子罫線) .Borders(xlDiagonalUp).LineStyle = xlLineStyleNone '罫線を削除(右上がり罫線) .Borders(xlDiagonalDown).LineStyle = xlLineStyleNone '罫線を削除(右下がり罫線) .Interior.ColorIndex = 0 '背景色を削除 End With End Sub ' ' ' |
●実行前~実行後 ※プログラム(メインプログラム)実行後、ワークシートの表に罫線を引き、見出しと合計行が塗りつぶされました。最後に、表全体の罫線と背景色が削除されました。このように、メインプログラムとサブルーチンを組み合わせてプログラムを作成すると、何度でも繰り返し処理が簡単に実行する事が出来たり、処理内容ごとにサブルーチン(サブプログラム)を作成する事で、メンテナンスもしやすくなるメリットがあります。
(画面クリックして拡大)
(画面クリックして拡大)
【参照:再帰呼び出し:サンプルプログラム】
最後まで、ご覧いただきまして誠に有難うございました。
以上でCall・プロシージャ連携の使い方でした。メインプログラムとサブプログラムなど使い分けて処理を行う時には、便利な機能になります。何度も同じプログラムを利用するときは、Callやプロシージャ連携で呼び出し効率よくプログラムを作成してください。
また、VBAに関するテクニックや便利な手法などをこのサイトに掲載していきますので、定期的に参照していただけると幸いです。
以上でCall・プロシージャ連携の使い方でした。メインプログラムとサブプログラムなど使い分けて処理を行う時には、便利な機能になります。何度も同じプログラムを利用するときは、Callやプロシージャ連携で呼び出し効率よくプログラムを作成してください。
また、VBAに関するテクニックや便利な手法などをこのサイトに掲載していきますので、定期的に参照していただけると幸いです。