diary主にVBAネタを扱っているブログです。~GoToプログラミングVBA今回は、ただのお遊びである。役に立たないばかりか、下手に参考にすると有害である。VBAにはGoTo命令がある。GoToのことではなく、普通のGoToだ。「活用しよう」などと思ってはいけないが、遊びでコードを作る分には頭の体操になって良いかもしれれない。GoTo命令を使うと、任意のラベルにジャンプできる。ラベルは文字列にコロンをつけたものだ。これを使えばループ命令を使わずにプログラムが書ける。いうより、コンピューター内部ではループ命令はジャンプに置き換えられているので、GoToを使った方法はよりマシン語に近い書き方ということになるかもしれない。ラベルを使えば、条件分岐はIfブロックではなく単行のIfで事足りる。※これもマシン語に近い書き方であるが、マシン語の方は比較結果を一度フラグレジスタに入れてからジャンプする。GoTo使ってFizzBuzzを書いてみた。Subこれをフローチャートへ落とし込むと、以下のようになる。(フローチャートは久しく描いていないので厳密に合ってるかどうかは不明)これはまだラベルLに収束するから分かりやすい方だが、GoTo命令はどこへでも好きなラベルにジャンプできるので、その性質をフル活用してしまうと、フローもあさっての方向へ飛んでいってしまう。ある程度大きなプログラムで広範囲にわたってGoToが使われた場合、もはや作った本人ですら読めなくなることが多い。ソースコードは絡みに絡み、おいしいスパゲッティの出来上がりというわけだ。これが、GoToを使うなといわれる所以である。次にGoSubという命令を紹介する。この命令はラベルに飛ぶところまではGoToと同じだが、Returnという命令で呼び出し元に戻ってくる。原始的なプロシージャのようなものである。今度はこれを使ってFizzBuzzを書いてみた。一部ループと終了処理にGoToを使用しているが、分岐はGoSubのみで実装した。Sub※面倒なのでフローは割愛。コードは長くなったが、GoSubは必ず元の場所に戻ってくると分かっており、あさっての方向にジャンプする心配が無い。(飛んだ先でさらにGoTo島流しなんてのは無いという前提)プログラミングの黎明期には、GoSubの登場は画期的だったことだろう。今ではプロシージャの分割やIfブロック、Loop命令、For命令などがあるのでこれらの命令を使うことは無い。便利に使っている「あの機能」が無かったらどうなるんだろうと考えるのも楽しい。皆さんも一度、チャレンジしてみてはどうだろうか。普段当たり前に使っている機能の、本当の価値が分かると思う。大事なことなので二度書くが、決して「活用しよう」などと思ってはいけない。※GoTo擁護派というのもあるらしく、そのあたりを学ばれた方がメリット・デメリットを踏まえて使うのはアリかもしれません。少なくともプログラミングの腕によほどの自信がなければ、実務コードでは使うべきではないと思います。IfやForの終了構文を自動補完するマクロ※タイトルにつられた皆さん。インデント徹底解説!VBA初心者のコードを見ると、インデントが乱れていることが多い...2017-09-05VBAで関数型プログラマーの思考法を学ぶこれは私に関数型言語の素晴らしさを教えてくれた本である。はてなブログPro弓道と英語が趣味のVBAプログラマーです。大阪でシステム運用の仕事をしています。このブログに掲載しているコードは利用規約の範囲で自由にお使いください。VBAの無料入門教材を配布していますので、VBAを初めてみたい方、ぜひお立ち寄りください。Amazonアソシエイト・プログラムの参加者です。はてなブログをはじめよう!t-homさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。