名前定義の削除

Names.Deleteメソッドで名前定義を削除できます。ブックとシート両方の削除コード

'ブック範囲の名前定義を削除する
ActiveWorkbook.Names("作成名前定義1").Delete

↑ブック適用範囲

'シート範囲の名前定義を削除する
ActiveWorkbook.Worksheets("Sheet1").Names("作成名前定義1").Delete

↑シート適用範囲

名前定義の削除には「Names(“定義名”).Delete」メソッドを使用します
ブック適用とシート適用ではメソッドの対象が変わります

コード解説

「ActiveWorkbook.Names(“作成名前定義1”).Delete」
ブック適用範囲の名前定義を削除する場合に使用します
ブックに対してメソッドを使用します

「Worksheets(“Sheet1”).Names(“作成名前定義1”).Delete」
シート範囲の場合はシートの指定から削除を行います
名前が一意であれば指定無しでも削除は実行できますが、複数の同じ名前を使用していた場合エラーが発生しますので、シート範囲の名前定義はシート指定で削除を行います

また、NamesオブジェクトなのでItemプロパティがありますので、名前を指定しなくてもIndex番号でも指定は可能です
ただ、名前を指定せずに扱うことは処理上あまり使用することは少ないと思います

名前定義したセルに入力・移動

名前定義したセルの使用方法について。入力とGotoメソッドによる移動コード

'ブック範囲の名前定義セルに入力
Range("作成名前定義1") = 123
'ブック範囲の名前定義セルに移動
Application.Goto "作成名前定義1"

↑ブック適用範囲

'シート範囲の名前定義セルに入力
Worksheets("Sheet1").Range("作成名前定義1") = 123
'シート範囲の名前定義セルに移動
Application.Goto Worksheets("Sheet1").Range("作成名前定義1")

↑シート適用範囲

名前定義したセルはその名前文字列で以降は指定が可能になります
その際には、Rangeの引数には「”」で名前文字列を囲んで指定します

それぞれの名前定義については以下の記事を確認してください

コード解説

「Range(“作成名前定義1”) = 123」
ブック適用範囲ではシートの指定が必要なく、アクティブブックに対しての処理になるので、シンプルにRangeオブジェクトの引数に名前文字列を指定して入力を行います

「Application.Goto “作成名前定義1”」
移動には、シートの移動をおこなえるGotoメソッドを使用します

「Worksheets(“Sheet1”).Range(“作成名前定義1”) = 123」
シート適用範囲の場合には、シートの指定から行う必要があります
通常のセル範囲と同じ使用方法になります

「Application.Goto Worksheets(“Sheet1”).Range(“作成名前定義1”)」
移動に関しては、同じくシート移動の出来るGotoメソッドを使用します
指定には、入力と同じようにシートから指定を行う必要があります

Gotoメソッドはシート間の移動までを行うためのコードであるため、シート移動の必要ないアクティブシートでの名前定義セルへの移動に関しては通常のセル選択に使用するSelectメソッドで可能です

Range("作成名前定義1").Select

上記のコードでは、名前定義されたセルを選択状態にします
しかし、別のシートであった場合エラーが発生します

入力に関しては、アクティブシートの相違には問題ありませんが選択状態にする場合は注意する必要があります

名前定義の作成・変更(シート範囲)

Names.Addメソッドはシート範囲の名前定義を作成変更するメソッドです。

'アクティブシートの選択範囲で名前定義
ActiveSheet.Names.Add Name:="作成名前定義1", RefersTo:="=" & Selection.Address

↑アクティブシートの場合

'指定シートの指定範囲で名前定義
Worksheets("Sheet1").Names.Add Name:="作成名前定義1", RefersTo:="=$A$1:$A$10"

↑アクティブ以外のシートの場合

シート範囲での名前定義をするには「Names.Add」メソッドをシート指定して使用します
指定した名前の名前定義が存在しない場合は新規作成され、存在する場合はセル範囲が更新されます

シート範囲で名前定義を行うと、その名前定義をシート内でしか使用できません
別のシートから参照するには、シートの指定から行う必要があります

コードの解説

「ActiveSheet.Names.Add Name:=”作成名前定義1”, RefersTo:=”=” & Selection.Address」
アクティブシートの選択範囲を名前定義します
引数「Name」は名前定義の名前文字列
引数「RefersTo」にはセルのアドレス文字列を指定します、セル範囲そのものではないのでRangeのAddressプロパティを使用します

アクティブシートの選択範囲なので、動的に名前定義する際に使用します

「Worksheets(“Sheet1″).Names.Add Name:=”作成名前定義1”, RefersTo:=”=$A$1:$A$10″」
引数の解説は上記と同じです
今回違う点が、シートを指定しているのと「RefersTo」にアドレス文字列が指定されているところです

この様に指定することで、アクティブシート以外のシートを指定することが可能です
また、シートを適用範囲とするメソッドなのでアドレス指定にはシートの指定は必要ありません、省略すると対象シートが指定されます

使用場面

シート範囲の名前定義とは、別のシートからは参照できないようにシート内でのみ有効な名前定義になります

これを使用する場面は、同じ目的の名前定義を複数作成することで管理がめんどうになるのを防ぐ意味で使用します

シートごとに違う名前を指定する必要があるブック範囲ではコードの作成にも利便性が無いので、同じ名前の指定をしておけばシートを切り替えるだけで同じ名前定義を使用することができます

名前定義したセル範囲を指定する際には、別シートであればシートからの指定が必要になる点は注意が必要です

名前定義の作成・変更(ブック範囲)

Nameプロパティは、セルの名前定義を作成・変更するプロパティです。アクティブシートとそれ以外の指定コード

'アクティブシートの範囲を名前定義
Selection.Name = "作成名前定義1"

↑アクティブシートの場合

'別シートの範囲を名前定義
Worksheets("Sheet1").Range("A1:C5").Name = "作成名前定義1"

↑アクティブ以外のシートの場合

ブック範囲で名前定義を作成変更するには「Name」プロパティを使用します
名前のものが無ければ新規作成され、あれば指定のアドレスが更新されます

コード解説

「Selection.Name = “作成名前定義1”」
SelectionのNameプロパティを設定します
このコードを使用すると、選択範囲をブック範囲指定で名前定義を行います
アクティブシートの選択範囲を指定しています

こちらでは、引数は無く選択範囲とブック指定が固定になるので選択範囲が決まっていれば使用可能なので名前定義で一番簡単に作成が出来るコードです

「Worksheets(“Sheet1”).Range(“A1:C5”).Name = “作成名前定義1”」
Selectionをシートとセル範囲を固定で指定することで、1つ目ではできないアクティブシート以外のシートを指定することが出来ます
アクティブシート以外の別シートを指定する場合にはこちらを使用します

どちらのコードも名前定義のセル範囲を変更できますが、適用範囲はブック以外の指定は行いません
ブック指定とすることで、コードが簡略にできるので適用範囲を気にしない場合の名前定義はこのブック範囲で構いません

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まで走っていない形になります
変数などプロシージャが終了した時点で解放されるといった動きをするものなどが、その終了が曖昧なためその解放自体も曖昧になる可能性があるということです

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

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