
これまでの学習でVBAの基礎的な書き方を紹介してきました。
なので、今まで学習したことを組み合わせれば、簡単な処理なら作れるようになっています。
今回は、さらに一歩踏み込んで「関数」というものについて紹介していくのですが、これが結構難しいのです。
突き詰めていけばかなり難解で難しくなっていくので、ここで紹介するのは、意味と基本的な使い方についてです。
とは言っても、基本的な使い方さえマスターしておけば、関数についてはこれ以上知識は必要ないと思います。
関数はプログラミングをするうえで欠かせない存在なので、ここで詳しく解説していきます。
目次
関数について知ろう!
関数ってなに?
VBAなどの多くのプログラミング言語には「関数」という機能が備わっています。
関数は一言で言ってしまえば、「処理の塊」です。
「処理の塊」というのは、処理が始まって、結果が出力されるまでの一連の流れがまとまったものです。
関数は「Sub」や「Function」がありますが、これまで例として作ってきたマクロ達も「Sub」を使った関数です。
以前、Subについてはこちらの記事でも簡単に紹介しました↓
マクロって、VBAで作成した特定の処理(関数)を実行させてるんでしたね。
■ここまでのまとめ
・関数とは「処理の塊」!
・マクロで呼び出しているものは関数
関数は何に使うの?
関数はただマクロで実行させる為だけにあるわけではありません。
関数にはもっと効果的な働きがあるのです。
それは、処理の「共通化」です。
共通化?…ちょっと難しいですね。
かみ砕いていうと、例えばコードの中に、同じ処理の塊が何個も何個も書かれていると、コード自体が長くなって見返すのも大変だし、想定外なバグの原因にもなります。
また、コードを修正する必要が出た時、それぞれ直さないといけないのでとても手間になります。
そんな時、関数を使って処理を書きだしておけば、後はその関数を使いたい場所から呼び出せば一元管理することが出来ます。
こんなイメージ↓
プログラミングをする上で「コードの可視性」というのがとても大事になります。
可視性というのは、読みやすさの事です。
こんな感じで、同じ処理を関数にしてひとまとめにして処理したいところで関数を呼び出すようにすれば、コードの管理がしやすく、可視性も高くなります。
■ここまでのまとめ
・関数は処理をまとめてコードを読みやすくするために使う
・関数に処理をまとめる事でコードの修正が楽チンになる
関数を使ってみよう!
関数の書き方
ではさっそく関数を使っていきましょう。
関数は、今までとは違って、モジュールの一番外側(関数の中に関数は作りません)のまっさらな部分に作成します。
まずは関数を「Sub」で作ってみます。
書き方は下のようにします↓
関数を呼ぶ場合は下のようにします↓
実際にコードを書いてみよう!
まずは、A2セルの文字を所得してメッセージで文字を表示させる簡単な関数を別の関数から呼び出してみます。
下のコードをコピーしてモジュールに貼り付けてください。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub MessageTest() Call OpenMessage End Sub 'メッセージを開く処理 Sub OpenMessage() Dim Moji As String Moji = Range("A2").Value MsgBox Moji End Sub |
関数「MessageTest」を呼び出すとこんな感じになります↓
関数「MessageTest」の中で関数「OpenMessage」の処理が呼び出されてるのが分かりますね。
引数について
引数ってなに?
関数の力はこれだけではありません。
関数は「処理をまとめた塊」だと紹介してきました。
この処理の塊に処理させたい値を渡してあげることもできます。
そうすることによって、渡ってきた値を元に処理を行って結果を表示させることが出来ます。
以前も作ったことはありますが、A2セルにじゃんけんの手を入力すると勝つ手をメッセージで表示させる処理で考えてみます。
関数①で、A2セルのじゃんけんの手を取得します。
取得したじゃんけんの手を関数②に渡します。
関数②で渡された手に勝つ手をメッセージで表示させます。
この、「渡されたじゃんけんの手」の値を引数と言います。
引数次第では、関数②で表示させる結果が変わりますよね?
このように、条件を指定してそれに応じて出力結果を変えたいときに引数を使う事が多いです。
引数あり変数の使い方
実際にじゃんけんの手を引数で取得してメッセージで勝ち手を表示させる処理がこちら↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub MessageTest() Dim Moji As String Moji = Range("A2").Value Call OpenMessage(Moji) End Sub 'メッセージを開く処理 Sub OpenMessage(hand As String) If hand = "グー" Then MsgBox "パー" ElseIf hand = "チョキ" Then MsgBox "グー" Else MsgBox "チョキ" End If End Sub |
関数「OpenMessage」の()になにやら文章が書いてあります。
これは、渡された引数を入れておく変数です。
そして、関数「MessageTest」の処理の中で関数「OpenMessage」を呼び出していますが、さっきとは違い()が右側について中に何やら書いています。
()に入っているのは、関数「OpenMessage」に渡したい値です。
このように記述することで、引数を受け渡すことが出来ます。
■引数ありの関数の書き方
■引数ありの関数の呼び出し方
■ここまでのまとめ
・引数は関数に受け渡したい値
もう一つの関数「Function」について
FunctionってSubと何が違うの?
実は関数を作る方法は「Sub」の他に「Function」というものがあります。
FunctionもSubと出来る事と使い方はさして違いありませんが、2つ違う点があります。
1つは、Functionで作られた関数はマクロとして呼び出すことが出来ません。
下の画像ではSubで作った関数「KansuA」「KansuB」と、Functionで作った関数「KansuC」があります。
ですが、マクロの登録画面にはFunctionで作った「KansuC」が表示されていません。
んじゃあ、全部Subで作ればいいんじゃない?って思いますよね笑
でも、Functionにも役割があります。
それが2つ目の違い、「戻り値を渡せる」です。
戻り値ってなに?
さっき、引数について紹介しましたね。
今度はその逆です。
戻り値は、呼び出された関数から呼び出し元に受け渡す値の事です。
Functionで作られた関数は、この「戻り値」を受け渡すことが出来ます。
関数は「処理の塊」で、時には処理させた結果が欲しい場合があると思います。
そんな時に戻り値が役に立ちます。
Functionの書き方
■戻り値を返す関数の書き方
■戻り値を返す関数の呼び方
またじゃんけんの処理を例にコードを考えてみます。
さっきは、呼び出した関数の中で勝つ手をメッセージを表示させていましたが、今回はメッセージを表示させるのではなく、呼び出し元に勝つ手を送るようにしてみます。
そして、送られた手を呼び出し元の関数でメッセージ出力させます。
これが手を加えたコードです↓
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 |
Sub MessageTest() Dim Moji As String Moji = Range("A2").Value MsgBox OpenMessage(Moji) End Sub Function OpenMessage(hand As String) As String Dim WinHand As String If hand = "グー" Then WinHand = "パー" ElseIf hand = "チョキ" Then WinHand = "グー" Else WinHand = "チョキ" End If OpenMessage = WinHand End Function |
関数「OpenMessage」で、引数で渡ってきたじゃんけんの手の勝ち手を変数「WinHand」に入れています。
最後に、関数「OpenMessage」に変数「WinHand」を代入しています。←戻り値のセット
そして、呼び出し元の「MessageTest()」のMsgBoxに関数「OpenMessage」の戻り値が代入される事で、メッセ―ジで勝ち手が表示されます。
■ここまでのまとめ
・Function関数は戻り値を受け渡せる
・Function関数はマクロとして登録できない
まとめ
結局説明が長くなってしまいました。
引数やら、戻り値やら、覚えることがたくさんあってしかも複雑ですね涙
ですが、関数はプログラミンをするうえで切っても切れない存在なので、実際にコードを書いたりしてしっかり理解を深めましょう!
■次のページ