個サ作 #4 きほんのきを学習だ!
こんにちは。
前回はExcelを立ち上げて簡単なマクロの作成とその実行、ファイルを保存するところまでを行いました。
今回が#2で案内したロードマップのうちの「基礎の基礎」にあたります。
では参りましょう。
今回のゴール
今回はプログラミングの基本要素である「変数」「代入」「コメント」の理解がゴールです。
機能としてはあまり大きな変化はなく・・・以下くらいです。
前回とほぼ一緒ですね汗。でも内部的(ソースコード的)には少し変化アリです!
「変数」とは
まずは変数からいきましょう。
変数とは
初心者によっては、もしくは教える人の教え方によっては躓きがちなのがプログラミングの「変数」という要素です。
変数というのは文字通り「変わる・変えられる数」です。「数」というと数字をイメージされるでしょうけれど、もう少し大きく捉えてください。
数字はもちろんのことテキストや真偽を示す値など、なにかしらの情報を保持するアイテムです。それが変数。
数学の授業に出てきた x や y をイメージしてもらうとわかりやすいかもしれません。
初学者向けの参考書ではよく「箱」と表現されます。値をもっておく、いれておくから箱です。中身を入れ替えること、何も入れないこともできます。
前回と同じ「Study1」のモジュールに、次のソースコードを下図赤枠のように追記しましょう。
Sub B_メッセージ表示その2()
Dim message As String
message = "こんにちは 世界"
MsgBox message
End Sub
どんな方法でもいいのでこの「B_メッセージ表示その2」を実行してください。
はい、でましたね。「こんにちは 世界」。
この動作を知った上で変数の働きを後続の章にわたって解説します。
変数宣言とは
「B_メッセージ表示その2」では最初に
Dim message As String
こんなソースコードを書いていますね。これ、何をしているかというと変数を宣言しています。
もっと柔らかく言うと「messageという名前の変数を使いますよー!」とお知らせしています。誰に?プログラマとコンパイラです。
「プログラマ」はあなたのこと。ソースコードを書いて処理を紡ぐ者、紡ぎし者です。かっけぇ・・・。
「コンパイラ」は処理を実行するために裏で暗躍する者です。我々人間は意識しませんが、処理を実行するために「これは実行に足るソースコードなのか?」というのをチェックしてくれるヤツがシステムの中にいるんです。
そういうチェック機能がVBAについている、と考えてください。
そしてチェックした結果「あれ?構文間違えてないか?おかしいぞ!」ということがあれば「ちょっと待ちなよ!」と言って止めてくれます。
変数を宣言することで、その後の処理で変数を使うことができるようになります。人間はこの世に生を受けたら市役所に出生届を出すことでその後生きていけますよね。そんな感じです。「生まれたぞ!」です。
宣言したばかりでは当然変数の中身は空っぽです。ここでなにか値を入れてあげることを変数の定義、と言います。
変数宣言の構文
では、その変数宣言の一文を分解して解説しましょう。
Dim message As String
まず構文としては
Dim [変数名] As [データ型]
という書き方をします。Dim と As は決まり文句。どんな変数を定義するときでもDimとAsは必ず「Dim」と「As」と書きます。
そして、上図のとおり「Dim」とはDimensionの略です。この言葉にはいくつかの意味がありますが、その中には「容量」や「次元」というものがあります。
プログラミングの際には気にしなくてよいですが、この辺の意味を手掛かりに変数宣言に用いる言葉として覚えておくとより理解が捗るでしょう。値を保持するための容量、配列の次元数を宣言するよ、ということです。
(「配列」は初めて出てきた単語です。#10で扱いますね。)
AsはAsです。特に説明はなし。接続詞みたいなものですわ。
[変数名]は文字通り、変数の名前です。一応ルールはありますが、基本なんでもOKです。
構文が以下ですので、最後に残っているのがデータ型ですね。
Dim [変数名] As [データ型]
上記に貼付したキャプチャの説明に
という文言があるのですが、この「どのような値」の部分がデータ型を指しています。
先ほどの変数の説明では次のようにお伝えしましたね。
上記の太字の部分がデータ型にあたります。
では具体的に各データ型はどんな書き方をするのか?気になりますよね。以下に代表例を示します。
基本的にはこの3つです。他にもありますが、これらを多用します。
文字列・・・String
数値・・・Integer
真偽・・・Boolean
今説明しているソースでは
Dim message As String
こんな風に使っています。
ここまでの話を踏まえて説明すると文字列型の「message」という名前の変数を宣言している、と言うことができます。
ここ、当然のように変数名を「message」としていますが、メッセージを保持する変数だから「message」という名前、とても理にかなっています。
これから先も口を酸っぱくしてお伝えすると思いますが、変数名がその用途と一致している、ということはソースコードを書いていく上でとても重要です。
ここまでで「変数」の意味と宣言する構文をご説明しました。まだなんのこっちゃ分からなくて大丈夫です。次の項で変数を使った処理を説明します。
「代入」とは
変数の次は代入です。ご案内したソースコードの中の
message = "こんにちは 世界"
この部分です。
「代入」自体は中学1年生の数学で習うそうですが、今回の「代入」も同じものとして捉えていただいて差し支えありません。「x」だとか「y」だとかに数値や式を入れるのと同じ感覚ですね。
代入とは
プログラミングにおける「代入」とは、変数に値を与えることをいいます。
上記のソースコードで言えば、「message」変数に「こんにちは 世界」という文字列を代入し(与え)ています。
数学の世界では 1 + 1 = 2 という式があれば左から右に読みますが、プログラミングの世界では常に数式は右から左に読みます。
ですので
message = "こんにちは 世界"
この処理で値を受け取るのは「message」変数ということですね。処理によっては変数から変数に代入することもあります。
代入の注意事項
「変数宣言の構文」の項では変数を宣言する際にデータ型を指定することをお伝えしました。その宣言によって文字列だけを許容できる変数だったり、数値だけを許容できる変数だったりが決まるわけです。
ということは代入時の注意点も自ずと決まってきますね。
そうです。許容できない値は代入しないことです。
では、それをやってしまうとどうなるのか?見てみましょう。試しに、以下のソースコードを下図のように書いてみます。
Sub B_いけない代入()
Dim temp As Integer
temp = "こんにちは 世界"
End Sub
数値として宣言した変数に文字列を代入しています。つまり代入できない、が期待値です。ではこれを実行するとどうなるか・・・
エラーが発生しました。「型が一致しません。」と出ていますね。
数字だけを許容する変数はどう頑張っても文字列は受け止められません。上図ではエラーダイアログに含まれる「デバッグ」というボタンを押下しています。
すると、ソースコードの一部が黄色にハイライトされている様子がわかると思います。これは、この行でエラーが発生しましたよ、ということを示してくれています。
その情報を参考にこのソースの何が悪いのかを突き止めればいいので修正の足掛かりにできますね。
一方「終了」ボタンの方は処理を終了するだけです。デバッグを押すと処理が中断状態になるので、
終了するときはこの停止ボタンをクリックしましょう。
代入時の暗黙的な型変換
では、逆はどうでしょうか。文字列を許容する変数に数値を代入するとどうなるのか。
下記のソースを下図のように追記いただけますか。
Sub B_暗黙的型変換()
Dim temp As String
temp = 123456789
Debug.Print temp
End Sub
そして実行します。今回はお教えしていない方法で実行します。
右上のマクロ一覧プルダウンから「B_暗黙的型変換」を選択した状態で三角の形をした実行ボタンを押下します。すると・・・
以前設定したイミディエイトウィンドウに「123456789」という値が出力されました。Debug.Print はその後に続く値をイミディエイトウィンドウに出力する働きがあります。
先ほどInteger型に文字列を代入しようとするとエラーになったのに、今回はエラーにならずに素通りしてしまいました。
さらにはイミディエイトウィンドウに変数「temp」のもつ値を出力したことで、代入が成功したことも証明できてしまいました。なぜでしょうか。
これは何が起きたかと申しますと、データ型の変換が行われたんです。
文字列 を 数値型変数 に 代入 → できない
数値 を 文字列型変数 に 代入 → できる
数値というのは 1, 2, 3・・・というように数字なのですが、プログラミング的にはこれを文字として捉えることも可能なんです。
なので、
temp = 123456789
この一文。代入時はたしかに123456789という数字なのですが、代入された後は"123456789"という文字列として変数に値を保持しているんです。
今回私たちは代入にあたって型を変換するという処理を書きませんでしたよね(そういう処理が存在するんです)。でもVBAが勝手に(気を利かせて)やってくれました。
このような動きを暗黙的な型変換といいます。
これ、他の言語でもある仕組みですので、頭の片隅に置いておいてもらえるとよいです。でもぶっちゃけると今は忘れてしまってもOK。そんなに困らないのでね。
後続の説明のためにイミディエイトウィンドウに出力された「123456789」は削除しておいてください。
コメント
お次はコメントです。
コメントとは
プログラミング開発におけるコメントとは、ソースコードに対してつける注釈のことで、これは実行時には無視されます。
一例あげましょう。先ほどのソースコード「B_暗黙的型変換()」の中にある代入部分を下記・下図のようにしてみてください。
'暗黙的な型変換が行われる
temp = 123456789
前方に「'」シングルクォーテーションを付けると文字色が緑色になります。この緑色がコメントであることを示しています。
シングルクォーテーションは[Shift] + [7]キーで出せます。
コメントアウトとは
開発途中にソースコードを書きながら処理を検討していると、まだ削除はしたくないんだけど、一旦一部のソースを脇に置いておきたいときがあります。
そんなときにいちいち別のテキストエディタを立ち上げてソースを退避させるのはとても面倒です。
実行時に実行されては困るが、ソースは消したくない、そんなときにもコメントは活躍します。
ソースコードをコメント化することをコメントアウトする、と言います。
コメントアウトは複数行に渡って一括ですることもできます。
上図赤枠のようなボタン、あなたのエディタのどこかにありますか?もしもどこにも見当たらない場合は下図のように設定してみてください。
それでは、編集ツールバーが画面にある状態になりましたので、一括コメントアウトする方法をお教えします。
対象の行をドラッグした状態で「コメントブロック」ボタンを押下してください。
また、解除するときはおなじく対象行をドラッグした状態で「非コメントブロック」ボタンを押下してください。
上図がお手本です。
コメントアウトしている状態というのは実行時およびコンパイラに認識されないということなので、
見てください。マクロ一覧にも出てこなくなります(上図は「B_暗黙的型変換()」をコメントアウトしている状態)。
コメントの説明はここまでです。
変数宣言強制オプション
この章はおまけと思ってください。
お伝えせずに進めてもいいのですが、これに触れないことであなたがこの先プログラミング界で出会う人に「この人こんなことも知らないのか」と思われても困るよな・・・というような内容です。
変数宣言は実は省略可能
変数の章でね、私こう言いました。
上記の通りなら、宣言されていない変数は使えないのでエラーになる道理です。試しに下記のように、変数の宣言部分をコメントアウトして実行してみましょう。
Sub B_メッセージ表示その2()
'Dim message As String
message = "こんにちは 世界"
MsgBox message
End Sub
実行します。
あらら、できちゃった。MsgBoxによるポップアップが出てますね。問題なく実行できてしまっています。何が起きているのでしょう。
これね、VBAがよしなに解釈してくれたんです。
「あれ?message変数は定義されてないけど、テキストを代入してるね?そしてMsgBoxに渡している・・・?つまりこういうことがしたいんだね?」
という具合にええ感じにVBAさんが処理してくれたんです。その結果、実行できちゃいました。
でも、お作法として変数は定義した方がいいし、バグの防止にもなる、さらにはそれが美しい(読みやすい)ソースコードに繋がります。そこで、次のコードを頭に1行追加してください。
変数宣言強制オプションの書き方
'変数宣言を強制する
Option Explicit
上記のソースコードをモジュール内の一番最初に書きます。習いたてのコメントも一緒につけておきましょう。
これで実行するとですね
エラーになりましたね。変数宣言強制化のオプションをつけたことで宣言されていない変数を使おうとするとエラーを発するようになりました。
動作確認は省略しますが、変数宣言をアンコメント(コメントアウトの解除)して再度実行すると今度は処理が成功します。
「Option Explicit」←このオプション指定はカレンダーLv.4からは使わないようにします。宣言を省略してもいいような変数にまで宣言を強いられて煩わしいのでね。
では、今回の手を動かす部分はここまでです。後は読み物として楽しんでください。
今回のふりかえり
今回は大きく
変数
代入
コメント
イミディエイトウィンドウの使い方
について学びました。変数、代入、コメントはどのプログラミング言語にもでてくる要素です。これらはこれからも使っていくので、否が応でも知識に定着していきます。
イミディエイトウィンドウもそっくりそのまま同じものが他のプログラミング言語にあるわけではありませが、似たような機能はあるので、便利機能としておさえておいてください。本連載でもこの先何度も使います。
他に覚えておいてほしい、今後意識してほしいこととしては
ソースコードに対してコンパイルが働くこと
変数名は用途にあったものにしよう
暗黙的型変換が自動で働く
があります。どれもプログラミングを続けているとどこかで出会う・重要性に気付くものばかりです。
暗黙的型変換はそれにより予期せぬ動作をするかもしれないというリスクがある点を抑えておいてもらえるとよいです。
今回の補足
変数をプログラマに対して宣言する件
「変数宣言とは」の項で
と、言いました。この後にプログラマとは自分のこと、としているので、自分に対して宣言とは?と疑問符が浮かんだかもしれません。
ここで言うプログラマ(=自分)というのは時間をおいてからまたソースを見る自分、という風に捉えてください。
たとえ自分が書いたソースコードであっても、長い時間をおいてからまた見ようものなら、それはもう他人が書いたソースコードと同じなんです。
構文説明中の角括弧
「変数宣言の構文」の項で下記のように構文をお伝えしました。
Dim [変数名] As [データ型]
変数名とデータ型を角括弧で囲んでいるのですが、これは任意の値を入れられる、という意味です。
この先も構文や記法を説明するシーンが出てきますが、同じです。角括弧で囲んでいる要素は使用の際、用途に応じた任意の値を使うことができます。
※データ型のように完全自由ではなく、決められたいくつかの値から任意の値を使用する、というケースもあります。
必要に応じてGoogle先生活用を
「変数宣言の構文」の項では「Dim」の意味についてGoogleの検索結果のキャプチャをあえて貼りました。
私自身、皆様に説明するにあたって、適宜改めて言葉の意味を調べなおすということをしています。
私の説明が不十分だったり、理解が難しかったりする場合はあなた自身で改めてGoogle先生に聞いてみてください。
プログラミングという分野は先人たちの知識や経験の蓄えがたくさんたくさんあるのできっと希望の情報が手に入ります。しかも結構わかりやすくまとめてあったりします。公式リファレンスよりもです。
その過程で「検索力」なるものも身についていくでしょう。積極的に活用してください。
※検索力:ほしい情報にアクセスするために適切な検索ワードを設定する力。短時間で所望の情報に辿り着く力。
変数名tempの意味
「変数宣言の構文」の項で変数名はちゃんと考えてつけよう、という話をしているのですが、「B_いけない代入()」や「B_暗黙的型変換()」では「temp」という名前の変数を使っています。
「temp」は「temporary」の略で「一時的な」「仮の」というような意味があります。
今回のようなちょっとした説明で使うだけの変数だったり、実処理においても、一時的なだけの用途の変数にはこの「temp」という名前をよく使います。
https://wa3.i-3-i.info/word1687.html
↑こちら、参考にしてください。初心者のころ私がよく見てたサイトです。
ほかに「hoge」や「huga」もなんでもいいときに使います。
入力候補に用意した変数を出せる
前回、補足の章で入力候補サジェスト機能についてお伝えしましたね。そこで、
と言いました。今回の内容に変数の宣言があったじゃないですか。これによって、自分で用意した変数も入力候補に出すことができるようになります。
見てください。
変数messageの宣言があればサジェスト(候補)に現れるけど、宣言がなければ現れない様子です。
なので宣言をすることにはこんな恩恵もある、という話ですね。
エラー発生タイミングの見分け方
今回、エラーが発生する瞬間を2度一緒に確認しましたね。
暗黙的型変換がうまくいけないケースでの代入
変数宣言強制オプションがある状態で宣言していない変数を使用したとき
この2つです。実はエラーがいつ起きたかはエラーメッセージのダイアログから見分けることができます。
「実行時エラー」と「コンパイルエラー」とありますね。
実行時エラーは文字通り実行したときに起きたエラーです。
ではコンパイルエラーとは何か。今回「変数」の章でコンパイラの存在をお伝えしましたね。実行前にソースコードに不備がないかを確認してくれる優れモノがシステム内部に潜んでいます。
この確認してくれる仕組みをコンパイルと言いますが、その段階で「おいおい、このソースコードだめじゃねえか」となるのがコンパイルエラーです。
つまり、実行時エラーの場合はコンパイルは通過しているんですね。コンパイルでも見抜けなかった不具合が実行時エラーとして現れます。
この2つの違いがわかることで何が嬉しいかというと、修正箇所や原因の当たりがつくことです。コンパイルエラーだったら文法ミスである可能性が高いのでその観点からソースコードを確認すればよいです。
実行時エラーは本編でも扱いましたが、ソースコードを黄色でハイライトしてくれるので、その周辺を確認・修正すればOKです。
インデントに注意して!
今回、最初に実装いただいたソースコードが・・・
Sub B_メッセージ表示その2()
Dim message As String
message = "こんにちは 世界"
MsgBox message
End Sub
これなのですが、最初と最後の行以外は先頭に半角スペースが4つあるの、分かりますかね。これをインデントと言います。
日本語では字下げといい、MicrosoftのWordにも出てきますね。
これはソースコードの入れ子構造を示すためのものです。字下げをすることによって、(上記の場合)各処理は「B_メッセージ表示その2」というマクロに属しているんだ、ということがわかりますね。
インデントはこの先もループや分岐処理で当たり前のように登場します。当たり前すぎて特に触れていませんがとても重要です。時には入れ子構造が二重三重となることもあります。
半角スペース4つと言いましたが、タブ1つで表現されたり、言語や好み・状況によっては半角スペース2つ分だったりもします。
おわりに
今回もありがとうございました。
急に本格化した感が否めません汗。
前回までと比べるといきなり盛りだくさんになった印象を受けたかもしれません。最初のうちはどうしてもね、そうなっちゃうんです。ご容赦を・・。
次回からカレンダーの開発に入っていきます!プログラミングの学習を通して脳ミソに皺を刻んでいきましょう。
ゆっくり休んでくださいね。
ありがとうございました。
この記事が気に入ったらサポートをしてみませんか?