VBAのコンパイルとコンパイルエラーと実行時エラーについて

覚え書きです
5
吉田拳/Excelで、経営は強くなる @sugoi_kaizen

@wafu_spaghetti 記述エラーの位置づけは悩みました、確かに書いてる時点で先頭文字が大文字にならなかったり行全体が赤くなる現象は大事な着眼点でそれは伝えたいと思い、そこで記述エラーをコンパイルエラーに含めるとすっきりするな…と思った次第でした。

2022-09-14 13:28:55
和風スパゲティ @wafu_spaghetti

@sugoi_kaizen なるほどです!この辺は難しいですよね~VBAならではの現象も多くて。 「プロパティやメソッドの組がおかしい」は普通コンパイルエラーなんですが、実行時エラーになる例外がRange,Cells,Worksheetsでそれもう例外じゃないじゃんって感じなので、いつも説明に悩みます(´∀`;)

2022-09-14 13:34:30
吉田拳/Excelで、経営は強くなる @sugoi_kaizen

@wafu_spaghetti 確かにこのエラーはコンパイルエラーに分類したいですよね…でも実行行で初めて起きる…なのでその挙動とこのエラー表示をもとに分類してみたって感じです。正直分類の理解すら必要ないとは思ってたんですけど、試験対策用の解説考えてたら出てきた分類って感じです…w pic.twitter.com/Pol7eKQnll

2022-09-14 13:41:59
拡大
和風スパゲティ @wafu_spaghetti

@sugoi_kaizen 実務やるうえでは分類の理解が必要になるのはだいぶ先ですもんね。 資格試験って実務と学問の間にあるから難しそうです(´∀`;)

2022-09-14 13:51:27
Excel VBA Diary (OneDrive問題に挑戦中) @excelvba_diary

@sugoi_kaizen @wafu_spaghetti この会話続いているのかな? 細かい事は置き、Pコードに変換するのがコンパイラー、Pコードを実行するのがインタープリターと大括りの理解でよいと思います。プロシージャ名のダブりなどの文法上のエラーはPコード変換時にわかる。一方、値が0の変数で除算するのはPコードを実行しないとわからない。

2022-09-14 16:37:33
和風スパゲッティのレシピさん講座
和風スパゲティ @wafu_spaghetti

挙動の違いを簡単に説明すると、 コンパイルエラー:どうあがいてもエラー 実行時エラー:やってみたらだめだったエラー でしょうか。 Worksheets.Adddd ↑そんなメソッドないからコンパイルエラー Worksheets(10).Activate ↑いけるときもある。シートが5枚しかないと実行時エラー (つづく) twitter.com/sugoi_kaizen/s…

2022-09-14 13:39:34
吉田拳@Excel作業代行の㈱すごい改善 @sugoi_kaizen

VBAのエラーの分類、大きく分けてこの2つ、ってことでいかがでしょうか… pic.twitter.com/SgdFX7pYop

2022-09-14 04:50:26
和風スパゲティ @wafu_spaghetti

IfがあってThenがないのはコンパイルエラー If ○>△ Then の比較に失敗("あ">1になったとか)するのは実行時エラー すぐ出てくれるコンパイルエラーに対して、実行時エラーがその行まで実行してしまうのは、 実行時エラーは「いけるときもあるからその行まで行ってみないとわからない」からです。

2022-09-14 13:41:12
和風スパゲティ @wafu_spaghetti

さて基本の説明はこれでいいんですか・・・ VBAの主役「セル(Range,Cell)」は、Valueを省略できる仕組みがあり「Range("A1")と書いてもセルだとは限らない(値かもしれない)」ため、 Range("A1").Adddd これがコンパイルエラーになってくれない(実行時まで気づけない)という罠があります。

2022-09-14 13:45:07
和風スパゲティ @wafu_spaghetti

似たようなので、 Worksheets(1).Coooopy も、諸般の事情(実はこの1は引数じゃない)でコンパイルエラーになりません。 「そんなプロパティないよ?」は典型的コンパイルエラーなんですが、VBAでは実行時エラーで出ちゃうことが多いので理解の妨げになります。 お気を付けください(`・ω・́)ゝ (おわり)

2022-09-14 13:47:54
吉田拳/Excelで、経営は強くなる @sugoi_kaizen

ただ、On Errorによるエラー対応が実行時エラーに対してのみ有効でコンパイルエラーでは機能しない、という説明のためにこの分類の必要性を理解したところです。 余談ですがいまだに On Error Resume Next を On Error Next Resume と毎回語順を間違えてしまいます… 学習能力… twitter.com/sugoi_kaizen/s…

2022-09-14 13:48:31
吉田拳/Excelで、経営は強くなる @sugoi_kaizen

VBA試験の公式テキストの記載、 「On Error Gotoを使うとどんなエラーが起きてもラベルに処理を移動する」 …移動するのは実行時エラーのみでコンパイルエラーではラベルに移動しないですよね。ちょっとこの記述は見直されたほうがよいのでは。 これは意見の相違ではなく事実確認なので。

2022-09-16 01:56:06

説明にはイレギュラーがつきもの

ほえほえ@スプシマン @hoehoe1234

結局、Pコードを生成できるかどうかが分かれ目で、Pコードを生成できないのが静的エラー、Pコード生成後は実行時エラーみたいな区別でいいとおもうけど、Pコード生成後もRun使うと例外は切れるのでon error では拾えないという事象はありますが、まあどうでもいいかな?みたいなところですw

2022-09-16 17:18:02
ちゅん🐤 @KotorinChunChun

VBAのエラーには実行時エラーとコンパイルエラーがあるんだけど、 コンパイルエラーをさらに細かくいうと実行前に起きるエラーと、なぜか実行中に発生するエラーがあって、 実行前に起きるエラーをさらに細かくいうとプロシージャー内のものとモジュール、プロジェクト全体のものがあって、文字数

2022-09-14 07:31:37
ちゅん🐤 @KotorinChunChun

「on error gotoの行が実行された後にエラーが発生したら」という前提があるので、コンパイルエラーの場合はon errorの行に到達すら出来ないままエラーが起きている……はずなんだけど、プロシージャーが変わ毎にコンパイルされるから、こういう矛盾が起きてしまうのかな twitter.com/sugoi_kaizen/s…

2022-09-16 06:48:46
ちゅん🐤 @KotorinChunChun

コードを書いた順(開発者視点) から 実際に実行された順(コンピュータ視点でメモリの状態を意識)に切り替えて考えないとハマるかも

2022-09-16 06:51:53
ちゅん🐤 @KotorinChunChun

あと、ある行を実行して初めて発生するコンパイルエラーもあるから困るな😅 このエラーはon errorで検知できるんだっけ?記憶が曖昧だ。

2022-09-16 06:53:53
ほえほえ@スプシマン @hoehoe1234

@KotorinChunChun 元文は明確に「実行時」なので特に問題はないように思いますが、ちゅんさんがおっしゃるように名前空間の不整合(同じ関数が複数モジュールにあり、さらに違うモジュールから呼び出す場合)などは実行時エラーですがこれは文法エラーに属するのですが確かに実行中なので元記述はちょっと不正確ですかね

2022-09-16 15:16:47
ɐʇıɹoɯ @morita_desu

@sugoi_kaizen 実行時エラーでも、『エラー発生時に中断』にチェックが入ってると中断しますよね。 これ他言語ならエラー時に継続実行でかないのにVBAだけできる、VBAのデバッグ機能として最も優れた機能だと思ってます。

2022-09-16 08:07:05
VBA100本ノックとエクセル問題 @yamaoka_ss

親側(呼び出し元)でOn Errorが記述されていても(つまりOn Errorは実行されていても)コンパイルエラーは捉えられないので、説明の仕方によっては矛盾が出るかも。 On Errorは実行時エラーを捕捉(つまりコンパイルエラーは捕捉しない)するものです。 twitter.com/KotorinChunChu…

2022-09-16 15:02:18
VBA100本ノックとエクセル問題 @yamaoka_ss

そうか、実行時エラーを実行した時にでるエラーと捉えてしまうと矛盾がでるのかもしれない。 ・コンパイルエラー ・実行時エラー 2つに分類した時、VBAは全体をコンパイルしていないので誤解が出てしまうのでしょうね。 なので、先日の話しで「コンパイルしてから実行」という説明ではダメだと思う。

2022-09-16 15:26:20
ちゅん🐤 @KotorinChunChun

@yamaoka_ss そう、そうなんです。 名前通りの意味で理解しようとすると、結構な確率で騙されるんです。 これはコンパイルエラーになるから。 これは実行時エラーになるからon errorで〜。 という説明では本質ではなく丸暗記を求めることになるので、きちんとした理解にはカナリの文章量が必要になるという……

2022-09-16 19:22:20

個人的まとめ

ちゅん🐤 @KotorinChunChun

実行時エラーとコンパイルエラーの説明で混乱しがちな部分のまとめ 「実行時エラー」は「コンピュータが特定の1行を実行した時」にエラーが出たことを意味している。 ≒「F5実行を押した時」という意味での実行時ではない。 正確に理解するには、F8ステップ実行で体験した方が良さそう

2022-09-17 21:02:44