エクセルVBA 静的変数で値を保持する方法と活用例

静的変数の記事 VBA

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

お悩みpoint
悩む人
  • 処理した結果を、ずっと変数で保持できないのかな??

この記事では、エクセルVBAの静的変数の使い方について詳しく説明します。

基本的な使い方から、メリット・デメリット、注意点まで、初心者でもすぐに実践できる内容です。

ぜひ最後までお読みください。


【 この記事の概要 】

  よく使う度    2.0  
  難しさ     3.0  
  覚えておくと安心度    3.0  

この記事を見てできるようになること

この記事を読めば、以下のことができるようになります。

この記事を見てできるようになること

変数とは?

VBAにおける変数は、データを一時的に記憶するための箱のようなものです。
プログラム内でデータを扱う際に、変数を使うことでデータを柔軟に操作できます。

変数のイメージ

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

VBAにおける各変数の違い

VBAには、さまざまな種類の変数があります。
以下に代表的な変数を紹介します。

種類説明
通常の変数データを一時的に記憶するための箱。
スコープは宣言されたプロシージャ内のみ。
グローバル変数プロジェクト全体で使用可能な変数。
モジュールの先頭で宣言され、すべてのプロシージャからアクセス可能。
大規模なプログラムでデータを共有するのに便利。
静的変数プロシージャの間で値を保持する変数
Staticキーワードを使用して宣言され、プロシージャが終了しても
値が保持される。
計算の状態を保持したい場合に使用。
オブジェクト変数オブジェクトを参照するための変数。
Setステートメントを使用してオブジェクトを代入し、プロパティや
メソッドにアクセス可能。
エクセルのワークシートやセルなどの操作に使用。

静的変数とは?

それでは、静的変数について解説します。

通常の変数と静的変数 及びグローバル変数の違い

通常の変数は、特定のプロシージャ内でのみ使用され、そのプロシージャが終了すると値が破棄されます。

一方、静的変数は、プロシージャが終了しても値が保持される変数です。
これにより、次回そのプロシージャが呼び出された時に、前回の値を使用することができます。

種類説明適用範囲 (スコープ)有効期間
通常の変数特定のプロシージャ内でのみ
使用される変数。
宣言された
プロシージャ内
プロシージャが
実行されている間のみ
グローバル変数プロジェクト全体で使用
される変数。
宣言されたモジュール全体
またはプロジェクト全体
モジュールを
閉じるまで。
静的変数プロシージャが終了しても
値を保持
する変数。
宣言された
プロシージャ内
プロシージャが
終了しても値が保持
される

静的変数の宣言方法

静的変数を宣言する際には、Staticステートメントを使用します。

通常の変数とは異なり、プロシージャ内で宣言します。

宣言方法

静的変数の宣言方法は、以下の通りです。


【 使用例 】

Static Counter As Long

このコードは、変数「Counter」を長整数型の静的変数として宣言します。

静的変数を使用する場合の注意点

静的変数は便利ですが、適切な場面でのみ使用することをお勧めします。
※静的変数に値を格納するのではなく、セルに一旦転記するという方法も検討してみてください。

  • 静的変数の用途を限定する
    • 静的変数は、プロシージャが終了しても値が保持されるため、複数回のプロシージャ実行時に前回の値を引き継ぐ必要がある場合に最適です。
      しかし、すべての処理で使用するべきではありません。
      静的変数を使用するのは、値の保持が絶対に必要な場面に限り、通常はローカル変数を使用する方が安全で効率的です。
  • 2. 静的変数がメモリに与える影響に注意する
    • 静的変数は、プロシージャが終了してもメモリ上に残るため、過度に使用するとメモリを圧迫する可能性があります。
      特に大規模なプロジェクトや多数の静的変数を使用する場合は、メモリ管理を意識する必要があります。
      不要な静的変数がメモリを占有し続けないよう、適切に設計しましょう。
  • 3. 静的変数のリセットに注意する
    • 静的変数は一度値を保持しますが、VBAプロジェクトが再コンパイルされたり、コードを変更して再実行する際には値がリセットされることがあります
      これは、静的変数が保持していた値を意図せず失ってしまう原因となるため、プロジェクトが再コンパイルされるリスクがある場面では、値の消失に備えた対策を考える必要があります。
  • 4. 明確な命名規則を適用する
    • 静的変数を使用する際には、その使用目的や役割を明確にしておくことが重要です。
      コメントを利用して、なぜその変数が静的である必要があるのか、どのプロシージャで使用されているのかを記述しておくと、後からコードを見直す際に理解しやすくなります
      例えば、変数名に「s_」や「Static_」といった接頭辞を付けることで、その変数が静的であることを明示できます。

静的変数の使用例

ここでは、具体的なコード例を通じて静的変数の使い方を紹介します。

使用例1: 静的変数を使用して値を保持する (カウンター)

プロシージャが呼び出されるたびにカウンターの値を1ずつ加算させる例を紹介します。

Sub カウンター()
    Static Counter As Long

    Counter = Counter + 1
    MsgBox "カウンターの値は " & Counter & " です。"
End Sub

解説

コードの解説
  • Sub カウンター()
    • この行では、「カウンター」という名前のサブルーチンが定義されています。
      サブルーチンは「Sub」で始まり、「End Sub」で終わる一連のコードブロックです。
      このサブルーチンは、後で呼び出されると一連の操作を実行します。
  • Static Counter As Long
    • この行では、静的変数「Counter」が、長整数型(Long)として宣言されています。
      「Staticキーワード」を使うことで、この変数はサブルーチンの実行が終了しても値を保持します。
      つまり、このサブルーチンが何度呼ばれても、「Counter」の値はリセットされず、前回の値が保持され続けます
  • Counter = Counter + 1
    • この行では、静的変数「Counter」の値が1ずつ増加しています。
      Counter = Counter + 1は、現在の「Counter」の値に1を足して、それを再び「Counter」に代入する処理です。
      これにより、このサブルーチンが呼び出されるたびに「Counter」の値が増えていきます
  • MsgBox “カウンターの値は ” & Counter & ” です。”
    • この行では、MsgBox関数を使って、現在の「Counter」の値をメッセージボックスに表示します。
      具体的には、「カウンターの値は X です。」というメッセージが表示され、「X」の部分に「Counter」の現在の値が入ります。
      サブルーチンが呼ばれるたびに、「Counter」の値が「1」増え、その値が表示されます。
  • 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

解説

コードの解説
  • Sub 再帰カウント()
    • この行では、「再帰カウント」という名前のサブルーチン(処理のまとまり)が定義されています。
      このサブルーチンは、自己呼び出し(再帰処理)を使って繰り返し実行される仕組みです。
  • Static Count As Long
    • ここでは、静的変数「Count」が宣言されています。
      静的変数「Count」はサブルーチンが呼び出されるたびに値が保持されるため、繰り返し処理でも以前の値を覚えていることが特徴です。
  • Count = Count + 1
    • この行では、静的変数「Count」の値が「1」ずつ増加しています。
      このコードは、「Count」に現在の値に「1」を加えた結果を代入する処理です。
      サブルーチンが呼ばれるたびに、Count」の値は1ずつ増えていきます
  • MsgBox “再帰処理の回数: ” & Count
    • ここでは、MsgBox関数を使って、現在の「Count」の値をメッセージボックスに表示しています。
      具体的には、「再帰処理の回数: X」というメッセージが表示され、「X」の部分には現在のカウント数が表示されます。
  • If Count < 5 Then
    • この行では、条件分岐が設定されています。
      「Count」が「5未満」の場合に、次の行の処理を実行するという意味です。
      この条件により、「Count」が「5」に達するまで再帰処理を繰り返します
  • 再帰カウント
    • この行では、「再帰呼び出し」が行われています。
      サブルーチン「再帰カウント」が自分自身を呼び出しています。

      これにより、「Count」が「5未満」である限り、このサブルーチンは繰り返し実行されます。
      「Count」が「5」に達すると再帰呼び出しは終了します。
  • End If
    • この行では、If文の終了を示します。
      条件分岐の処理が終わったことを表しています。
  • End Sub
    • この行では、サブルーチンが終了します。
      これで「再帰カウント」サブルーチンの実行が完了し、VBAの処理は次に進みます。

このコードでは、「再帰カウント」プロシージャが自身を再帰的に呼び出します。
静的変数「Count」はプロシージャが終了しても値を保持し続けるため、再帰呼び出しのたびにCount」が増加します。

再帰が5回実行された時点で処理が停止します。

再帰の考え方について

再帰処理とは、自分自身を呼び出して繰り返し処理を行う手法です。

再帰処理では、通常のループとは異なり、関数やサブルーチンが自らを呼び出しながら処理を続けます
この例では「Count」が「5」になるまで自分自身を繰り返し呼び出し、そのたびに「Count」の値を増加させています。

分かりやすく言えば、再帰処理は「関数やサブルーチンが自分をもう一度使って作業を繰り返す」イメージです。
ただし、再帰は無限に繰り返すとプログラムが止まらなくなるリスクがあるので、必ず終了条件(このコードでは Count < 5)を設定しておくことが重要です。

再帰は、複雑な問題を分割して処理したい場合に使われます。
たとえば、ファイルの階層構造をたどる処理や、数学的な計算(階乗計算やフィボナッチ数列など)を行う際によく使われます
最初は再帰がどのように動作しているかを理解するために、小さな例で試すのが良いでしょう。

まとめ

この記事では、VBAにおける静的変数の基本的な概念、使用方法、および宣言方法について詳しく説明しました。

ポイントのおさらい

  • 静的変数の基本を理解する
    • 静的変数は、プロシージャが終了しても値を保持する特殊な変数です。
      これにより、複数回にわたって変数の値を保持し続けることができます。
      「静的変数とは?」もう一度見る。
  • 静的変数の宣言方法を確認する
  • 静的変数を使う際の注意点を再確認する
  • 具体的なコード例を学ぶ
    • 静的変数を使った具体的な例を通じて、その効果と使い方を確認しました。
      カウンターや再帰的な処理で静的変数がどのように役立つかを理解しましょう。

      「静的変数の使用例」もう一度見る。

さらに学ぶために

静的変数の基本を理解したら、次のステップとして他の変数の種類についても学んでみましょう。グローバル変数やオブジェクト変数も、それぞれ異なる用途で活用できます。

今回の記事を参考に、VBAでの静的変数の使用方法をマスターし、効率的なプログラムを作成して業務の効率化を図りましょう。

タイトルとURLをコピーしました