「VBAで処理した結果をセルに記載するのではなく、変数でずっと保持できないかな...?」
このように悩んだことはありませんか?

・処理した結果を、ずっと変数で保持できないのかな??
・VBAで静的変数を初期化する方法が分からない。
・VBAのStaticとPublic変数、どちらを使うべき?



その場合は、VBAの「静的変数 (Static)」を
使用すると解決します!
この記事では、Excel VBAの「静的変数 (Static)」の使い方について詳しく説明します。
静的変数を使用することで、プロシージャが終了しても値を保持し続けることができ、例えば繰り返し処理で前回の結果を引き継ぐといった操作が可能になります。
基本的な使い方から、メリット・デメリット、注意点まで、初心者でもすぐに実践できる内容です。
ぜひ最後までお読みください。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
VBAの基礎から応用までを効率よくしっかり学習したい方には、UdemyのVBA講座もおすすめです。
特に自己学習で進める場合、ビデオや実践例があると理解が進みやすくなります。


\ 自分のペースで学べるVBA講座はこちら /
この記事を見てできるようになること
この記事を読めば、以下のことができるようになります。
- VBAで静的変数を使う方法を理解し、適切な宣言方法を学べる
- 静的変数の初期化の方法を習得する
- 静的変数を使う際の注意ポイントを理解し、適切に設計する
- 静的変数を使用した具体的なコード例を学び、実際のプロジェクトに応用できる
Excel VBAにおける「変数」とは?
VBAにおける変数は、データを一時的に記憶するための箱のようなものです。
引用元:エクセルVBAで変数を使いこなす方法 | 変数の基本から実践まで
プログラム内でデータを扱う際に、変数を使うことでデータを柔軟に操作できます。


変数の基本についてもっと知りたい方は、以下の記事で詳しく解説しています。
こちらもぜひご覧ください。


VBAの「変数」の種類をご紹介
VBAには、さまざまな種類の変数があります。
以下に代表的な変数を紹介します。
引用元:エクセルVBAで変数を使いこなす方法 | 変数の基本から実践まで
種類 説明 通常の変数 データを一時的に記憶するための箱。
スコープは宣言されたプロシージャ内のみ。グローバル変数 プロジェクト全体で使用可能な変数。
モジュールの先頭で宣言され、すべてのプロシージャからアクセス可能。
大規模なプログラムでデータを共有するのに便利。静的変数 プロシージャの間で値を保持する変数。
Staticキーワードを使用して宣言され、プロシージャが終了しても
値が保持される。
計算の状態を保持したい場合に使用。オブジェクト変数 オブジェクトを参照するための変数。
Setステートメントを使用してオブジェクトを代入し、プロパティや
メソッドにアクセス可能。
エクセルのワークシートやセルなどの操作に使用。
VBAの静的変数 (Static) の基本について解説
VBAの「静的変数 (Static)」は、プロシージャが終了しても値が消えずにそのまま残る特別な変数です。


たとえば、ある計算をするプロシージャを繰り返し実行した場合、前回の計算結果が次の実行でも使えるようになります。
これにより、毎回最初から値を設定し直さずに、前回の続きから処理を進めることができるのが特徴です。


通常の変数、静的変数 (Static)、グローバル変数の違い
VBAでは、「通常の変数」、「静的変数 (Static)」、および「グローバル変数」の3つが主に使われます。
それぞれの変数の違いを、スコープ(適用範囲)や有効期間を基に表で比較してみましょう。
変数の種類 適用範囲
(スコープ)有効期間 特徴と使用例 通常の変数 宣言されたプロシージャ内のみ プロシージャが
実行されている間のみ値はプロシージャの終了とともに消え、
再実行時には再初期化されます。
短期間のデータ保持に使用します。静的変数
(Static)宣言されたプロシージャ内のみ プロシージャが
終了しても値を保持する値が保持されるため、プロシージャの複数回の
実行で前回のデータを使用できます。
例: カウンターや状態保持。グローバル変数 モジュール全体または
プロジェクト全体で使用可能プロジェクトが
終了するまで、
またはモジュールが
閉じられるまで全てのプロシージャからアクセス可能で、
長期間データを共有する際に便利です。
プロジェクト全体で使用する設定や共通のデータ管理に適しています。
VBAの「静的変数 (Static)」の宣言方法
VBAの「静的変数 (Static)」を宣言する際には、「Staticステートメント」を使用します。
静的変数の宣言方法は、以下の通りです。


- Static
- 静的変数を宣言する際に使用するキーワードです。
このキーワードを使うことで、プロシージャが終了しても変数の値が保持されるようになります。
- 静的変数を宣言する際に使用するキーワードです。
- 変数名
- 任意の変数名を指定します。
変数名は他の変数と区別できるよう、わかりやすい名前を設定することが推奨されます。
- 任意の変数名を指定します。
- As
- 変数の型を指定するためのキーワードです。
「As」の後に、変数のデータ型を記述します。
- 変数の型を指定するためのキーワードです。
- 変数の型
- 変数が保持するデータの型を指定します。
たとえば、Long(長整数)やString(文字列)など、VBAで使用される標準のデータ型が利用可能です。
- 変数が保持するデータの型を指定します。
より詳しい情報は、Microsoft公式のStatic ステートメントを参照してください。
VBA 静的変数 (Static) の初期化について
VBAの静的変数 (Static) は、プロシージャが終了しても値が初期化されず、保持され続ける特徴を持っています。
一度値を代入すると、次回のプロシージャ実行時にもその値が残るため、初期化を行わないと意図しない結果が出るリスクがあります。
特にカウンターや計算処理では前回の値が残ってしまうことが問題になる可能性があります。
これを防ぐために、静的変数を使用する際は、手動で初期化するということも合わせて考える必要があります。
静的変数を初期化する方法
VBAで、静的変数を初期化したい場合は、「値を手動で初期化」するか、「再コンパイル」を行う方法が必要になります。
※ 再コンパイルとは、VBAコードを再度編集・読み込んで実行可能な状態にする処理です。
この過程で静的変数が初期化され、保持していた値がリセットされます。
値を手動で初期化する方法
静的変数の値を初期化したい場合は、以下のように手動で「0」や「”” (空文字)」を代入します。
Sub ResetCounter()
Static Counter As Long
Counter = 0 '// 静的変数の値を手動で0にリセット
End Sub
VBA 静的変数 (Static)を使用する場合の注意ポイント
静的変数は便利ですが、適切な場合でのみ使用することをお勧めします。
※静的変数に値を格納するのではなく、セルに一旦転記するという方法も検討してみてください。
注意1: 静的変数の用途を限定する
静的変数は、プロシージャが終了しても値が保持されるため、複数回のプロシージャ実行時に前回の値を引き継ぐ必要がある場合に最適です。
しかし、すべての処理で使用するべきではありません。
静的変数を使用するのは、値の保持が絶対に必要な場合に限り、通常はローカル変数を使用する方が安全で効率的です。
注意2: 静的変数の初期化に注意する
静的変数は一度値を保持しますが、VBAプロジェクトが再コンパイルされたり、コードを変更して再実行する際は、意図せず値が初期化されることがあります。
これは、静的変数が保持していた値を意図せず失ってしまう原因となるため、プロジェクトが再コンパイルされるリスクがある場面では、値の消失に備えた対策を考える必要があります。
注意3: 静的変数はプロシージャ外では宣言できない
VBAの静的変数は、必ずプロシージャ内で宣言する必要があります。
プロシージャ外、つまりモジュールの先頭や他の場所で静的変数を宣言することはできません。
もしプロシージャ外で値を保持する必要がある場合は、グローバル変数(Public変数)を使用することで対応することができます。
注意4: 明確な命名規則を適用する
静的変数を使用する際には、その使用目的や役割を明確にしておくことが重要です。
コメントを利用して、なぜその変数が静的である必要があるのか、どのプロシージャで使用されているのかを記述しておくと、後からコードを見直す際に理解しやすくなります。
例えば、変数名に「s_」や「Static_」といった接頭辞を付けることで、その変数が静的であることを明示できます。
VBA 静的変数(Static) の使用例をご紹介
ここでは、具体的なコード例を通じて静的変数の使い方を紹介します。
以下に紹介する使用例は、すべてコピペしてすぐに実行できるコードです。
気になる例は、ぜひご覧いただき、実際に実行してみてください。
VBAの基礎から応用までを効率よくしっかり学習したい方には、UdemyのVBA講座もおすすめです。
特に自己学習で進める場合、ビデオや実践例があると理解が進みやすくなります。


\ 自分のペースで学べるVBA講座はこちら /
使用例1: プロシージャが終了しても値を保持する (カウンター)
静的変数を使用することでプロシージャが呼び出されるたびにカウンターの値を1ずつ加算させる例を紹介します。
Sub カウンター()
Static Counter As Long
Counter = Counter + 1
MsgBox "カウンターの値は " & Counter & " です。"
End Sub
処理結果


コードの動作概要
「Static Counter As Long」で静的変数「Counter」を宣言します。
静的変数は、プロシージャが終了しても値が保持されるため、次に呼び出されたときに前回の値が残っています。
プロシージャが呼び出されるたびに「Counter = Counter + 1」でカウンターの値が「1」ずつ増加します。
MsgBox を使用して、現在のカウンターの値を表示します。
この値は、プロシージャが実行されるたびに増加していきます。
このコードで使用している機能
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub カウンター()
- この行では、「カウンター」という名前のサブルーチンが定義されています。
サブルーチンは「Sub」で始まり、「End Sub」で終わる一連のコードブロックです。
このサブルーチンは、後で呼び出されると一連の操作を実行します。
- この行では、「カウンター」という名前のサブルーチンが定義されています。
- Static Counter As Long
- この行では、静的変数「Counter」が、長整数型(Long)として宣言されています。
「Staticキーワード」を使うことで、この変数はサブルーチンの実行が終了しても値を保持します。
つまり、このサブルーチンが何度呼ばれても、「Counter」の値はリセットされず、前回の値が保持され続けます。
- この行では、静的変数「Counter」が、長整数型(Long)として宣言されています。
- Counter = Counter + 1
- この行では、静的変数「Counter」の値が1ずつ増加しています。
Counter = Counter + 1は、現在の「Counter」の値に1を足して、それを再び「Counter」に代入する処理です。
これにより、このサブルーチンが呼び出されるたびに「Counter」の値が増えていきます。
- この行では、静的変数「Counter」の値が1ずつ増加しています。
- MsgBox “カウンターの値は ” & Counter & ” です。”
- この行では、MsgBox関数を使って、現在の「Counter」の値をメッセージボックスに表示します。
具体的には、「カウンターの値は X です。」というメッセージが表示され、「X」の部分に「Counter」の現在の値が入ります。
サブルーチンが呼ばれるたびに、「Counter」の値が「1」増え、その値が表示されます。
- この行では、MsgBox関数を使って、現在の「Counter」の値をメッセージボックスに表示します。
- End Sub
- この行では、サブルーチンの終わりを示します。
これで「カウンター」サブルーチンが終了し、VBAは次のコード行に進みます。
- この行では、サブルーチンの終わりを示します。
このコードでは、「カウンター」プロシージャが呼び出されるたびに、静的変数「Counter」の値が1ずつ増加し、メッセージボックスに表示されます。
このように静的変数を使用することで、プロシージャが終了しても変数に値を保持することができるようになります。
使用例2: 静的変数を使用して再帰処理のカウントを保持する
静的変数を使って、再帰的なプロシージャが呼び出された回数をカウントする方法を紹介します。
Sub 再帰カウント()
Static Count As Long
'// 再帰処理のカウントを増加
Count = Count + 1
'// メッセージボックスでカウントを表示
MsgBox "再帰処理の回数: " & Count
'// 再帰処理: 5回まで実行
If Count < 5 Then
再帰カウント
End If
End Sub
処理結果


コードの動作概要
「Static Count As Long」で静的変数「Count」を宣言します。
この変数は、プロシージャが呼び出されるたびに前回の値を保持します。
「Count = Count + 1」で、再帰的に呼び出されるたびに 変数「Count」の値が「1」ずつ増加します。
MsgBox によって、現在のカウント回数がメッセージボックスに表示されます。
これにより、再帰処理の回数がユーザーに伝えられます。
「If Count < 5 Then」で5回まで再帰処理を続け、5回に達すると再帰呼び出しが停止します。
これにより無限ループを防ぎます。
このコードで使用している機能
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub 再帰カウント()
- この行では、「再帰カウント」という名前のサブルーチン(処理のまとまり)が定義されています。
このサブルーチンは、自己呼び出し(再帰処理)を使って繰り返し実行される仕組みです。
- この行では、「再帰カウント」という名前のサブルーチン(処理のまとまり)が定義されています。
- Static Count As Long
- ここでは、静的変数「Count」が宣言されています。
静的変数「Count」はサブルーチンが呼び出されるたびに値が保持されるため、繰り返し処理でも以前の値を覚えていることが特徴です。
- ここでは、静的変数「Count」が宣言されています。
- Count = Count + 1
- この行では、静的変数「Count」の値が「1」ずつ増加しています。
このコードは、「Count」に現在の値に「1」を加えた結果を代入する処理です。
サブルーチンが呼ばれるたびに、「Count」の値は1ずつ増えていきます。
- この行では、静的変数「Count」の値が「1」ずつ増加しています。
- MsgBox “再帰処理の回数: ” & Count
- ここでは、MsgBox関数を使って、現在の「Count」の値をメッセージボックスに表示しています。
具体的には、「再帰処理の回数: X」というメッセージが表示され、「X」の部分には現在のカウント数が表示されます。
- ここでは、MsgBox関数を使って、現在の「Count」の値をメッセージボックスに表示しています。
- If Count < 5 Then
- この行では、条件分岐が設定されています。
「Count」が「5未満」の場合に、次の行の処理を実行するという意味です。
この条件により、「Count」が「5」に達するまで再帰処理を繰り返します。
- この行では、条件分岐が設定されています。
- 再帰カウント
- この行では、「再帰呼び出し」が行われています。
サブルーチン「再帰カウント」が自分自身を呼び出しています。
これにより、「Count」が「5未満」である限り、このサブルーチンは繰り返し実行されます。
「Count」が「5」に達すると再帰呼び出しは終了します。
- この行では、「再帰呼び出し」が行われています。
- End If
- この行では、If文の終了を示します。
条件分岐の処理が終わったことを表しています。
- この行では、If文の終了を示します。
- End Sub
- この行では、サブルーチンが終了します。
これで「再帰カウント」サブルーチンの実行が完了し、VBAの処理は次に進みます。
- この行では、サブルーチンが終了します。
このコードでは、「再帰カウント」プロシージャが自身を再帰的に呼び出します。
静的変数「Count」はプロシージャが終了しても値を保持し続けるため、再帰呼び出しのたびに「
Count」が増加します。
再帰が5回実行された時点で処理が停止します。
再帰処理の考え方について
再帰処理とは、自分自身を呼び出して繰り返し処理を行う手法です。
再帰処理では、通常のループとは異なり、関数やサブルーチンが自らを呼び出しながら処理を続けます。
この例では「Count」が「5」になるまで自分自身を繰り返し呼び出し、そのたびに「Count」の値を増加させています。
分かりやすく言えば、再帰処理は「関数やサブルーチンが自分をもう一度使って作業を繰り返す」イメージです。
ただし、再帰は無限に繰り返すとプログラムが止まらなくなるリスクがあるので、必ず終了条件(このコードでは Count < 5)を設定しておくことが重要です。
再帰処理は、どのような場合に使用されるかというと、複雑な問題を分割して処理したいときです。
たとえば、ファイルの階層構造をたどる処理や、数学的な計算(階乗計算やフィボナッチ数列など)を行う際によく使われます。
最初は再帰がどのように動作しているかを理解するために、小さな例で試すのが良いでしょう。
この記事のまとめ
この記事では、VBAにおける静的変数の基本的な概念、使用方法、および宣言方法について詳しく説明しました。
ポイントのおさらい
- 静的変数の基本を理解する
- 静的変数は、プロシージャが終了しても値を保持する特殊な変数です。
これにより、複数回にわたって変数の値を保持し続けることができます。
⇒ 「VBAの静的変数 (Static) の基本について解説」もう一度見る。
- 静的変数は、プロシージャが終了しても値を保持する特殊な変数です。
- 静的変数の宣言方法を確認する
- 静的変数は「Staticキーワード」を使用して宣言されます。
通常の変数とは異なり、プロシージャ内で使用されてもその値を保持し続けます。
⇒「静的変数の宣言方法」もう一度見る。
- 静的変数は「Staticキーワード」を使用して宣言されます。
- 静的変数を初期化する方法
- 静的変数はプロシージャの再実行時にも値を保持しますが、リセットする場合は手動で初期化する必要があります。
リセットには、「0」や空文字列を代入する方法や、再コンパイルによってリセットする方法があります。
⇒「静的変数(Static)の初期化について」もう一度見る。
- 静的変数はプロシージャの再実行時にも値を保持しますが、リセットする場合は手動で初期化する必要があります。
- 静的変数を使う際の注意ポイントを再確認する
- 静的変数は便利ですが、適切に使わないとメモリ管理の問題や予期せぬバグが発生する可能性があります。
特に、変数の初期化や使用する範囲については十分な注意が必要です。
⇒ 「静的変数を使用する場合の注意ポイント」もう一度見る。
- 静的変数は便利ですが、適切に使わないとメモリ管理の問題や予期せぬバグが発生する可能性があります。
- 具体的なコード例を学ぶ
- 静的変数を使った具体的な例を通じて、その効果と使い方を確認しました。
カウンターや再帰的な処理で静的変数がどのように役立つかを理解しましょう。
⇒「静的変数の使用例」もう一度見る。
- 静的変数を使った具体的な例を通じて、その効果と使い方を確認しました。
さらに学ぶために
静的変数の基本を理解したら、次のステップとして他の変数の種類についても学んでみましょう。グローバル変数やオブジェクト変数も、それぞれ異なる用途で活用できます。
今回の記事を参考に、VBAでの静的変数の使用方法をマスターし、効率的なプログラムを作成して業務の効率化を図りましょう。

