関数について学ぼう
久々の更新です。
今回は「関数」について説明していきます。
「関数」は数学でも出てきますが、プログラミングで使われる関数は、プログラムを構成するパーツのようなものです。関数にも大きく分けて二種類あり、「組み込み関数」と「自作関数」に分けることができます。
プログラミングにおける関数とは、プログラム全体で何度も使われる処理を部品化して呼び出せるようにすることで、無駄な記述を減らしたり、可読性を向上させたり、保守性を改善したりします。
組み込み関数は、元々言語仕様として提供されているパーツです。VBScriptで言えば、msgboxは組み込み関数です。引数として文字列を渡してmsgbox関数を呼び出してあげることで、”メッセージボックスを表示する”処理が動きます。他にもいろんな組み込み関数が用意されており、やりたい処理に対応した関数を都度探して全体のプログラムを作っていきます。
自作関数は、何度も実行する可能性のあり、組み込み関数で用意されていなかったり、組み込み関数の機能では足りない場合に作ります。今回紹介するのはこの自作関数の作り方です。
この関数を上手く活用できるようになると、プログラミングの初心者から卒業出来るのではないでしょうか。
Option Explicit Dim InputVal InputVal = Inputbox("はじめましてと入力してください。") If InputVal = "はじめまして" Then msgbox "上手に入力できましたね。" Else msgbox "上手く入力できませんでしたね。" End If
前回の説明で使ったプログラムは上記ですね。
この処理では自作関数は使っておりません。インプットボックスにメッセージを渡してメッセージボックスを表示させる部分を自作関数化し、それを呼び出す処理に変えてみましょう。
↓こんな感じです。
Option Explicit Call CallMessageBox("はじめましてと入力してください。") Sub CallMessageBox(InpMsg) Dim InputVal InputVal = Inputbox(InpMsg) If InputVal = "はじめまして" Then msgbox "上手に入力できましたね。" Else msgbox "上手く入力できませんでしたね。" End If End Sub
書き方は変わりましたが、最初に記載した前回のプログラムと実行時の動きはまったく同じです。今回のプログラムも1行ずつ解説していきます。後、今回から読みやすくなるようにインデントも付けるようにします。インデントとは、プログラムを見やすくする為に字下げをすることを言います。VBScriptでは、インデントを付けなくてもプログラムの実行には影響はありませんが、構造の深さをインデントで表すことでプログラムが格段に理解し易くなるので適切なインデントを設定するように心がけてもらえると良いかと思います。
1行目 ←前回説明した変数の強制宣言です。
2行目
Call CallMessageBox("はじめましてと入力してください。")
最初の Call は自作関数を呼ぶ命令文です。その後に記載されているCallMessageBoxは自作関数の関数名です。その後ろに括弧で括って、さらにダブルクォーテーションで括った文字列をCallMessageBox関数に渡しています。
3行目
Sub CallMessageBox(InpMsg)
ここからが自作関数の作成処理に入ります。
まず、Sub という言葉から始まっています。これは、これから関数を作りますよいう宣言のようなものです。尚、関数の作成では、Subから始める場合と、Functionから始める場合があります。厳密な意味での関数はSubでは無く、Functionの方がより適切です。細かい違いはまた後日説明しますが、言葉の厳密な意味としては、Function=「関数」、Sub=「サブルーチン」と認識しておいてください。当サイトではわかりやすいようにいったん「関数」という言葉で統一しておきます。
Subの場合の構文としては以下です。
Sub 自作関数名(関数の引数)
この関数の引数については、引数を使わないプログラムも作れます。その場合、上記の括弧は以下のようになります。
Sub 自作関数名()
尚、この関数はSubから始まって、プログラムの一番最後にEnd Subを付けて終わります。SubからEnd Subまでが一つのプログラムという構造です。
あと、引数(ひきすう)という言葉も以前に説明したかも知れませんが、補足しておきます。
引数というのは、プログラムを実行する際、そのプログラムに対して条件付けた指示をする為のパラメーターのようなものです。
例えばMsgBox関数も関数の仲間なので、それを例にすると、MsgBox関数はメッセージボックスを画面に表示します。その際に、もし引数が渡せなければ、表示させるメッセージを自由に指定することが出来なくなり、とっても不便になります。MsgBox関数とは、MsgBoxというプログラムの塊に対して、表示させるメッセージの指示を引数に含めて実行するプログラムの部品と言えます。
4行目~5行目
Dim InputVal InputVal = Inputbox(InpMsg)
まず4行目では変数を宣言しています。この変数は自作関数のなかで宣言されているので、この自作関数のSub ~から、最後のEnd Subまでの間でだけ有効な変数です。例えば1行目や2行目は、関数CallMessageBoxの外側の処理になるので、1行目や2行目の位置で変数InputValを使おうとしてもエラーになります。
また5行目ではInputBoxの引数として、自作関数CallMessageBoxの引数を渡しています。もう少し簡単に説明すると、3行目で関数の名称と引数の名称を定義しています。引数の名称というのは、3行目の括弧で囲われているInpMsgです。関数の名称とともに最初に宣言した引数の名称は、その関数の処理の最初のSub ~から最後のEnd Subの間では、Dimで宣言した変数と同じように扱えます。
このCallMessageBox関数では、2行目で関数を呼び出す際に、引数に”はじめましてと入力してください。”という文字列をセットしています。
2行目でCallされてこの関数が呼ばれると、次は3行目以降のCallMessageBox関数の処理が実行されます。このCallMessageBox関数内のプログラムでは、3行目で定義した引数InpMsgに対して、”はじめましてと入力してください。”という文字列が渡されてきます。この引数InpMsgはCallMessageBox内の処理では変数のように使用出来る為、5行目でInputBoxに対してInpMsgという名称のまま、引数を渡しています。
11行目
End Subは3行目の説明書きでも記載していますが、Subで始まったプログラムの終了位置を定義しています。
Subで始まったプログラムには必ずEnd Subを付けなければならず、付けていないままプログラムを実行するとエラーなります。
関数の作成第一弾についての説明は以上です。理解出来ましたでしょうか?
例えば自作関数は一切作らなくてもプログラムは作れます。プログラムの全行が100行以内に納まるような簡易的なプログラムコードであれば、自作関数が存在しないプログラムでも問題は無いでしょう。ただ、ある程度の行数のあるプログラムを作る場合は、似たような処理を何度か記述しないといけなくなる場合もあり、非常に手間です。また、その何度も実行されるプログラムの一部に不具合があったことが判明した場合、似たような処理が記述されている個所を全てチェックして、一つずつ修正していく作業が必要になります。
もし何度も実行される場合のある処理を自作関数化してあった場合は、似たような処理を何度も記述する必要はなく、その処理を使いたいときにCallして関数名を指定するだけです。そういうプログラムの作り方だと処理の記述がシンプルになり行数も削減でき、非常に可読性が改善します。
プログラミングをやるうえで非常に有名な言葉があります。
車輪の再発明
https://ja.wikipedia.org/wiki/車輪の再発明
簡単に言えば、過去に苦労して作ったものを、後からまた一から作り出す様を皮肉った言葉ですが、プログラミングの世界でも車輪の再発明は悪です。過去に作った処理は、より汎用的な処理に直したうえで、一つの関数として作り、以降はその処理が必要になった場合は、処理を一から考えて再作成するのではなく、その関数を呼び出すだけで良い仕組みを作ります。
システム開発会社だとかは、過去の開発作業で蓄積してきたそういう関数群を自社フレームワークとしてツール化し、社内全員で使用して作業効率を高めます。そのような自社内で作ったフレームワークもあれば、プログラミング言語単位で、より使いやすくして大勢の人に使ってもらう為に有志が開発して公開しているフレームワークなんかもたくさんあります。
今回の関数というプログラミングの仕組みは、プログラミングにおける「部品化」と言える作業であり、プログラミングのスキルアップをしていくうえで非常に重要な知識になります。
是非習得して頂きたいです。
次回は、関数の「戻り値」について説明していきます。
今回もありがとうございました。引き続きよろしくお願い致します。
↓次回の記事はこちら
↓前回の記事はこちら
↓Windows10環境で文字化けする場合はこちら
Windows10のメモ帳の既定の文字コードは、Windows10のバージョン1903から「UTF-8」になりました。
VBScriptはUTF-8に対応していない為、アルファベットは問題ないのですが、日本語については文字化けします。
その為、Windows10の場合はファイルを保存する場合に、文字コードを「ANSI」に変更して保存してください。