★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0049:すべての基本(ヘルプ読解含)。「自作関数」について02
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0049
タイトル:★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0049:すべての基本(ヘルプ読解含)。「自作関数」について02
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
今回は前回の続きです。
今回は「超」長いです。
でも、特に初心者の方々や「自称上級者の中の一部の方」にとっては、
「メッチャクチャに」「大事!!!」なので、
ゆっくりでいいので、最後まで、読んでみてください。
(※慌てて書いてるので、ミスがあったら、バックナンバーで修正します。ごめんなさい!!)
今回は僕の理解のし間違いやお伝えのミス、はあるかもしれませんが、
「内容・ヒント」としては無駄なものは「1つも」「1行も」「1単語も」「ありません」。
「全文・1語1句」の理解、をして、「間違いが無いか探す・見つける」くらい、
読み込んでみてください。
「おまえウソばっかり書いてんじゃねえと間違いがわかる」くらいになれれば、
とても良いと思います。
ぶっちゃけ、もし、今号の内容が「理解できない」となりますと、
「VBAはもう絶望的」、
になります。
ここが理解できないのに学習を続けても、
基本的には、「エラーが自力で解決できず」、
ほとんどが「無駄になります」ので、
その際は、自分でVBAはやらずに、誰かにやってもらってください。
(でもそれはビジネス的には、非常に正しい判断です。
なので恥じないでください。特に、個人事業主の方は。)
ただ、もちろん、
「僕の説明が下手すぎて、それで理解ができない」ということなら、全然ダイジョブですので、
周囲の分かる方に、聞き直してみてください。
「わかるまで何百回でも誰かに聞く」か、
あるいは、
「分かりやすい説明をしてくれる人を探し続ける」ということが、重要です。
確実に、理解できるように、頑張ってください。
理解できねば本当に残念なことですが、
「絶望的」になってしまいますので・・・。
では、進めていきます。
まずは、「Functionプロシージャ」が、
『 ワークシート上で「ワークシート関数として使える」』、
という体験だけをして頂く・・・ということでした。
ではまず、これは前回とダブりますが、一応、また書いておきます。
(前回やられた方はスルーしてください。)
まず以下の3行のコードを、
標準モジュールをひとつ新規に作って、同じように書いてください。
(※直接書かなくても以下のコードをコピペしてもOKです。)
Function z(x As Long, y As Long) As Long
Let z = x + y
End Function
そのあと、
シートのA列に、上から順番に1、2、3、と数値を入力し、
シートのB列に、上から順番に4、5、6、と数値を入力します。
これで、冒頭の3行のコード(「z」という名前のFunctionプロシージャ)を、
ワークシート上で、「関数」として動かす準備ができました。
このように、Functionプロシージャで自作した関数のことを、
「ユーザー定義関数、とか、自作関数」、などと呼んだりします。
(他の呼び方をする人も居るかもしれません。色々なのであまりこだわらないでください。
Webや市販書籍だと「ユーザー定義関数」と呼んだり書かれたりすることが多いです。)
なお、とりあえずここでは、
『「z」という名前のFunctionプロシージャ 』のことを
『 z関数 』と呼ぶことにします。
これから、「z関数」によって、
「ワークシート上のA列の値とB列の値を足し算して、C列に計算結果を出す」
ということをしてみたいと思います。
では次へ勧めます。
「C1」セルをクリックして「=z」と入力してください。
普通にSUM関数やIF関数を入力するときみたいに、ドロップダウンで「z」が出てきました。
(皆さんの場合は「z」1行だけが出てる状態かもしれません。
自分のは、他にテストしたやつが出てきてしまっています(^^)。
ちなみに、「aaaaaaaa」みたいな関数名を付ければ、他のABS関数やADDRESS関数
その他、組込関数がたくさん出てくるので、より、分かりやすくなると思います。
例↓
)
これにより、
『 あ、Excelは「z」という名前のFunctionプロシージャ(=自作関数)のことを、
ちゃんと「z関数」という「ワークシート関数」として認識してるんだ!!』
ということが分かると思います。
(※注:ワークシート関数と認識されるFunctionプロシージャは、
「標準モジュール」に書いたものだけしか、そう認識されません。
シートモジュールやユーザーフォームジュールなどに書いたFunctionプロシージャは、
ワークシート関数としては認識されません。
なお、「標準モジュール」に書いたFunctionプロシージャは、
ワークシート関数として使えるほかに、普通に 色んなプログラムの中で、
色んな場所で呼び出して使えます。)
ではもう後は普通に、以下のように操作します。
(a)「=z」のあとにカッコを打ち込み
(b)A1セルをクリックし、
(c)数式に「,」(カンマ)を打ち込み、
(d)B1セルをクリックし、
(e)数式に「閉じカッコ」を打ち込みます。
(※もちろん、クリックせずに、普通に「=z(A1,B1)」と数式入力してもOKです。)
で、そのあと普通にEnterします。
z関数によって、A1セルの値とB1セルの値が足し算されて、「5」が表示されたと思います。
z関数の第一引数に「A1セル」、第二引数に「A2セル」を指定して
カンマでつなぐことで、数式に「+」演算子を使わなくても、
「A1+B1=C1」(※計算式としては x+y=z。)を実現することができました。
以上のように、標準モジュールに作成したFunctionプロシージャは、
「ワークシート関数」として機能します。
今回は「x+y=z」という、1行のみの、簡単な足し算を題材にしましたが、
これを、
複数行のプログラムを書いて、
「いろいろな条件で複雑に動かして結果を得る」・・・、みたいなことにも使えます。
例えば、
「既存のワークシート関数では実現できない計算をさせる」とか、
「複数のワークシート関数を組み合わせるとき、数式だけでは理解が難しい条件分岐を、VBAで分かりやすくする」とか、
「既存のワークシート関数に更にプラスの動きをさせる」とか、
色んなことができるようになります。
ただし、
「ワークシート関数としての自作関数を作る」・・・、ということについては、
メリットばかりじゃなくてデメリットもあるので、
「やりすぎ」は禁物となります。
例えば(後述しますが)、
「動作は遅くなるので、無駄に多用するのは禁物。特に件数やセル数が多い時。」、とか。
また、
「ワークシート関数としての自作関数を作る」・・・、ということは、
そのファイルが「xlsm拡張子」じゃないといけません。
その理由は、
Functionプロシージャに限らず、そもそも「プロシージャというもの自体」が、
(=つまりVBAプログラム自体が)、
「xlsx拡張子」のファイルには作成できない仕様になっているからです。
となりますと、
ウィルス対策として、xlsm拡張子のファイルの使用が禁止されている職場の場合や、
ウィルス対策上、xlsm拡張子を嫌う先輩社員や上司が多い職場の場合 等々ですと、
人やセキュリティがらみのトラブルを生んでしまうこともあるかもしれません。
また、「アドインファイル」というものの中にも、
Functionプロシージャにて「ワークシート関数としての自作関数を作る」・・・、
ということが可能なようですが、
その場合、他の方にもそのアドインファイルを配布しないと、
結局、
『 アドインファイルの中に作った「ワークシート関数としての自作関数」は機能せず 』、
最悪、ファイルを渡した方のパソコンでは「エラーだらけ」となってしまいます。
なので、やはり、「やりすぎ」は禁物(自分だけで使うほうがいいかも?)となります。
ただ・・・、
でも、そうは言っても・・・、
なんだかんだ言って、
『 最新バージョンのExcelにはあるけれど、
今自分が使っているバージョンには無い”関数”』
を、
もし自作できるなら自作すると、やはり、それなりに便利に使えます。
(※その際の注意事項は後述してます。)
そんな風に、(他の方に渡すことは考えず、自分だけで使う感じで)、
Functionプロシージャでの「ワークシート関数化」を利用してみてください。
********************
では今度は、「z関数」にブレークポイントというものを設定して、
「z関数(=Functionプロシージャ)」が、どのタイミングで、どのように実行されるのか?、を、
見ていきたいと思います。
では、まず、
「Let z = x + y」の行に、
「ブレークポイント」というものを設定します。
VBEのコードウィンドウにて、下図の矢印の場所をクリックしてください。
このような状態にすることを「ブレークポイントを設定する」などと呼びますが、
これは、「プログラムが実行されても、いったん、ここで停止(中断)してね!」という
「目印」となります。
「ブレークポイントとは、そういう目印のこと・・・」と、そういう意味になります。
「ブレークポイント」は、
その場所(=設定した行)以降のプログラムを1行ずつ実行して、
正常に動いているか調査をしたり、プログラミングのミスを発見したいときなどに
利用することが多いです。
ちなみにですが、1行ずつプログラムを実行するには、F8キーを押下します。
そしてそのように1行ずつ実行することを
「ステップ実行」あるいは「ステップイン」と呼びます。
正しくは
「ステップ実行」の中に、
「ステップイン」
「ステップオーバー」
「ステップアウト」
と、3つの実行方法があるのですが、
「ステップイン」のF8キーで1行ずつ実行することを「ステップ実行」と呼んでしまうことも多いです。
本メルマガでもそうしてしまいます。
そのように、プログラムを色々に調査したり、
場合によっては間違い直しをしていく作業のことを、「デバッグ」と呼びます。
「ブレークポイントを設定する」のは、「デバッグ」をするときに、多い・・・、みたいな感じです。
(100%そう、というわけではありませんが、そういうケースがかなり多いです。)
「ブレークポイント」
「ブレークポイントの設定」
「ステップ実行」
「デバッグ」
は、これらもとても重要な用語・操作・作業、なので、
もしVBAプログラミングの初心者の方がいらっしゃったら、ぜひ、覚えておいてください。
そして、必ず暗記してください。
(※しょっちゅうやるのですぐに覚わってしまうと思いますけど(^^)。)
※注
「ステップオーバー」
「ステップアウト」は、Web検索すればすぐにわかります。
またどこかでご説明しますね。
***
では、これから実際に、
まず先に、
『 z関数(=Functionプロシージャ)」が どのタイミングで実行されるのか? 』を、
見ていきたいと思います。
Excelシートのほうに戻って、
C1セルの数式を、C2セルにオートフィルでコピーしてみましょう。
C1セルの数式を、C2セルにオートフィルでコピーしたその瞬間に、
図のように、いきなり画面が切り替わると思います。
これは、
「C1セルの数式を、C2セルにオートフィルでコピー」した瞬間、つまり、
「C2セルに数式を書き込んでそれが確定した瞬間」に、
「z関数」という「Functionプロシージャ」がExcelによって「自動的に」呼び出されて、
そのプログラムの実行の行にジャンプした・・・、
と、そういう流れになっています。
なぜ、「z関数にジャンプした」ということが分かるのか?、というと、
実は、上図のなかの、
「Function z(x As Long, y As Long) As Long」
と書かれたところが、
「z関数の始まりですよ~」ということを意味するプログラムコードなのですが、
この位置から、
「End Function」
までが、「z関数」のプログラムとなります。
で、
「End Function」は、「z関数の終わりですよ~」を意味します。
で、「その z関数の ”始まりと終わり”に挟まれた」、その中間に位置するプログラムコードの
「Let z = x + y」
で止まってる状態なので、
「★★★ あ!いま、z関数の中に居るんだ!★★★ 」
というイメージになります。
初めての方だと、これがすこし、分かりづらいかもしれませんが、
何度もステップ実行をするうちにだんだんと理解できるようになると思いますので、
心配しないでください。
で、今、ブレークポイントを設定した行で止まっている状態です。
止まっている行はイエローになります。
そして、このイエローの行はまだ実行直前で、実行は完了していません。
このタイミングでF8キーを押すと、イエローのコードが実行され、
今度は次の行がイエローになります。
で、今回は、たまたまオートフィルで数式をコピーしましたが、
これは、普通に 手動で数式を書いても、Enterした瞬間に同じ動きになります。
あと、ちなみにですが、
この時点では、1行目の、
「Function z(x As Long, y As Long) As Long」
というプログラムコードは、すでに実行し終わっています。
ブレークポイントよりも前のプログラムコードは、
ブレークポイントの行がイエローになっているときは、全部、すでに実行完了されています。
では、このプログラムを最後まで実行し切ってしまいましょう。
このイエローの状態のまま、F8キーを押してください。
すると、「Let z = x + y」が、実行されます。
そして今度は、その次の行の、「End Function」がイエローになります。
で・・・、
すみません!
今はまだ、F8キーを押さないでください。
ここで再度、F8キーを押すと、「End Function」が実行されて、
C2セルに、「Let z = x + y」の計算結果が表示されますので、
いちおう、念のために、C2セルがちゃんと見えるように、VBEやExcelのウィンドウの位置を
調整してください。
調整が終わったら、
では、F8キーを押してみます。
「End Function」のイエローがとれて、
下図のように、C2セルに、「2+5」の計算結果の「7」が表示されます。
というわけで、余計な説明をダラダラと付け加えてしまってすみませんでしたが、
『 z関数(=Functionプロシージャ)」が どのタイミングで実行されるのか? 』
ということについては、
「★ 数式をいじっているときは ★」
「数式が確定したタイミング」でした。
ただし、ここで、「数式をいじっているときは」と但し書き的に書きましたのは、
数式が確定したのち、
そのあとに、
「A列やB列の値を変更してEnter(確定)した時」も、
z関数は呼び出されるからです。
普通のワークシート関数とまったく同じですね。
今このブレークポイントが設定された状態で、
1行目か2行目の、A列、あるいはB列の値を書き換えてみてください。
再度、Functionプロシージャのほうにジャンプし、
かつ、ブレークポイントの行がイエローになって止まります。
そして、そのあと、F8キーを最後まで押すと、
C列のセルの計算結果が、それに伴って書き変わると思います。
それをご自分でも確認してみて下さい。
結構便利ですよね!!
ただ・・・・
前述しましたが、手放しで喜んでいるわけにもいかず・・・、
繰り返しになりますが、実は、自作のワークシート関数(自作関数)は、
『 基本的に、はじめから組み込まれているワークシート関数よりも動きが遅い 』
というデメリットがあります。
https://www.excel-chunchun.com/entry/worksheet-function-3
によると、普通にFunctionプロシージャを1万回ループするよりも、
ワークシート関数として1万行呼び出すと100~1000倍は、遅いそうです。
(もとからある組込のVBA関数と比較すると、さらにその十数倍か、もっと遅いかも?です。)
ということは・・・、
なんですが・・・、
まず、
全ての行の何らかの値を変えると、
その行の数だけ、自作ワークシート関数(=Functionプロシージャ)が
呼び出されて「再計算」が「実行」されるので、
タダでさえ遅い自作のワークシート関数が、何千行も何万行も実行されると、
「ファイルの動作自体が超重くなる」、
という悲惨なことになりかねません。
そして、
遅くなるだけならまだしも、
「ファイルがぶっ壊れる確率がかなり上がる」、という指摘もあります。
以下のURLをご参考にしてください。
なので、自作のワークシート関数は、多くても数千件以内、
できれば数百件とか、2、3千件以内のデータに対してのみ、使う、
という感じがいいのかもしれません。
いずれにしましても、「デメリットが決して小さくないので実務での利用は慎重に」、
ということを、覚えておいてください。
とはいえ、
僕らのような「初心者が」、「Functionプロシージャ(自作関数)について学ぶ」・・・、
特に、
「文字系の一般データを返す自作関数を学ぶ」、ということには、
「もってこい」、
なので、
ファイルが壊れない程度には、是非、活用、実験、「しまくって」ほしいと思います。
逆に言うと、
Functionプロシージャで「文字系の一般データを返す自作関数を学ぶ」・・・という行為によって、
「VBAの核心」を、
「皆さんが想像する、はるか、それ以上に」、
「相当学べる」、
ということも事実ですので、
「ワークシート関数として実験・実務利用しないのももったいない」・・・、
ということも
「意外と大きい」、
です。
◆ぶっちゃけ、
◆先ほどご紹介したURLの記事ような「デメリット」よりも、
◆「VBAを相当深く学べる・色々実験できるメリット」のほうが
◆「はるかに大きい」、
◆という気すら、僕はします。
◆理由は、「Functionプロシージャでの一般データを返す自作関数」は、
◆「皆さんが思っている以上に」、「本当にVBAの核心」であり、「基本」で、
◆「それと、その呼び出し方さえ深く知っていて、思い通りに自作できれば」、
◆「VBAの真の基礎であるクラスモジュールを作るための”素地”ができあがる期間」も
◆「短くなる」からです。
◆そして、(ワークシート関数としての利用ではなくなりますが、でも、)、
◆VBAの真の「スタートライン」である、
◆「Functionプロシージャでの、”オブジェクト”を返す自作関数」も作れるようになると、
◆「クラスモジュールを作るための”素地”ができあがる期間」は、
◆「さらに」「短くなり」ます。
◆そして、「ある時点からの」「爆発的な上達」に結び付きやすくなります。
▼なので、Functionプロシージャをワークシート関数として実務で使うなら、
▼数百行以内で使うとか、
▼結果が出たら、「値の貼り付け」で、数式を上書きして消してしまうとか、
▼自動計算をOFFにするとか、
▼そのような対策をするだけでも良い(結構使える)・・・と思います。
なぜなら、Functionプロシージャは、
☆FunctionプロシージャとしてVBE(VisualBasicEditor)に表示されてるだけ、
とか、
☆ワークシート関数としては使わずに、
☆普通にFunctionプロシージャとして、
☆普通に各種プロシージャから呼び出して使われる、
とか、
そのような形なら、ファイルが壊れるなんて・基本・ありえない、ですから。
(過激な利用によって、メモリ不足等々で「落ちる」「固まる」ことはあっても。)
▼数十~数百のセル、なら、放置でもたぶん壊れないですし・・・。
▼(もちろんバックアップは必須ですけど。)
ちなみにですが、
ExcelではなくてAccessというデータベースソフトを使用する場合も、
Excelと同じように、
「Functionプロシージャを自作関数として作り、かつ、
それを 列単位で数万行に対して(数式に含めて)割り当てる」・・・、
ということができますが、
Accessの場合はそのせいでファイルが壊れるということはありません。
(※遅くなるのはいっしょで、それは仕方のないことですが・・・。
Accessクエリの場合はあるタイミングで自動コンパイルされるらしく、
コンパイルされたあとなら、多少、速度は改善されるのかも?しれません。
怪しいので一応信用しないように・・・、ご注意ください。(^^))
なので、大量データを蓄積して、そこから
「Excelで細かい計算をするための中間集計表を生成する」、
という場合は、Accessを使うといい(=Accessと連携するとより良い)かもです・・・。
話がまた逸れました。すみません。
でも、
以上のようなタイミングで(あるいは、以上のようなかたちで)、
z関数・・・、すなわち、標準モジュールに書いたFunctionプロシージャは実行されます。
Functionプロシージャがワークシート関数として利用できることで、
結構、VBAが身近に感じられるのではないでしょうか?
初めての方は、なんとなくでも理解できましたでしょうか?
完全には理解できなくても、「あ!」と何かひっかかった部分があるでしょうか?
もしそうだと嬉しいです。
でも、まあ、いろいろ、ちょっと「オーバー」に書きすぎてしまったかもしれないですね。
僕の話は、いついかなるときも、「話半分で」、お読みください。
もしかしたら、
Functionプロシージャを「ワークシート関数」として使う機会は、
現実には、実際には、少ないかもしれません。
が、
でもそれでも、「VBAのとっかかり」、としてはとっても「有効」だと思いますので、
是非、VBAの学習の最初のうちは、活用してみてほしいなと思います。
**************************
では、最後に、
『 z関数(=Functionプロシージャ)」が どのように実行されるのか? 』を、
見ていきたいと思います。
具体的には、
『 A列やB列のセルの値が、「引数」として、どのように「z関数」に渡されていくか? 』
とか
『 どのように、計算結果がユーザー側に返されるのか?』
などです。
あと、おまけで、『 VBAの”悪しき省略” 』などについても、ほんの少し、お話したいと思います。
それではまず、皆さんは、「引数」という用語はご存じでしょうか?
ワークシート関数をある程度使った経験がある方なら、知っていると思います。
初めての方は、これからご説明させて頂きますね。
まず、「引数」は「ひきすう」と読みます。
※「いんすう」、と読む場合もあるそうです。
ただ、「ひきすう」のほうが多いみたいです。
理由は、「因数」と区別するため?とか?
(僕もよくわかっていません。諸説ありのようです。)
また、「なんでそもそも”引数”なの?語源は?」という問いには、
「引用する、引き渡す、から来ている」という説があるようです(これも諸説ありのようです)。
で、
「関数」はよく、
「材料から製品を生み出す工作機械的なモノ」
とか、
「現金を投入して商品をゲットする自動販売機」
などに例えられますが、
その際の、
「材料」や「現金」の部分にあたるのが、
「引数(ひきすう)」です。
(※自販機で例えてる例:https://text.tomo.school/function-is/
※↑数学の話ですが、プログラミングの場合もほぼ似ています。)
で、今回の「z関数」の場合、以下のようなプログラムコードなのですが・・・・、
Function z(x As Long, y As Long) As Long
Let z = x + y
End Function
これの1行目、
「Function z(x As Long, y As Long) As Long」の
「x」と
「y」のことを、
「引数(ひきすう)」と呼びます。
計算のための「材料」ですね。
※補足
基本、「関数を呼び出すとき」は、
「引数」に対して、何らかの「データ」を引き渡し(=割り当て=代入)をしますが、
その「データ」については、
「生データ(リテラル値やオブジェクト式)」でも、
「変数や関数(=関数の戻り値)等」でも、どちらでもOKです。
どちらを「データ」として引数に引き渡し(=割り当て=代入)しても大丈夫です。
今回の実験では、
「z関数」にて、
この
「x」に「A列」の値を、
「y」に「B列」の値を
割り当てようとしています。
今から、それを、実際に見ていきます。
では、2行目まで数式をコピーしましたので、3行目も数式をコピーしたいと思います。
ブレークポイントを
「Let z = x + y」
の行に設定した状態のまま、
C列の2行目から3行目に、ドラッグで数式コピーしてください。
で、このタイミングで、
「Function z(x As Long, y As Long) As Long」の、
「x As Long」の部分の
「x」の真上か、左側をクリックします。
そして、このとき、Excelシートのほうも一緒に見てみます。
「A3」セルの値の「3」が、
z関数(=zという名前のFunctionプロシージャ)の「x」という引数に
自動的に代入されていることが分かります。
同様に、「y」という引数のほうも調べてみます。
こちらも、
「B3」セルの値の「6」が、
z関数の「y」という引数に、自動的に代入されていることが分かります。
「y」のほうは、クリックしなくてもマウスでポイントするだけで
数値が浮き出てくるかもしれません。
(ポイントしても数値が浮き出てこなかったら、クリックしてみてください。)
いかがでしたでしょうか?
まだ、動作確認の途中で申し訳ないのですが、
なんとなくでも、「関数の動き」(「Functionプロシージャ)」の動き)が、
わかりそうでしょうか?イメージできそうでしょうか?
もしそうならうれしいのですが・・・(^^)
このような動きは、
恐らくですが、
「ワークシート関数」でも同じような動きになっていると
思って頂いても、おおむね良いのではないかと思います。
VBAのワークシート関数群も、
「C++」という言語かどの言語で書かれているのか分かりませんが、
その正体は、何らかの形での「VBAのFunctionプロシージャに相当するもの」のはずですので。
(つまりはワークシート関数も、「文字で書かれたプログラム」、ということです。)
では次に進めたいと思います。
こんどは、
ブレークポイントを設定した、イエローの行の「xとy」について調べてみます。
ここでは、
F8キーでの1行実行はまだしないでおいてくださいね!
今度は、
「Let z = x + y」
という、
「z関数」のメイン部分の、計算式の「x」と「y」を、
それぞれ、マウスでポイントしてみます。
先ほどと同じように、
「x」には、A3セルの値の、「3」が、
「y」には、B3セルの値の、「6」が、
浮き出てくると思います。
(浮き出てこなかったら、「x」「y」を直接クリックしてみてください。)
下図のようになります。
以上のことから、
セルから、z関数の引数→z関数のメイン計算、・・・、
というふうに、「データがリレーされている」ことが分かると思います。
そして、ブレークポイントのイエローの行は、また実行されません。
なので、
引数の「x」に「3」、
引数の「y」に「6」、
が準備(セット)されて、
今まさに、メインプログラム(z=x+yの計算)が実行されようとしている直前の状態です。
では、
「まだ実行されていない」ということを確認するために、
「z」の値を確認してみましょう。
イエローの行の、「z」をマウスでポイントしてみてください。
「z=0」という風に、「0」という答えが浮き出てくると思います。
「x」と「y」にはそれぞれ、「3」と「6」という値がセットされていますから、
もし計算が実行されていれば、「z」は「9」が浮き上がってくるはずです。
(「z=9」というかたちで。)
それが、まだ「0」(=数値用の変数の初期値。)のままなので、
ということは、
「まだ計算はなされていない」・・・、
と判断できます。
(※「初期値」とは、「まだ何もなされてないときの値」、という意味です。
「何もなされていないことを確認」したり、
「いったんご破算にしてやりなおす」ときなどに利用する値です。)
◆「いちいち」、こんなことを「ちまちま」判断して進む・・・。
◆これは、これまでプログラミングを経験したことが無かった方の目には、
◆「非常に面倒くさいように映る」かもしれませんが、
◆このような面倒くさいことを「いちいち」、「ちまちま」、「1つ1つ」、
◆「確認」「判断」しながら進むのは、
◆「どんなプログラミング言語」であっても、
◆「非常に重要なこと」、
◆ですので、
◆どうか、このような、「いちいち」、「ちまちま」
◆「重箱の隅をつつくようなこと」に、慣れてください。
では、最後に、残りのプログラムを1行実行(ステップ実行)していきましょう。
「Let z = x + y」
の行がイエローの状態のまま、F8キーを押してみてください。
これで
「Let z = x + y」
が実行されました。
(※Letは省略可能なので、z=x+yが実行されたのと同じです。
ただ、「省略」はVBAの悪しき慣習で、あまりよくないことです。)
「End Function」の行にイエローが移動しましたね。
で、ここで、
ボルドーの行の「z」にマウスをポイントしてみます。
「z=9」と浮き出てきました。
実行前は「z=0」でしたね。
でもここにきて、「z=9」になりました。
ということは、
「x+y」、すなわち、「3+6」、が実行されたということですね。
また話が逸れますが、
このように、ステップ実行では、
マウスで変数をポイントするだけでも、
「この値が変化したから、その1行の実行が完了した」とか、
「この値が初期値のままだから、その1行ははまだ実行されていない」とか、
「どの変数がどんな値か?」など、
色んなことがわかります。
よって、デバッグ(不具合修正)するときや、その他のときにもすごく役に立ちます。
イミディエイトウィンドウと併用すれば、変数まもちろん、
それを含めた「各種」の「式」の値もわかりますし、
ウォッチウィンドウと併用すれば、その「式」の型も簡単にわかります。
ウォッチウィンドウでは、オブジェクトの状態もわかりますし、
そのほかのチェック方法も用意されています。
そして、「VBAの上達」はイミディエイトウィンドウはもちろん、
でもそれよりも、「ウォッチウィンドウの使用頻度」に「正比例」しますので、
是非、ウォッチウィンドウの使用方法、使用意義を勉強してみてください。
4流以下の著者が書く市販書籍のいいかげんな知識よりも、
「よっぽど」、
「はるかに」、
「あてになる」、
ということもあります。
恐らく「他の言語に移りやすいくらいの知識を得る」にも、
イミディエイトウィンドウよりも、ウォッチウィンドウのほうが色々を便利だと思います。
(※もちろん、イミディエイトウィンドウも重要です。)
話をもとに戻します。
今、関数名の「z」に計算結果が代入されましたので、
このあと、一番最後の「End Function」が実行されると、z関数に代入された値が、
C3セルに返ります(今回の場合、「返る」は「セルに表示される」と同じ意味になります。)
そのほか、この短いプログラムから、色んなことがわかると思います。
(また今号以降でご説明させていただきます。)
いかがでしたでしょうか?
「z関数」は、
「x+y=z」という意味あいの、
「Let z = x + y」という1行のプログラムだけを実行する、
小さな、小さな、自作のワークシート関数でしたが、
なんとなくくでもその「動き」が理解してもらえましたでしょうか・
もしそうなら、本当にうれしいです。
でも、本当に、この
「関数の、引数を用いて何らかの処理をして、その値(答え)を返す・・・、という、その動き」
「Functionプロシージャとその基本事項」、
「Functionプロシージャをワークシート関数として使える(注意事項はありますが)」
「F8キーを押下しての、1行ずつのコード実行(ステップ実行)」は
超重要です。
◆「それさえわかれば、VBAの半分以上は理解できたようなもの」
◆というくらい、
◆「重要」です。
クラスモジュールの自作のプロパティも、その動きさえわかっていれば、
「中高生でも」、簡単なモノなら「すぐに」作れます。
「関数の、引数を用いて何らかの処理をして、その値(答え)を返す・・・、という、その動き」は、
「ExcelVBAの中にああらかじめ組み込まれている1000個以上の命令単語」のなかの、
・プロパティも(特にPropertyプロシージャ=ゲッター、セッター、でのプロパティも)、
・メソッドも、
・Office共用(=WordやAccessも共用)のVBA関数も、
・Excel専用のVBA関数も
・Excel独自の、ワークシート関数も(=WorksheetFunctionオブジェクトのメソッド)も、
その「全部」において、
それぞれの、3割~6、7割くらいの命令単語にあてはまる動きでもあるからです。
(引数がないタイプの命令も多いので、6割くらいかも?もちろん検証してません(^^))
さらには、
関数だけではなく、
「演算子とオペランド」で構成された「式」や
「その他の各種の式」、
においても似たような動きになります。
最終的には、
「VBAの命令やプログラムの6~7割以上」は、
「関数の、引数を用いて何らかの処理をして、その値(答え)を返す・・・、という、その動き」、
と「同じ」か、「似ている」ということになります。
前号でも
「最初から」
「核心」
「行きます!」
と書きましたが、そういう意味での「核心」です。
◆「それほどに」「重要」なのに、
◆VBAレジェンドやチルドレン、Yotuber、ライター、出版社、巷のVBA講師、などが、
◆なぜ、「自作関数」や「Functionプロシージャの真の基礎」について
◆なぜ、Excelが出て「20年以上も」、
◆なぜ「一冊も本を出さない」のか?、
◆なぜ「放置のまま」なのか?
◆僕には、その理由が「さっぱり」、
◆わかりません。
なお、
『 VBAの”悪しき省略” 』について、書くつもりでしたが、
長くなりすぎたかもしれないので、次回以降に持ち込知したいと思います。
**************************
話がまたそれますが、でも重要なことなので書いておきます。
これまでご紹介してきましたように、
VBAでは、F8キーでのステップ実行・デバッグ局面で、いろんなことがわかります。
ウォッチウィンドウなどを併用で使うと、もっともっといろんなことがわかります。
ステップ実行・デバッグ局面では、
「多くの市販書籍やWeb記事よりも、正確なことがわかる」ということが多いです。
(特に、ウォッチウィンドウを使った場合にそれが顕著、です。)
◆なお、基本、ステップ実行・デバッグなどできなければ、
◆「何もわからない。成長しない。」という確率が上がってしまいます。
VBAが他の言語より優れているとすれば、このデバッグ機能と、
逆に進化が2000年ごろから止まっているので、
「言語自体の難易度がまったく上がっておらず」、
よって、デバッグも「変に難しくない」、
という点が挙げられるかもしれません。
他の言語では、ここまで明瞭に、簡易的に、便利に、デバッグ関連機能の操作や
変数の値の調査が、多分ですが、できません。
(VB系の言語なら、似てるかもですが、操作が少し高度になると思います)
例えば今のVisual Basicなどでは、もう少し、デバッグのやり方が難しいと思います。
(やったことないので、Web情報だけでテキトーなこと書いてます。すみません。)
でもVBAなら、デバッグでも、
今回お示ししたように、どの変数にどんな値が入っているかが
一目瞭然ですし、オブジェクトのことも色々と「目にする」こともできます。
ウォッチウィンドウのように「式」が返す「値」のチェックや、
オブジェクトの状態の確認、など、かなり突っ込んだことも調べられます。
(オブジェクトの場合、「+」アイコンを展開していくだけで簡単に!)
なので、
「VBAでデバッグ方法を学ぶ」ということ自体が、
「他言語の学習前の練習」にもなります。
「どこにエラーがあるか、あたりが付けられるようになります」から。
例えば、最近はAIによって、プログラムコードが自動生成される時代になりましたが、
「デバッグ方法を学んでいれば」、ChatGPTが作ったコードの
どこが間違いで、どこが正しいかも、わかります。
なので、それプラス、
学び方さえ間違えなかったら、つまり、
「クラスモジュールやFunctionプロシージャありきでまずそれが先」という学び方なら、
VBAは、「他の言語にも移行しやすい」言語だと言えます。
つまり、他の言語を学習する前の「練習」に十分になります。
他の言語でも、脳内イメージを作りやすくなります。
もちろん、ヘルプもオブジェクトブラウザも読めるようになりますし、
値型、参照型の変数やデータのこともわかりますし、
オブジェクト指向プログラミングの、ゲッター、セッター、
コンストラクタ、デストラクタ、などをはじめ、
その他のことも分かると思います。
(自分も大してわかってはいませんが)
ただし、
「クラスモジュールやFunctionプロシージャありきでまずそれが先」ではなく、
逆に、
今のVBA業界のレジェンドやそのチルドレンたちの市販書籍やYoutube動画のように、
「ライブラリの使い方のみの、行き当たりばったりの絆創膏プログラミングばっかり」で、
「逆引き辞典ばかり引くような」
「シートはこう、セル範囲はこう、2つのブックがあるときはこう」という「だけ」の、
「クラスモジュールや、Functionプロシージャやその呼び出しの基本」すらやらないような、
そんな状態では、
そもそも、ウォッチウィンドウの利用意義すら理解できず、
オブジェクトブラウザなんて当然読めず、
もちろん、クラスモジュールなんて(超簡単なものなら中高生でも作れるのに)、
超簡単なものすら作れるわけもなく
「ヘルプなんて何が書いてあるかさっぱりわからない」なんていう低能っぷりを自慢して
ヘラヘラする、
「自分で自分を貶める、本当に低知能で残念な人」
「間抜け」
に成り下がります。
「VBAで他の言語を学習する前の練習」なんて、もちろんできるわけもありませんし、
他のオブジェクト指向プログラミングを学習している人からは、
永遠にバカ、カス、クズ、扱いされるだけ、という、そういう残念なことになります。
まあ、「VBAはある意味そういう言語(バカにされても全く問題ない言語)」ですから、
別にそれでもいいといえばいいのですけど、
でもまあ、せっかくやるなら、
他の言語に移行しやすいようにくらいにはなれてたほうがいいとは思います。
ですので、
今のVBA業界のレジェンドやそのチルドレンたちの市販書籍やYoutube動画のように、
「ライブラリの使い方のみの、行き当たりばったりの絆創膏プログラミングばっかり」で、
「逆引き辞典ばかり引くような」
「シートはこう、セル範囲はこう、2つのブックがあるときはこう」という「だけ」の、
「クラスモジュールや、Functionプロシージャやその呼び出しの基本」すらやらないような、
「いつまで経っても実力が付かない」、
そんな学び方からは、オサラバしたほうがいいようには思います。
ですので、
今のVBA業界のレジェンドやそのチルドレンたちの、市販書籍やYoutube動画には、
十分に、ご注意ください。
(といいつつ、僕自身も、そいつらと大差ない説明しかしてないかもです。
なので、これも先に、謝っておきます。ごめんなさい。)
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
----------------------------------------------------------------------
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
発行システム:『まぐまぐ!』 http://www.mag2.com/
配信中止はこちら https://www.mag2.com/m/0001691660.html
----------------------------------------------------------------------