【VBA入門】Withの使い方、入れ子(ネスト)で使う方法

ExcelVBAでは、Withステートメント同じオブジェクト名を省略することができます。

オブジェクト名が長ければ長いほど何度も記述することは避けたいですよね。そのようなときのためにWithステートメントがあります。

この記事では、Withステートメントで同じオブジェクト名を省略する方法について

  • Withステートメントとは
  • Withステートメントの使い方

といった基本的な内容から

  • Withを入れ子(ネスト)で使う方法
  • Withブロック変数エラーの対処法
  • WithEventsの使い方

など応用的な使い方についても解説していきます。

今回はWithステートメントについて、使い方をわかりやすく解説します!

Withステートメントとは

ExcelVBAでは一つのオブジェクトに対して、複数の処理を行うことがあります。Withステートメントとは、そのような場合にオブジェクト名を省略する構文です。

Withステートメントで、オブジェクト名を省略するためには次のように記述します。

このように処理を「.」(ドット)から始まる式で記述することができて、オブジェクト名を省略できます。

以降では、具体的な例を示して解説しています。

Withステートメントの使い方

例えば、次のようなサンプルコードがあるとします。

[実行結果] vba_with01 0

これは、Withステートメントを使用して次のように記述することができます。

[実行結果] vba_with01 0

「.Offset(0, 0).Value」のようにWithステートメントの中で省略したオブジェクトを使用するためにはドットから始まる式を記述します。

Withステートメントを使用したサンプルコードでは、「Worksheets(“Sheet1”).Cells(1, 1)」は一度しか出てきていませんね。

どちらのサンプルコードでも実行結果に違いはありません。

Withを入れ子(ネスト)で使う方法

Withステートメントは入れ子(ネスト)にすることができます。入れ子(ネスト)にするとは、自身と同じ構造をその内部に持つことを意味します。

Withステートメントの中でドットから始まる式で記述するオブジェクトにおいて、さらに処理を複数記述する場合に入れ子(ネスト)で使用します。

Withを入れ子(ネスト)で使うためには、次のように記述します。

次は、Withを入れ子(ネスト)で使うサンプルコードです。

[実行結果] vba_with02 0

まず、最初のWithステートメントで「Worksheets(“Sheet1”).Cells(1, 1)」を省略しています。

その中でもう一度、Withステートメントを使用して、今度は「Font」を省略しています。

Withブロック変数エラーの対処法

VBAでは実行時エラーで、「オブジェクト変数またはWithブロック変数が設定されていません」と表示されることがあります。

これはWorksheetやRangeなどのオブジェクトに格納する際に、Setステートメントを付けていないことが原因でよく発生します。以下のようにSetを付けて記述するようにしましょう。

Setステートメントの使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。

【VBA入門】Setでオブジェクトを作成する方法
更新日 : 2019年5月31日

WithEventsの使い方

VBAではWithステートメントの他にWithEventsキーワードというモノがあります。

WithEventsキーワードの使うと、指定した条件でイベントを発生させることができます。Withステートメントの使い方とは大きく異なります。

WithEventsキーワードの使い方も参考のためにご紹介しておきます。WithEventsキーワードは、クラスモジュールで使用します。

Class1(クラスモジュール)

Module1(標準モジュール)

実行結果:
WIthEvents01

このサンプルコードでは、まずクラスモジュールClass1を作成し、WithEventsキーワードを使ってApplicationオブジェクトmyEventを宣言しています。

下図のように宣言したmyEventを選択するとイベントを選択できるようになります。
WIthEvents02

ここでは選択するセルが変わった場合の処理として、セルのアドレスの値をセル内に表示するように定義しています。

そして標準モジュール内でDim As Newステートメントを使ってClass1のインスタンスc1を生成しています。

さらにSetステートメントを使ってc1から呼び出したmyEventにApplicationオブジェクトを格納することで、指定したイベントが発生したときに定義した処理が行われるようにしています。

まとめ

いかがでしたか?今回は、Withステートメントで同じオブジェクト名を省略する方法について解説しました。

これで長いオブジェクト名を何度も記述することが避けられます。また、同じことを記述する回数が減るため修正箇所が少なくなることもメリットの一つです。

もし、Withステートメントで同じオブジェクト名を省略する機会があれば、この記事を思い出してみてください!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

イシキ マコト

イシキ マコト

フリーランスのエンジニアです。
最近では、プログラミング関連の記事を作成するライターとしても活動しています。

趣味と業務の両方でプログラミング言語をいくつも学んできたので
その経験を活かして分かりやすい記事を作成できればと考えています。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説