秀丸マクロ, Word VBA, or the like -15ページ目

関数・キーワード

前回に続いて、避けては通れない専門用語の解説ということで、今日は関数についてお話しします。

関数ときいてまず思い浮かべるのが、一次関数、二次関数、三角関数・・・

自分が嫌いな数学のアレです。

もう本当に、言葉で言い表せないくらい、数学が苦手でしたし、今でも好きにはなれないので

関数いう言葉を見たときには、それだけで頭が大パニック状態でした。

潜在意識の中のどこかから、『見るな!!!』って叫び声が聞こえてきたくらいです。

でも、パソコンの『関数』は、数学のそれとは別物と考えたほうがいいでしょう。

深く掘り下げていけば、何故関数という名前が付いたのか理解出来ますが、そこまで理解する必要は有りません。

秀丸マクロに限って説明すると、

関数とは『何らかの情報を取得しなさい』という命令文です。

秀丸マクロのヘルプファイルを見ると、関数キーワードというのがありますが、僕の理解では両者は同じです。
$秀丸マクロ, Word VBA, or the like-function-menu


現実の社会に置き換えて説明すると、関数とは諜報部員、スパイのような存在です。


そんな大袈裟なものではないにしても、例えば日常の生活の中で『~さん、あの会社の電話番号調べといて』というようなお願いすることあるじゃないですか。

関数というのは、『秀丸さん~について調べといて』という感じの命令文だと思えばいいでしょう。

例えば、filenameという関数では、

秀丸さん作業中のファイル名(c:\~を含めて)調べといて』と命令しています。

この命令を受けた秀丸は作業中のファイル名をc:\から調べ上げます。

これを、『ファイル名を取得する』とか、『ファイル名を返す』と表現します。

取得された、ファイル名のことを戻り値とか、返り値と表現します。

現実の世界では、例えば『~の電話番号調べといて』と誰かにお願いすると、
普通は『○○○-△△△△です。』というように、調べた情報(取得した情報)を教えてくれます。

しかし、関数というのは気の利かないやつで、filenameだけではファイル名を取得するものの、

メッセージボックスで表示してくれるわけでも無く、作業中のファイルに入力してくれるわけでも無く、

何らかの形で目に見える用に取得した情報をユーザーに教えてくれるわけでは有りません。

関数には、取得した情報を話す口を持たず、文字で表す術も持っていません

なので、関数は単独で使われることは無く、通常変数や、命令文と共に使われます。

また、他の関数のなかで使用されることもあります。

変数については、後日また詳しく説明しますが、以前のこの記事も参照ください。


例えば、filenameで調べたフルパス(c:\~のアドレスの事)を含むファイル名をメッセージボックスで表示したければ、以下のように記述します。
$a = filename;
message $a;


このやり方は、最初に作業中のファイル名を取得して、変数『$a』に一旦預けています。

なので、マクロ実行中に作業中のファイルが変わる時に有効です。

つまり、マクロ実行中に作業中のファイルが変わっても、この『$a』を参照するだけでマクロの開始時の作業ファイルのファイル名を取り出すことが出来ます。

朝釣ってきた魚を、一旦『$a』という冷蔵庫に入れて、夜ご飯の食卓に出すみたいな感じですかね。

逆に、その場で情報を取得してその場で使うという場合、以下のように記述すればコードがすっきりします。
message filename;


但し、注意するべきことは、関数が取ってくる情報には文字型の情報(データ)と、数値型の情報(データ)とがあります。

これはデータ型と呼ばれるものです。

ここで紹介したfilenameは、文字型のデータを返します。

なので変数を使うときは、文字型の変数と言われるものを使います。

またmessage文に使われるパラメータは文字型なので、数値型のデータをパラメータに設定することは出来ません。

例えば、linecount2という関数は作業中のファイルに含まれる行数(改行までを一行とする)を取得してくれます。

この関数が返す値は数値型です。
なので、
message linecount2;

と記述しても、エラーになります。

linecount2で、行数を取得してメッセージボックスで表示させたい場合、str という関数を使って以下のように記述します。
message str (linecount2);


また、linecount2の取ってきた情報を格納する変数は数値型変数と言われて、頭に$じゃなくて、#が付きます。

なので、作業中のファイルの行数を取得して、一旦変数に預けて後でメッセージボックスで表示させる場合は、こんな感じになります。
#a = linecount2;
message str (#a);


ちょっと、説明が小難しくなってしまいましたが、データ型については次の記事で更に説明させて頂きます。