Excelの終了

Application.QuitメソッドはExcelを終了させるメソッド。未保存確認も行わずに終了するコード

'Excelを終了する
Application.Quit
'Excelを終了する(未保存の確認も表示しない)
Application.DisplayAlerts = False
Application.Quit

Excelを終了するには「Application.Quit」メソッドを使用します

Excelを終了するため、開かれているブックがすべて閉じられます
未保存の場合は保存確認のメッセージが表示されます
未保存でも構わないので強制的に終了させる場合には2つ目のコードを使用します
「DisplayAlerts」プロパティをFalseに設定をしています

Excelの強制終了についての注意点

基本的にはユーザーフォーム主体の処理を使用している場合にワークシートを操作されないためにユーザーフォーム終了と同時にExcelも終了させるといった場合に使用します

ただ心構えとして持っていて欲しいのが、処理の終了が非常に曖昧なコードであるということです

というのもExcelが終了するということは、VBAの処理もその時点で強制的に終了しているはずです
なのでSubプロシージャなどがEndSubまで走っていない形になります
変数などプロシージャが終了した時点で解放されるといった動きをするものなどが、その終了が曖昧なためその解放自体も曖昧になる可能性があるということです

とはいえ、標準のメソッドであるためこのコード自体でバグが生じるということはないと思いますので心構えとして、そういう曖昧な状況を生んでいる可能性があるというのを持っておいてもらったほうが良いかなと思います

Excelの再計算の実行(全ブック)

Application.Calculateメソッドは開かれている全ブックに対して再計算の実行を行います

'ブック全ての再計算実行
Application.Calculate

再計算を行うには「Application.Calculate」メソッドを使用します

Excelに対して再計算の実行を行いますので、Excelに開かれている全てのブックが対象となります

基本的には処理中再計算を手動にして停止している状態で、一度再計算を実行しておきたい時などに使用します
自動計算を処理中に手動計算に切り替えている場合、自動計算に設定を戻せば再計算されるので、このメソッドは必要ありません

なお指定のブックのみを再計算するというメソッドは存在していません
ワークシートの再計算をループさせるという方法で目的を達成することは可能です
以下の記事で解説しています

Excelの再計算の自動・手動の切替

Application.Calculationプロパティは、再計算の動作設定を行います。手動・自動再計算の切り替えコード

'Excelを手動計算にする
Application.Calculation = xlCalculationManual
'Excelを自動計算にする
Application.Calculation = xlCalculationAutomatic

Excelの再計算の動作設定の変更には「Application.Calculation」プロパティを使用します

このプロパティの設定値を以下に設定すると動作が切り替わります

自動計算 = xlCalculationAutomatic(-4105)
通常の初期設定、セル値が更新されたりすると自動的に再計算する

手動計算 = xlCalculationManual(-4135)
自動的に再計算されることがなく、ユーザーの再計算実行により実行される
VBAでは「Calculate」メソッドを実行した時

再計算の切り替え

再計算の切り替えは、Excelのオプション設定からも行えますので、たまに手動に設定されているブックがあります

これは再計算に時間がかかり、セルの更新毎に再計算をさせる事による待ち時間の解消の為に使用しています

なので、VBAでも全く同じ扱いで構いません
処理中に再計算すること自体は問題ありませんので、とりあえず処理中は手動に切り替えるようなことはしなくていいです

処理中に、セルの更新等が多数あり、そのたびに数秒の待ち時間が発生し最終的に数分もかかってしまうような場合には、このプロパティを「xlCalculationManual」に設定してから処理を実行し、最後に「xlCalculationAutomatic」に戻すことで、その待機時間を無くすことができ、大幅な処理速度向上につながります

なお、自動に設定した時点で再計算が実行されるので再計算を実行するコードを実行する必要はありません

Application.Volatileについて

Application.Volatileメソッドはユーザー定義関数を揮発性にする。揮発性の動きの解説

'揮発性にする
Application.Volatile

「Application.Volatile」メソッドは、ユーザー定義関数を揮発性にするコードです

揮発性とは、引数に関係の無いセルが更新された時でも再計算が実行される状態になることを言います
通常は、引数に関係あるセルが更新された時に再計算は実行されます

揮発性ではない通常の再計算

ユーザー定義関数のコード画像
ユーザー定義関数のコード

まずは、画像のようなユーザー定義関数を作成したとします
この関数は、計算時に現在日時を文字列付きで返す関数になります

ワークシートに関数を入力したときの動き
ワークシートに反映した時

この関数をワークシートのセルに入力します
すると、その日時と文字列が結合されてセルに表示されます
ここでは「最終計算日時: 2020/01/09 21:59:55」が返されています
実際に関数を確定させて計算させた時間です

再計算されるときの動き
再計算時の動き

次に、この関数の関係するセルは引数には指定は無いので自分のセルのみです
なので、一度入力モードにしてそのまま確定させます
すると、再計算が実行されて「最終計算日時: 2020/01/09 22:03:14」が返されます

しかし、A2を更新した時点では更新されません
関係するセルではないためです

このままでは、この関数は本来シートのデータを更新させた履歴を表示する関数という役割を果たさずに、ただこの関数を入力した時間を表示するだけの関数になってしまい何の意味もない関数になります

メソッドを使用した揮発性の再計算

揮発性にしたユーザー定義関数のコード画像
メソッドの挿入

そこで、このメソッドを挿入します
このメソッド自体はどこに入れても構いませんが、揮発性にしていることを分かり易くするために、最上部に挿入してください
これでこのユーザー定義関数は揮発性になったため、関係のないセルが更新されても再計算が実行されます

揮発性になった関数の再計算の動き
揮発性になったユーザー定義関数

今回の動きでは、A2の更新をしただけで「最終計算日時: 2020/01/09 22:58:10」が返されています

このメソッドでは、同じブック内のセルが更新された時に再計算されるようになるため、このユーザー定義関数の文字列にユーザー名などを追加すれば
誰がいつ最後に更新したかが分かる関数になります

こういった、関係ないセルを更新した時でも再計算を実行させたい場合に使用するメソッドです

揮発性にすることの注意点

このメソッドを使用すると、再計算の回数が激増します
なので再計算にかかる時間が大幅に増える可能性があります

また、関係の無いセルを更新するだけで再計算するということはセル参照するような処理にしていた場合は予期しないセルの動きによるバグの可能性もあります

このメソッドは、とりあえず使うような代物ではなく
明確に処理の流れを理解した上で必要なら使用するものです

ユーザー定義関数にハマって、すぐに使ってしまう愚を犯さないようにしてください、誰かさんはこれを入れてエラー無視までいれて強制的に処理を走らせていましたが、今考えるとすごい話です

なお、こんな処理ならChangeイベントの方が向いていると思いますが、目的に対する手段がいろいろあるのもVBAの楽しいとこですね

Excelの描画処理を停止する

Application.ScreenUpdatingプロパティは画面描画を抑止する設定です。画面描画抑止のコード

'画面描画を抑止
Application.ScreenUpdating = False
'画面描画の抑止を解除
Application.ScreenUpdating = True

Excelの画面描画を抑止するには「Application.ScreenUpdating」プロパティ「False」を設定します

画面描画の抑止とは、Excelの操作を行った際に発生する画面の表示更新処理のことです
セルへのデータ入力時に表示される内容やシート・ブックの切替時の画面切り替わりを無くす状態です
Excelの画面描画であるため、マウスカーソルの動きなどは抑止されません

この状態になると、画面描画に使用されるメモリが必要なくなるため処理速度の向上につながります

また、処理速度だけでなくシート・ブックが多く切り替わる際画面がちらつき、使用者の目に大打撃を与えるのを防ぐ意味でも使用できます

ただ、当然画面の動きが無くなるということは、一見するとフリーズしたように感じることもあります
何分もかかるような処理で使用した場合、本当にフリーズしたかとおもい思わずタスクキルしてしまう人もいるかもしれません

なので、逆に少しは動きを見せて頑張っているところを見せる必要がある場合もあります、人間と同じですね

また、処理速度の向上につながるためとりあえず入れる、というのは考えものです
特にデバッグ時に動きが見えないのは致命的ですし、そもそもセル選択や切替が無ければ処理速度は変わりません

最後に使用後は必ず解除するようにしましょう

Excelのイベント発生を抑止する

Application.EnableEventsプロパティはイベントの実行を抑止する設定です。イベント実行を無効にするコード

'Excelのイベントを抑止する
Application.EnableEvents = False
'Excelのイベント抑止の解除
Application.EnableEvents = True

Excelのイベント発生を抑止するには「Application.EnableEvents」プロパティ「False」を設定します

イベントとは、保存や印刷、セルの選択などユーザーのなんらかの動作に応じて自動的に発生するプロシージャです
このイベントに何らかの処理を作成した場合、他の処理を実行中でも対象の操作が発生すればイベント処理が実行されます

このプロパティを「False」にしておくことで、このイベントプロシージャの実行を抑止することが出来ます
抑止する場面は、ユーザーの操作ではなく処理中に行った処理での発生を抑止する目的で使用します

イベント抑止の使用場面

イベント作成時のコード
イベント作成時

まず、イベントを作成します
画像のようにシートのイベントにより、指定のシートのみで「UserForm1」を表示させたいのでこの様にActivateイベントではフォームの表示処理を実行します
Deactivateイベントではフォームを終了させます

このイベントはそれぞれ、シートがアクティブになったときと非アクティブになったときに発生するイベントです

ただ、この処理を作成したときに問題となるのはフォームの処理で別のシートのデータを扱ったりする場合にシートを移動させる必要があります
この時にフォームの処理中でありますが、シートが切り替えられた時点でDeactivateイベントが発生しフォームは強制終了されます

フォームが終了しても処理中はデータがメモリ上に保持されているため、入力することは出来ます
ただ、入力が完了して元のシートに戻ってきたときにActivateイベントが発生するためフォームが起動しますが、この時に表示されるデータは初期値になっています

入力をすると、コントロールのデータが全て初期リセットされるフォームになってしまいます、これは使い勝手最悪です

そこで使用するのがこのプロパティです
入力処理のシートを切り替える前に「False」に設定しておけばシート切替によるフォームの起動・終了が実行されなくなります

Excelのイベントを抑止するので、ブックイベントもシートイベントも実行されなくなりますので、使用後は必ず設定を解除しておきましょう

ただ、ユーザーフォームはExcelとは別のようでこの設定を行ってもイベントの実行は抑止されませんので注意が必要です
ユーザーフォームのイベントに対しては、フラグで抑止処理を自作する必要があります

エラー処理(エラー処理を解除させる)

On Error GoTo 0ステートメントはエラー処理を初期化することにより、それまでにあるエラー処理を解除します

'エラー処理を解除する
On Error GoTo 0

「On Error GoTo 0」ステートメントは、エラー処理を初期化します

「On Error GoTo」ステートメントや「On Error Resume Next」ステートメントで設定したエラー処理を解除する際に使用します

エラー処理初期化したときの動き
エラー処理を初期化したときの動き

画像の動きを確認してください

「Err.Raise(1)」は1番の実行時エラーを発生させるコードです
1つ目では、エラー発生を無視して継続するようになっているためエラーメッセージは発生せず、処理が継続しています

2つ目では、On Error GoTo 0ステートメントによりエラー処理が初期化されているため通常通りにエラーメッセージが表示され処理が停止します

エラー処理を作成した場合は必須

エラー処理の設定を行った場合には必ず使用してください

このコードを使用しないと、後続処理全てで同じエラー処理が適用されるので意図しない動きが発生する可能性があります

またこのコードを実行時にエラー情報はクリアされます
エラー情報自体は、発生時に保持されています

Debug.Printについて

当サイトで頻出するDebug.Printについてと選択した理由

当サイトでは、値の取得であったりコード動作の確認にはタイトルのコードを使用しています

Debug.Print "出力内容"

このコードはイミディエイト画面に引数の内容を出力するコードです

画像の解説では、途中経過が省かれてしまうので履歴の残るこのコードでの解説を行うこととしました

初心者の方には、このコードは分かりにくいこともあるかもしれませんが、使えるようになると非常に便利なコードなので、当サイトを使用するにあたっては慣れていってください

当サイトのサンプルコードで、このコードが出てきているものを実行したが何も起きないと思ってしまった人もいるかもしれません
イミディエイト画面を表示していないと、そう感じてしまいます

MsgBox関数であれば明確に表示されるので、ユーザーとしてはそちらが良いかもしれないとも思ったのですが、やはり全ての記事で統一する解説方法を考えた時にこのイミディエイト出力に行き着いたので、わかりにくい方にはご容赦いただきたいと思います

デバッグモードについて

処理の実行確認を行うデバッグについて、操作方法と解説

デバッグモードとはコードの動きを確認することです
このモードを実行する事で、処理作成の動きの確認やバグ発生時の原因の特定に役立ちます

この力はコーディング力よりも重要です

どれだけのコーディング力があっても、いきなり思い通りの処理をテストせずに作成できる人もいないと思います、少なくとも自分は無理です
バグの無い処理をいきなり完成させることが出来る人もまずいないでしょう

つまり、コーディングした後にこのデバッグモードを有効に活用することによって安定の処理作成やバグの発見につながるわけです
そのため、デバッグ力は非常に重要な要素です

コードなんて調べりゃ出てくるし、このサイトでコピペするだけでも作れますが、このデバッグは完全にあなたの力でやりきるしかありません

デバッグモードの操作方法

デバッグモードの各操作メニュー
デバッグ操作のメニュー画面

デバッグメニューにある項目から操作を行います
基本的にコードの動きを確認しながら行うので、このメニューから選択してデバッグすることはありません

そのために、全てショートカットキーがありますので解説します

ステップインの動き
ステップインの動き

「F8」を押していくと、コードを1行ずつ実行していくステップイン操作ができます
基本的にはこの操作でデバッグは行います

1行実行して結果を確認して、次の1行を実行する・・・という形で処理の動きを確認していきます

キーを押し続ければ、その間処理がずっと実行されていきます

カーソル行まで実行の動き
カーソルまで実行する動き

「Ctrl+F8」でカーソルの行まで一気に処理を実行する事ができます
コード行数が多い場合に、後半部分を確認するのに前半部分をいちいちステップインで確認するのは手間になる場合に使用します

ただ、これに関してはブレークポイントやStopステートメントと同じ動きになるので、そちらのほうが便利かもしれません

カーソル行に飛ぶ動き
処理を飛ばす動き

「Ctrl+F9」処理をカーソル行に移動させることができます
その間の処理は実行されません

前半の処理が後半の処理に影響を与えず、動作確認が完了している場合に使用します

処理を実行しないので、処理時間がかかるような場合には上記の移動やブレークポイントより有効なのでよく使用します

ステップオーバーとステップアウトは、処理を呼び出した際に行う操作です

サブプロシージャ実行時のステップインの動き
ステップインでの動き

まずは、画像の様な処理をCallで呼び出している処理の動きをステップインで確認してください

ステップオーバーの動き
ステップオーバーの動き

「Shift+F8」でステップオーバー操作になります
この操作は呼び出し処理はデバッグせずに実行のみを行う操作です

サブ処理テストのプロシージャには移動せずに、処理は実行されています

ステップアウトの動き
ステップアウトの動き

「Ctrl+Shift+F8」でステップアウトの操作になります
この操作は呼び出し処理内で行うと、その処理は実行して抜け出す動きになります

画像の動きですが、サブ処理テストの行で操作するとプロシージャを抜けて、呼び出し元の次の処理に移動します
この時処理は実行されています

ステップオーバーとステップアウトの動きを確認してもらうと分かりますが、これはブレークポイントで十分対応できます
なので、この2つはあまり使用場面は無いと思いますので、覚える必要はありません
この操作の動きの確認だけしてもらえばいいです

デバッグ操作で覚えてほしい操作

上記で一通り紹介しましたが、結局ブレークポイントやStopステートメントを活用することにより、そちらのほうが便利であったりします

なので、デバッグ操作で覚えておきたいのは以下の操作です

・ステップイン「F8」-1行ずつ実行する
・カーソル行に飛ばす「Ctrl+F9」-処理を実行せずに移動する

の2つです、これに合わせてもう1つ

・処理の継続「F5」-処理を通常通りに実行する

この通常実行は、処理途中で後の確認は必要ない場合に残りの処理を実行させる場合やブレークポイント設置個所まで通常実行を行いたいときに使用します

実行時エラー表示
実行時エラーの表示画面

また、画像のような実行時エラー画面が表示されたらデバッグボタンを押してください
すると、そのエラーの発生した行がデバッグモードで停止していますのでバグの修正を行ってください

修正が完了したら、F5で通常実行したりして動作の確認を行います

デバッグが難しい場面

以上のようなデバッグ操作でほぼ処理の動きの確認は行えます
ただ、デバッグ操作では動きの確認が難しい場面もあります

例えば、SendKeysメソッドはアクティブなアプリに対してキーストロークを送信するメソッドですが、これをデバッグ中に行えば当然アクティブアプリはVBEになるのでうまくデバッグできません

またユーザーフォームのSetFocusメソッドも同じですが、このメソッドは指定のコントロールにフォーカスを取得させます
デバッグ中ではVBEがフォーカスを得ているので、このコードをデバッグモードで実行してもうまくいきません

他にも表示関係でもありえますが、デバッグ操作はデバッグ力の一部と思っていてください

基本的なデバッグ力は、探し出す力になります
これは99%経験によるものと思いますので、いろんな処理を作ってデバッグモードで動きを確認してみてください
気づけばこの力はついてきているはずです

エラー処理(無視して継続)

On Error Resume Nextステートメントを使用することでエラー発生による処理停止を防ぐことが出来ます

'後続のエラーを無視する
On Error Resume Next

実行時に発生するエラーを無視して処理を継続するには「On Error Resume Next」ステートメントを使用します

このコード以降に発生するエラーで処理の停止が無くなり、処理が継続されるようになります
エラー発生が意図したもので、予想の範囲内である場合に使用します
なお、エラーが発生しなくなるわけではありません

フォルダの作成は、すでに存在する名前を指定するとエラーになりますがそのエラーは無視することで、フォルダの作成が出来るときはする、出来ない時はしない、という動きにすることにできます

また、オブジェクト取得の際に存在しないオブジェクトを取得しようとするとエラーが発生しますが、そのオブジェクトの生成を待ったり、判定に使用したりする際にエラーを無視させます

エラーの発生は基本的には必要な情報の提示になります
これを抑止する事で、予想外のエラーが発生しても気づかないこともありますので多用すべきコードではありません

また、このコードは以降の全ての処理に適用されるので無視するべき処理が終わったらすぐに「On Error GoTo 0」ステートメントを使用してこの無視する設定を解除してください