Excel マクロの変数と定数について

この記事では、マクロに含まれる定数と変数、それらを使用できる場所、さまざまなデータ型の主な違いについて説明します。 変数を書くだけでそれを決して変更できない場合、定数が必要な理由も明らかになります。

他のプログラミング言語と同様に、データは変数または定数に格納できます (どちらもデータ コンテナーとも呼ばれます)。 これが、これらの概念の主な違いです。 前者は、プログラムで何が起こるかによって変更される可能性があります。 同様に、定数は XNUMX 回設定され、その値は変更されません。

定数は、同じ大きな値を複数回使用する必要がある場合に役立ちます。 数値をコピーする代わりに、単に定数の名前を書くことができます。 たとえば、定数「Pi」を使用して、定数値である Pi を格納できます。 それは非常に大きく、毎回それを書いたり、検索してコピーしたりするのは非常に困難です。 したがって、XNUMX文字を書くだけで十分であり、環境は自動的に目的の数を使用します。

Excel ユーザーは、変数に格納されている値を時々変更する必要がある場合、変数を宣言する必要があります。 たとえば、製品の現在の VAT 率を格納する sVAT_Rate という変数を設定できます。 変更された場合は、すぐに修正できます。 これは、一部の商品が VAT の対象とならない可能性がある米国でビジネスを行う場合に特に役立ちます (この税は州によっても異なります)。

データ型

各データ コンテナーは、いくつかのタイプのいずれかになります。 以下は、処理される情報の標準タイプを説明した表です。 それらの多くがあり、初心者には最初は互いに繰り返しているように見えるかもしれません。 しかし、これは幻想的な感覚です。 正しいデータ型を指定することが非常に重要である理由を理解するために読んでください。

小さい数値の場合にメモリ内でより多くのスペースを占有するデータ型を使用することはお勧めしません。 たとえば、数値 1 の場合、Byte 型を使用すれば十分です。 これは、実行可能モジュールのパフォーマンスにプラスの効果をもたらします。特に、弱いコンピューターではそうです。 しかし、ここで行き過ぎないことが重要です。 コンパクトすぎるデータ型を使用すると、大きすぎる値が収まらない場合があります。

定数と変数の宣言

最初に宣言せずにデータ コンテナーを使用することは、強くお勧めしません。 次に、いくつかの問題が発生する可能性があります。これを回避するには、変数または定数の列挙を含む数行の小さなコードを記述する必要があります。

変数を宣言するには、Dim ステートメントを使用します。 たとえば、次のようにします。

整数としての Dim Variable_Name

Variable_Name は、変数の名前です。 次に、データ型を示す As 演算子が記述されます。 文字列「Variable_Name」と「Integer」の代わりに、独自の名前とデータ型を挿入できます。

定数も宣言できますが、最初にその値を指定する必要があります。 オプションの XNUMX つを次に示します。

定数 iMaxCount = 5000

公平を期すために、変数を宣言せずに実行できる場合もありますが、この場合は自動的に Variant 型が割り当てられます。 ただし、これは次の理由からお勧めしません。

  1. Variant の処理ははるかに遅く、そのような変数が多数ある場合、弱いコンピューターでは情報処理が大幅に遅くなる可能性があります。 それらの秒が決定するように思われますか? しかし、大量のコード行を記述し、それを性能の低いコンピューター (最新のオフィス スイートでは大量の RAM が必要なため、まだ販売されています) で実行する必要がある場合は、作業を完全に停止できます。 マクロの不適切な記述により、RAM の量が少なく、複雑なタスクを実行するように設計されていないスマートブックがフリーズする場合があります。 
  2. 名前のミスプリントは許可されていますが、これは Option Explicit ステートメントを使用して防止できます。これにより、宣言されていない変数が見つかった場合にそれを見つけることができます。 これはエラーを検出する簡単な方法です。わずかなタイプミスでもインタープリターは変数を識別できなくなるからです。 また、変数宣言モードをオンにすると、モジュールの最初で宣言されていないデータ コンテナーが見つかった場合、インタープリターはマクロの実行を許可しません。
  3. 変数値がデータ型と一致しないことによるエラーを回避します。 通常、整数変数にテキスト値を代入するとエラーがスローされます。 はい、一方で、ジェネリック型は宣言なしで割り当てられますが、事前に宣言されていれば、ランダム エラーを回避できます。

したがって、すべてにもかかわらず、Excel マクロですべての変数を宣言することを強くお勧めします。

変数を宣言するときに注意すべきことがもう XNUMX つあります。 宣言時に変数に値を代入しないことも可能ですが、この場合はデフォルト値を取得します。 例えば:

  1. 行が空になります。
  2. 数値は値 0 を取ります。
  3. ブール型の変数は、最初は false と見なされます。
  4. デフォルトの日付は 30 年 1899 月 XNUMX 日です。

たとえば、以前に値が指定されていない場合は、整数変数に値 0 を割り当てる必要はありません。 彼女はすでにこの番号を持っています。

Option Explicit ステートメント

このステートメントを使用すると、VBA コードで使用されるすべての変数を宣言し、コードを実行する前に宣言されていないコンテナーの存在を確認できます。 この機能を使用するには、マクロ コードの一番上に Option Explicit コードの行を記述するだけです。

毎回このステートメントをコードに含める必要がある場合は、VBA エディターの特別な設定を使用して行うことができます。 このオプションを有効にするには、次のことを行う必要があります。

  1. ツール > オプションのパスに沿って開発環境に移動します。
  2. この後に開くウィンドウで、[エディター] タブを開きます。
  3. 最後に、Require Variable Declaration 項目の横にあるチェックボックスをオンにします。

これらの手順が完了したら、[OK] ボタンをクリックします。 

これで、新しいマクロを作成するたびに、この行がコードの先頭に自動的に挿入されます。

定数と変数の範囲

各変数または定数のスコープは限定されています。 宣言する場所によって異なります。

関数があるとしましょう 総費用()、そしてそれは変数を使用します sVAT_Rate. モジュール内の位置に応じて、スコープが異なります。

Option Explicit

単一としてのディム sVAT_Rate

関数 Total_Cost() を Double として

.

.

.

エンド機能

変数がモジュール自体の先頭で宣言されている場合、その変数はそのモジュール全体に伝播します。 つまり、すべての手順で読み取ることができます。

さらに、プロシージャの XNUMX つが変数の値を変更した場合、次のプロシージャもこの修正された値を読み取ります。 しかし、他のモジュールでは、この変数はまだ読み取られません。

Option Explicit

関数 Total_Cost() を Double として

単一としてのディム sVAT_Rate

   .

   .

   .

エンド機能

この場合、変数はプロシージャ内で宣言されており、別のプロシージャで使用されている場合、インタープリターはエラーをスローします。

変数を他のモジュールで読み取れるようにする場合は、Dim キーワードの代わりに Public キーワードを使用する必要があります。 同様に、Dim という単語の代わりに記述される Public ステートメントを使用して、変数のスコープを現在のモジュールのみに制限することができます。

定数のスコープも同様に設定できますが、ここでのキーワードは Const 演算子と一緒に書いています。

これが定数と変数でどのように機能するかの良い例を示した表です。

Option Explicit

単一としての公開 sVAT_Rate

パブリック定数 iMax_Count = 5000

この例では、Public キーワードを使用して変数を宣言する方法と、パブリック定数を宣言するために Visual Basic エディターで何を記述する必要があるかを確認できます。 これらの値コンテナーのスコープは、すべてのモジュールに適用されます。
Option Explicit

プライベート sVAT_Rate As Single

プライベート Const iMax_Count = 5000

ここでは、Private キーワードを使用して変数と定数を宣言しています。 これは、それらが現在のモジュール内でのみ表示され、他のモジュールのプロシージャがそれらを使用できないことを意味します。

定数と変数が必要な理由

定数と変数を使用すると、コードの理解度を高めることができます。 また、一般的に初心者が変数が必要な理由について疑問を持たない場合、定数の必要性に関して多くのあいまいさがあります。 そして、この質問は、一見すると非常に論理的に思えます。 結局のところ、一度変数を宣言すれば、二度と変更することはありません。

答えは、メモリ内で大きなスペースを占有するデータ型の使用に関して、同じ面のどこかにあることが判明しました。 膨大な数の変数を扱っている場合、誤って既存のコンテナーを変更する可能性があります。 ユーザーが特定の値を決して変更しないと規定すると、環境はこれを自動的に制御します。

これは、マクロが複数のプログラマーによって書かれている場合に特に重要です。 一部の変数は変更してはならないことがわかっている場合があります。 もう一つはそうではありません。 Const 演算子を指定すると、別の開発者はこの値が変更されないことを認識します。

または、ある名前の定数があり、変数の名前が異なるが類似している場合。 開発者は単にそれらを混同することができます. たとえば、変更する必要のない 11 つの変数は Variable1 と呼ばれ、編集可能な別の変数は VariableXNUMX と呼ばれます。 人は、コードを書いているときに、余分なユニットを誤ってスキップしてしまい、それに気付かないことがあります。 その結果、値のコンテナが変更されますが、これには触れないでください。

または、開発者自身が、どの変数に触れてどの変数に触れないかを忘れている可能性があります。 これは、コードが数週間にわたって書かれ、そのサイズが大きくなった場合によく発生します。 この間、この変数またはその変数の意味さえ忘れがちです。

はい、この場合はコメントで構いませんが、Const という単語を指定した方が簡単ではないでしょうか。

結論

変数は、計算から特定のイベントについてユーザーに通知したり、スプレッドシートのセルに特定の値を指定したりするなど、複雑な操作を実行できるマクロ プログラミングの重要なコンポーネントです。

これらのコンテナーの内容が将来変更されないことが開発者に確実にわかっている場合は、定数を使用する必要があります。 誤って間違える可能性があるため、代わりに変数を使用しないことをお勧めします。

コメントを残す