今回はVBAで好きな位置にブレークポイントを設置して、ストレス無く開発を進めるためのテクニックを紹介します。前置きなぜ好きな位置にブレークポイントを設置したいのかループから抜けた直後で止めたい時ブレークポイントが設定できる箇所VBAにおけるコロンの意味ラベルとしてのコロンマルチステートメントとしてのコロンコロンだけを書いたステートメント参考まとめ前置き昨日の記事の最後で「MsgBoxによるデバッグモードの入り方」を紹介した。www.excel-chunchun.comそこでは「コロン」だけを記載した行にブレークポイントを設定して見せた。"MsgBoxはCtrl+Pause/Breakで中断できます。Subこのコロンだけの行を設置する理由ブレークポイントが設置できる場所とできない場所の違いは何か一体このコロンは何者なのかを掘り下げて説明していく。好きな位置にブレークポイントを設置したいのか実はVBAでブレークポイントが設定できる箇所には制限がある。その詳細については後述するが、コロンだけを記載することでコードを汚さず好きな位置にブレークポイントが設置できるようになる。コロンという形で残す事で、「ここにブレークポイントを入れると良い」という意図をソースコード上に示す事ができる。このような需要は一定数存在するようで、代替案として無意味なコードを記載する人もいるのだという。i=iしかし、本題のプログラムの中にこのようなコードを仕込んだ場合、これが意味のあるコードなのか、無意味なコードなのか見分けがつきづらい。最悪の場合、バグの元となる恐れもある。私も昔はStopを記載して、コメントアウトして対応していた。Stop↓'Stopしかし、コメント/コメントアウトが少しメンドクサイ。(一応、ショートカットキーを登録しているが)www.excel-chunchun.com人によっては、ソースコードが変わる事で差分を比較した時に不一致となるのが気になるかもしれない。コロンだけの行を使えば、自動的に左端に寄せて記載してくれるので見やすいし、ブレークポイントが設定できるので重要なソースコードを汚さないで済ませられる。:Stopのようにブックを閉じても半永久に停止させる事はできないが、通常の開発ではブレークポイントで十分なはずである。(まあVBAのバグでブレークポイントがブックに記憶されて、開き直しても解除されない時があるが)で、具体的に何時使うかだが、例えばこんな時に有用である。通常、NextやLoopにブレークポイントを設置すると、繰り返しのたびに中断が発生するため、開発者がやりたい「ループから抜けた直後で中断」ということができない。そんなときに、ループから抜けた直後の位置にコロンがあると、ブレークポイントを入れる場所に困らない。'←ここでブレークポイントを入れると10回も止まってしまう。'ここから先をデバッグしながら追記したい。'←コロンが無いとココで止めるしか無い。その先で止めてから、次のステップを目的地までドラッグしても良いのだが、その手間を省くことができる。テスト中にループを抜けた直後に一旦止めて、もう一度ループを回したい時に、次の処理が始まる前に止めるという時にも使える。開発中はもちろん、テスト中にも便利なのである。※単に処理の切れ目が明示されて分かりやすいというだけ。ブレークポイントが設定できる箇所VBEではF9でブレークポイントを入れる事ができ、プログラムがブレークポイントの設定された行に到達するとデバッグモードが始まるのは知ってのとおりだ。ブレークポイントは基本的にプログラムが何らかの処理をする箇所にしか設定できないようになっている。空欄の行、Dim変数の宣言、Const定数の定義、ラベルではブレークポイントを設定できない。それら全てを網羅し、○×を付けたのが下記のプログラムだ。基本的にブレークポイントが設置できるかどうかと、F8でステップした時にその行で止まるかどうかは、完全に一致している。「コロンだけの行」が便利なのは分かったが、一体このコロンは何者なのだろうか。それを理解するためには、まずはVBAにおけるコロンの意味を再確認する必要がある。上記のプログラムを見て明らかなように、コロンには2種類の役割で使う事がある。'×ラベルとは、Goto文でジャンプするための行き先を示す名前である。多くのプログラマから忌み嫌われているGoto文ではあるが、VBAではエラー処理の為に避けては通れない機能だ。下記のプログラムは「意図的にエラーを起こしエラーが起きた場合はn=1を代入して元の流れに戻る」というサブルーチンが組まれている。'通過しないなお、ラベルそのものはブレークポイントを設定できないため、エラー直後でデバッグモードに入りたい場合はn=1の部分に設定することになる。ラベルの後に更にコロンをつければブレークポイントを設置出来るようになるのも、覚えておくと便利かもしれない。積極的に使うのは褒められた行為ではないが、知っていると便利なのがマルチステートメント*1である。以下のような場面でマルチステートメントを使うのは大変有用である。'○そう、かの有名なイミディエイトウィンドウなどで動かすワンライナーには必須の技術である。www.excel-chunchun.comなお、イレギュラーなケースとして、If文の場合はコロンを付けなくてもマルチステートメントになる。○|○ただし、マルチステートメントには少しだけ不便なところもある。F8でステップした場合はそれぞれのステートメントで止まるのだが、ブレークポイントを設定した場合は常に行の先頭のステートメントで止まってしまう。意図的に二番目のステートメントで止める事はできない。しても止めたいならば、Stopを追記するしか無いと思われる。'○コロンの意味は先の通り2種類だけだ。ここまでで分かった挙動を整理すると、以下のようになる。ラベルだけの行はステップしない。マルチステートメントの行はそれぞれがステップできる。コロンだけを書いた行では、1回しかステップしない。コロンだけを書いた時、インデントが消えて左端に寄せられる。ここまで紹介しなかったが、実はこのような書き方も可能だったりする。今までのルールを踏襲して、ラベルはステップしないが、代入文はステップする。○この場合のコロンは、ラベルとしてのコロンなのか、マルチステートメントとしてのコロンなのか分からりづらい。ラベルにはコロンがないとラベルと認識できないことから、ラベルとしてのコロンだと見て間違いないと思う。ここまで来ると、「コロンだけを書いた行」が何者か分かってきたのではないだろうか。無名ラベルに続けて記載した空のステートメントである。無名ラベルなんてものが存在するのかは知らないけれど、空のステートメントは確かに存在する。変数の宣言の直後にコロンを入れて、その先の処理を何も書かないということもできる。すると、何も処理をしないにも関わらずブレークポイントは設定できるし、F8でステップするようになるのである。'○また、ラベルに対してはマルチステートメント用のコロンを付けなくても良いという過去の風習があるので、そこから考えてもコロンは無名ラベル用なのではないか、と想像する。Sub実行結果ラベル:10ラベル:20ラベル:50ラベル:60繰り返しますが、これは私の想像であり、正しい結論とは限りません。実はこの内容は前にツイートしたことのあるテクニックだったりする。マイナーなテクニック?よくブレークポイントを入れるトコロには、「コロン」だけの空白行を置いておくというルールを定めておくと、後々のデバッグがやりやすくなる特にループを抜けたあとで止めたい時に有効。2019まとめというわけで、コロンだけの行を処理の合間に挟んでおくと、僅かなストレスが軽減されるとともに、デバッグがしやすくなりますよ。くだらない話を最後まで読んで下さった方は、本当にありがとうございます。Part3游ゴシック大嫌いな同志諸君!お久しぶりです。今回はオートフィルタの設定範囲から任意の列のデータ部のRange...www.excel-chunchun.com週1回の更新を目指して活動中です。ヶ月)私がExcelを使っていて気になったことを記事に書いていきます。VBAを使い初めて、もう10年ほど経ちましたが、楽しくて楽しくて毎日自宅でもVBA書いてます。自作PCとかサーバー立てたりするのも好きなのでPCとかサーバーのことも書くかもしれません。記事の元ネタは主にTwitterの方で呟いてますので、最速で情報を仕入れたい方は是非フォローしてください。part12019-11-12SpecialFoldersの引数にString型変数を指定すると意図した通りに動かない2019-11-03ワークシート用ユーザー定義関数は使い方を誤ると危険である2019-10-28VBAのコメントの書き方の試行錯誤2019-10-27VBAでの広域コメントアウトの代替案2019-10-26VBAで戻り値のある複数シートをコピーする関数を作ってみた2019-10-22Outlookでメール受信者がローカルパスをクリックできるようにUNCパス化するマクロを作ってみた2019-10-21Outlookでメール受信者がローカルパスをクリックできるようにするマクロを作ってみた2019-10-20VBAでWin32APIの64bit対応自動変換プログラムを作ってみた2019-10-06ワークシート用ユーザー定義関数を揮発性にする方法2019-10-04VBAによる安定したワークシート用ユーザー定義関数の作り方2019-10-02VBA関数のライブラリ名やモジュール名の省略を検知するアイディア2019-09-29EnumWindowsを使って別プロセスのExcelを取得してみた2019-09-24エクセルマクロで野生のマグロを駆逐するミニゲームを作ってみた2019-09-19VBAでIIF関数が全ての項を評価してしまうのは当然である2019-09-16VBAの裏技?コロンで好きな位置にブレークポイントを設置する2019-09-15VBAのStopとDebug.Assertステートメントの違い2019-09-13VBAのInStr関数の不思議な挙動について調べてみた2019-09-08VBAで文字列中の文字をカウントする関数を作ってみた2019-08-31VBAで環境に依存しないWindowsMediaPlayerの使い方もっと見る最新記事(ハードウェア)2019-10-31Realforceを買ってみた。TS-932X-2Gを購入しました。広告プライバシーポリシースターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。