Visual Basic 初級講座 |
Visual Basic 中学校 > 初級講座 >
第5回 メソッドと関数
今回のテーマは「メソッド」と「関数」です。VBのメソッドと関数はとても便利なものです。またちゃんとしたプログラムを作るのにメソッドや関数を使わないということはまず不可能です。学生時代 関数で苦労した人には嫌な気がするかも知れませんが、プログラムで言う関数とは数学で言う関数とは雰囲気が違います。まったく新しい物だと思って気分一新して下さい。
この回の要約 ・メソッドとは… ・関数とは… ・メソッド・関数のタイプ別呼び出し方 ・いくつかのメソッド・関数の使用方法。 ・メソッド・関数に関する基本用語。 |
「メソッド」と「関数」を説明する前に 言葉の整理をしておきます。後でもう少し詳しく説明しますが、メソッドと関数はほとんど同じ意味です。場面場面のニュアンスで使い分けられているだけです。
当サイトではVBの公式ヘルプであるMSDN Libraryの言葉遣いを参考におおよそ次のように「メソッド」と「関数」を使い分けています。
ここに書いてあることは現段階で理解する必要はありません。
■画像1:メソッドと関数
・すべての関数はメソッドでもあるが、すべてのメソッドが関数であるわけではない。
・値を返すメソッドを「関数」と呼ぶ場合がある。
・VB標準の特殊なクラス(Conversion, Strings, Informationなど)のメソッドは特に「関数」と呼ぶことが多い。
このように使い分けている方は多いと思いますが、あくまでも公式に言葉遣いが決まっているわけではないので、実際の会話や文章で使う際はニュアンスを汲(く)み取って使い分けてください。
2.メソッドとは…
ボタン(Button)を配置して次のようにプログラムしてみましょう。
Private Sub
Button1_Click(ByVal sender
As System.Object, ByVal
e As System.EventArgs)
Handles Button1.Click Dim K As Decimal K = 123.56 MsgBox(K) End Sub |
■リスト1
Decimal(デシマル)は小数をあらわす型でしたね。型については前回説明しましたがわからなくても気にしないで「まぁ小数ね」って感じで先へ進みましょう。わからないところにこだわっていてはなかなか前へ進めないものです。
さて、このプログラムを実行するとどうなるかはもう分かるでしょう。123.56と表示されます。
それでは、小数点以下を切り上げて表示させるにはどうしたらよいでしょうか? もちろん2行目のK = 123.56 を K = 124 と直してしまえばいいのですが、今回はここはこのままで小数点以下を切り上げる方法を探ります。答えは以下のようになります。
Private
Sub Button1_Click(ByVal
sender As System.Object,
ByVal e As System.EventArgs)
Handles Button1.Click Dim K As Decimal K = 123.56 MsgBox(Math.Ceiling(K)) End Sub |
■リスト2:小数点以下を切り捨てる
どうです? ちゃんと切り上げられるでしょう。もちろん、これは新たに追加した、Math.Ceiling( ) (読み方:Math = マス、Ceiling = セイリング)のおかげです。 Math.Ceilingメソッドはかっこのなかに入れた数字の小数点以下を切り上げた数字を返すわけです。ここでMathはクラスの名前で、Ceilingはそのメソッドの一つで す。
このような働きをするメソッドを特に「関数」とも呼びます。
もう少しはっきりさせると 関数とは かっこ の中に何か入れると それをもとに 何かを返す 働きをするメソッドといえます。
■画像2:関数の考え方
「何かを入れるとそれをもとに何かを返す」と今のCeilingメソッドの例に当てはめて言うと「123.56 をもとに124を返す。」ということになります。Ceilingメソッドがどのようにして切り上げを行っているのかはわかりませんが、我々にとって重要なのはMathクラスのCeilingメソッドを使えば 切り上げができるということなのです。
このように、メソッド・関数を使う際には、中身ではなく結果だけを気にすればよいと言うことは重要です。
さぁ、VBにはこのようにいろいろと機能してくれるクラスとそのメソッドがたくさん用意されています。このメソッドたちのおかげであなたは面倒くさいプログラムから解放されるのです。切り上げをするプログラムを自分で書くなんてことを想像してみてください! メソッドを使いこなして快適なプログラミングライフを送りましょう。
3.メソッドの基本用語
メソッドはかっこの中に数字(ときには文字など)を入れて使う場合が多いです。このかっこの中に入れる数字を「引数」(ひきすう)と言います。また、メソッドは上記Ceilingのように結果として値を返すことがあります。この帰ってくる値のことを「返り値」 (かえりち)、「戻り値」(もどりち)などと言います。戻り値は K = Fix(123.56) のように変数で待ちかまえて受け取るのが一般的です。なお、関数でないメソッドには戻り値がありません。
具体例で説明するとCeilingメソッドで、
K = Math.Ceiling(123.56)
と書いた場合、引数は 123.56 戻り値は 124 で、この戻り値を変数Kが受け取ります。そこで K = 124 となるわけです。
MathクラスのCeilingメソッドは 「小数を入れると、切り上げて返す」 中がどうなっているかは誰も知らない…。 |
■画像3:引数と戻り値の例
引数は変数でもかまわないし、戻り値は変数に入れないで直接利用してもかまいません。
今MathクラスのCeilingメソッドを例にあげて説明しました。このようにメソッドは「クラス名.メソッド名」の形式で呼び出します。
しかし、これ以外にも3つほど呼び出しかたがあります。3つの呼び出し方を説明する前にざっとまとめを書いておきます。
メソッドの4つの呼び出し方 1.クラス名.メソッド名
2.クラスのインスタンス名.メソッド名
3.値.メソッド名
4.メソッド名
|
さて、1つ目の呼び出し方「クラス名.メソッド名」は既にMath.Ceilingで紹介したのでここでは繰り返しません。
2つ目はクラスのインスタンスからメソッドを呼び出す方法です。「クラスのインスタンス」というと難しく聞こえるかもしれませんが、Dimなどを使って変数にセットされているクラスのことですね。
たとえば、次の場合がこれにあたります。
Dim
Saikoro As New
Random Dim Number As Decimal Number = Saikoro.Next(1, 7) MsgBox(Number) |
■リスト3:ランダムな数字を返す。
この例ではRandomクラス (読み方:Random = ランダム) のNextメソッド (読み方:Next = ネクスト) を使っています。このメソッドはランダムな数を返すメソッドです。引数には返す値の範囲を指定できますのでここではサイコロに似せて1から6の範囲でランダムな値を返すようにしています。このようにメソッドの引数は1つとは限りません。 複数の引数を指定する場合は必ず決められた順番で指定する必要があるので気をつけてください。Nextメソッドの場合は 最低値、最大値の順で指定します。
ただし、Nextメソッドは最低値以上、最大値未満の値を返すので注意してください。もし、Next(1, 6)とした場合は1〜5の数値を返します。1〜6の数値を返したい場合にはNext(1, 7)とします。
実際にこのコードを実行してみると毎回1から6の間でランダムな数を表示します。あたかもサイコロを振っているかのようです。 何回も実行して確認してみてください。
RandomクラスのNextメソッドは 「最低値と最大値を入れると、ランダムな数を返す」 中がどうなっているかは誰も知らない。 |
■画像4:Random.Nextメソッド
このメソッドは 「クラス名.メソッド名」の形、つまり「Random.Next」という形では呼び出せません。かならず、この例のようにいったん変数にセットして呼び出す必要があります。
このような変数がインスタンスを表しているのです。インスタンスの作成方法はさまざまですが、必ずDimなどで宣言されているのが共通の特徴です。
文字・数値などの基本的な型のメソッドやプロパティは値から直接呼び出すこともできます。たとえば次のようになります。
Dim
St As
String St = "あいうえお".Substring(1, 2) MsgBox(St) |
■リスト4:文字列を切り抜く
このコードでは Substringメソッド (読み方:Substring = サブストリング)を使用しています。Substringメソッドは文字列から文字を切り抜いて、その切り抜いた文字列を返します。この例だと「あいうえお」の1文字目から2文字切り抜いて「いう」を返します。先頭の文字を0文字目と数える点に注意してください。
このようにメソッドの戻り値は数値とは限りません。文字や日付などいろいろなものが返ってきます。
StringクラスのSubstringメソッドは 「開始位置と文字数を入れると、その部分の文字を返す」 中がどうなっているかは、誰も知らない…。 |
■画像5:String.Substringメソッド
ここでも引数の順番は大切で第1引数には何文字目から切り抜くのか、第2引数には何文字分切り抜くのかを指定します。ただし第2引数は省略可能で、省略した場合は第1引数より後ろのすべての文字列を切り抜きます。
なお、この例は次のように書いても同じ意味です。この場合は「インスタンス名.メソッド名」で呼び出していることになりますね。
Dim
St As
String St = "あいうえお" St = St.Substring(1, 2) MsgBox(St) |
■リスト5:Substringで文字列を切り抜く
4つ目のメソッドの呼び出し方は、クラス名を省略する方法です。特殊なクラスの場合クラス名を省略していきなりメソッドを呼び出すことができます。 これらのメソッドは「関数」と呼ばれることがとても多いです。このサイトでもこれらのメソッドのことは「関数」と表記します。またVBのヘルプであるMSDNライブラリでもこれらを「関数」と表現しています。
では、日本人ならではの ひらがなをカタカナにしたり、その逆をするメソッドを例に紹介してましょう。
次の例ではStrConv関数を使ってひらがなをカタカナにします。
St = StrConv("楽しいVBプログラミング", VbStrConv.Katakana) |
■リスト6:ひらがな→カタカナ
戻り値は "楽シイVBプログラミング" となります。
この例を見て分かるようにStrConv関数を使う場合にクラス名は指定されていません。
カタカナをひらがなにするには次のようにします。
St = StrConv("楽しいVBプログラミング", VbStrConv.Hiragana) |
■リスト7:カタカナ→ひらがな
戻り値は "楽しいVBぷろぐらみんぐ" です。
この特殊なクラスはVBが標準で装備していてはずすことができないクラスです。具体的にはStringsクラスやVBMathクラスなどいろいろあるのですが、なにしろクラス名を省略できるのですからこれらの名前を知っている人はあまりいません。みなさんも覚えてもあまり意味ないです。一度くらい試しに Strings. と打ってみてください。
なお、自分のクラスのメソッドもクラス名を省略して呼び出すことができます。たとえば、フォームにプログラムしているときはそのフォームのメソッドはクラス名を省略して呼び出すことができます。
さて、メソッドの呼び出し方に関する限り、この節での説明で「クラス」とあるところは「構造体」にもあてはまります。文章が煩雑になってかえってわかりにくくなると思うため、本文中では構造体については書きませんでした。ご了承ください。
5.よく使う関数
メソッドについての説明が一通り終わったところでよく使うメソッドをいくつか紹介します。
まずはLen関数 (読み方:Len = レン)を紹介しましょう。Len関数(レン)は文字列を引数にとり、その文字の長さ(文字数)を返します。
Dim i As
Integer i = Len("あいうえお") MsgBox(i) |
■リスト8:Len関数
この例では、引数は文字列"あいうえお"で、戻り値は 5 です。これは"あいうえお"が全部で5文字だからです。このように いろいろな関数の機能を把握することは重要です。
■画像6:Len関数の考え方
このLen関数は実はStringクラスのLengthプロパティと同じ機能です。そこで上の例は次のように書き換えることもできます。
Dim
i As
Integer i = "あいうえお".Length MsgBox(i) |
■リスト9:Lengthプロパティ
Len関数とLengthプロパティのどちらを使うかは最終的にはお好みですが、私はLen関数を使うことをお勧めします。
なぜなら、次の例は3行目でエラーになるからです。
Dim
St As
String MsgBox(Len(St)) MsgBox(St.Length) 'この行でエラーになります。 |
■リスト10:Lengthプロパティによるエラー
このようにString型のメソッドやプロパティは値に初期値をセットしないとエラーになってしまいます。この詳細はまたの機会に説明します。
他に使い方が簡単で比較的よく使う関数には次のものがあります。
関数 | 読み方 | 機能 |
LCase | エルケース | 引数を大文字にして返す。(アルファベット)。 |
Left | レフト | 引数の左から指定した数だけ文字を取り出して返す。 |
Len | レン | 引数の文字数を返す。 |
Right | ライト | 引数の右から指定した数だけ文字を取り出して返す。 |
Mid | ミッド | 引数の指定した位置から指定した数だけ文字を取り出して返す。 |
Trim | トリム | 引数から前後のスペースだけを削除して返す。 |
Abs | アブソリュート | 絶対値を返す |
Fix | フィックス | 小数点以下を切り捨てて返す |
Sin | サイン | 正弦を返す。(この他の三角関数もある)。 |
■表1:文字に関する主な関数
次に、やや複雑な関数Mid関数(読み方:Mid = ミッド)を紹介しましょう。この関数は次のようにして使います。
St = Mid("かきくけこ", 2, 3) |
■リスト11:Mid関数
なんと この関数は3つも引数をとります(ただし、3つ目の引数は省略することもできます)。この例の意味は
"かきくけこ" の 2文字目から 3文字を取り出して返せ
と言うようになります。
ということは戻り値は "きくけ" ですね。
この関数は先の紹介したSubstringメソッドと同じ機能を持っていることに気が付いたでしょうか?Mid関数は初めの文字を1文字目、Substringメソッドは初めの文字を0文字目と数えるなど少しは違いもありますが、機能としては同じです。
博士のワンポイントレッスン
|
Left関数とRight関数は比較的需要(じゅよう)の高い関数 ですが他の関数と違って簡単に呼び出すことができません。Left関数は文字列の左側から数文字を、Right関数は右側から数文字を切り取って返す関数です。
■画像7:Left関数
これらの関数はVB6時代には簡単に呼び出せて、簡単に使えるとても便利な関数だったためVB.NET2002以降で戸惑っている人が多いようです。
なぜ、これらの関数が簡単に呼び出せないかというと、フォームのプロパティと同じ名前だからです。たとえば、フォームのLeftプロパティは画面の中でのフォームの横位置を表しています。
このためフォームの中でただ単にLeftと書いた場合、VBはLeft関数ではなく、Leftプロパティとして解釈してしまいます。それでフォームのプログラム中に次のように記述してもビルドエラーになります。
'このコードは正しくない例です MsgBox(Left("あいうえお", 2)) |
■リスト12:正しくLeft関数を呼び出せない例
ただし、この例はフォームではない場所では正常に動作します。
フォームの中でLeft関数を使いたい場合は、「関数」の実体が特殊なクラスの「メソッド」であることを思い出して、クラス名をはっきりと指定しなければなりません。これは次のようになります。
MsgBox(Strings.Left("あいうえお", 2)) |
■リスト13
この例はどの場所でも正しく動作します。
また、Stringsは特殊なクラスなのでさらに次のように書くこともできます。
MsgBox(Microsoft.VisualBasic.Left("あいうえお", 2)) |
■リスト14
この辺りには工夫の余地もあって、まだ解説していないImports句を使って次のようにすることもできます。
Imports
VB = Microsoft.VisualBasic (中略) MsgBox(VB.Left("あいうえお", 2)) |
■リスト15
もっとも、こういったことにあれこれ悩むよりは素直にSubstringメソッドを使うべきでしょう。
MsgBox("あいうえお".Substring(0, 2)) |
■リスト16
7.機能的なメソッド
メソッドの戻り値は文字列や数字だけではありません。音を返す関数や、色を返す関数もあります。音を返すのは Beep関数 (読み方:Beep = ビープ)です。引数はとりません。ただ、Beepとだけ書けば音を返します。「音を返す」とは、この場合は「音を鳴らす」と言う意味です。
色を返すメソッドは、ColorクラスのFromARGBメソッドです。これについては初級編の第1回ですでに説明しています。FromARGB関数 は 赤、緑、青と3つの引数をとります。
他には画像を返すImageクラスのFromFileメソッド。これは引数に画像ファイルのパスをとります。たとえば、C:\Test.bmpと言うファイルがあったとすると、Image.FromFile("C:\Test.bmp") はそのファイルの画像を返します。ただし、画像は普通の変数では受け取ることはできません。画像を受け取るにはフォーム のBackgroundImageプロパティなどを使います。
Me.BackgroundImage = Image.FromFile("C:\winnt\隅田川.bmp") |
■リスト17
この他に前回までに登場したたびたび登場しているMsgBox(メッセージボックス)も関数です。MsgBox関数ににたものとしてInputBox関数というものもあります。InputBox関数はユーザーからの入力を返す便利な関数です。 「質問文を引数に取り、回答を返す関数」ともいえますね。サンプルを掲載しますので実際に試したことがない方は何が起こるのか自分の目で確かめてみてください。
Private
Sub Button1_Click(ByVal
sender As
System.Object, ByVal
e As
System.EventArgs) Handles
Button1.Click Dim Answer As String Answer = InputBox("あなたの名前はなんですか?") MsgBox("こんにちは" & Answer & "さん。") End Sub |
■リスト18:InputBox関数の使用例
ところで、MsgBox関数は普段はメッセージを表示させるためだけに使っているのであまり関数みたいには見えないかもしれませんね。実はMsgBox関数にはユーザーの選択を返す機能があるのです。しかし、この機能は 別に解説する条件判断の知識がないと意味がないのでまたの機会にあらためて紹介することにします。
他の機能的なメソッドの詳細も後々解説する機会があると思いますが、 今回は深入りしません。今回はVBの中でメソッドを使うことの便利さとメソッドの一般的な使い方が理解していただければ私の意図は達成されたことになります。
メソッドがもつ「機能」に焦点を当てると戻り値が必要ない場合があります。実際戻り値のないメソッドもたくさんあります。
たとえば、FileクラスのCopyメソッドはファイルをコピーする機能を持っていますが戻り値はありません。
このようなメソッドは「関数」としても役割ではなく「命令」としての役割をもっているといえます。実際にコンピュータに何かアクションを起こさせる場合は最終的には何らかのメソッドを呼び出すことになるわけです。