Excel VBA | モジュールの宣言(Option Explicit)について

Option Explicitステートメントはモジュールレベルで使用され、宣言されたモジュール内のすべての変数を強制的に表示します。Option Explicitステートメントは、モジュール内のすべてのプロシージャの前に記述する必要があります。 モジュールでOption Explicitが使用される場合は、Dim、Private、Public、ReDim、またはStaticステートメントを使用してすべての変数を宣言する必要があります。

一般的に、Option Explicitがモジュールで宣言されていない場合、変数が事前に宣言しなくても使用できます。ですから、プログラミングが複雑の場合以外、変数宣言は必要ではないを言う人がいます。この論点を支持するユーザーは、一連のメリットを挙げて、変数の宣言が基本的に余計なことが好きな人しか使用しません。実際にはどうでしょうか?

論点1

プログラムにDIMが多すぎると、プログラムはより長く、より複雑に見えます。 実際、コードが50行未満の場合、変数を宣言しないと、多くの文字も入力する必要がありません。入力する時間が節約できますが、本当に節約できるかどうかはプログラムが一回に正常に実行されるかどうかによって決まります。さもなくば、後で費やされるデバッグ時間がもっと長いはずです。一般的に、コードの入力時間はプログラムの総コンパイル時間の20%〜50%を占め、他の時間はほとんどデバッグに費やされます。(プログラミングの天才であっても、自分のプログラムがデバッグの必要がないことを保証できません。)

論点2

変数宣言はプログラムの複雑さを増します。一般的に初心者が変数は難しくて、大量な時間を浪費し、勉強する価値がないと思われましたが、本当にそうなのかは見てみましょう。変数には、文字列、数値、論理値、オブジェクトなど、いくつかの種類しかありません。その中で、数値型には整数型と浮動小数点型があります。もちろん、上記の種類の単一または複数の組み合わせである他の3つのタイプの変数があります。これらの3つの変数型は配列、バリアント、およびユーザーの定義ですが、ただこの3つの変数は上記のいくつの変数の拡張です。配列:特定のデータ型の連続です。バリアント:直感的に、これは特定の変数型の値にパッケージし、視覚的に美しくなりましたが、データアクセス時間とデータスペースが増加します。ユーザーの定義:この類は、1つまたは複数のデータ型の組み合わせであり、プログラミングの過程でデータにアクセスする際のセキュリティを下げること(間違った変数名の入力を防ぎます)を目指し、入力スピードが上がります。こういう風に分析してみると、変数宣言はプログラムの複雑さを増すことはななく、逆に便利をもたらしています。

論点3

変数の習得に時間を費やすことは完全に役に立たないという論点については、変数のテキストを読みながらすべての内容を暗記するならば、テキストを読まないほうがいいと考えます。普通のテキストはすべての変数を一章にまとめて記述しますが、ただ分類しやすいためです。読者がその章をすべて暗記することではありません。著者はただ第二段落の基本概念を理解できればいいです。(半時間ぐらいで、String、Long、Double、Boolean、Objectを理解できます)。変数型の種類を理解すればいいです。Long、Byte……など、暗記する必要がありません。プログラミングする場合にDimを数回使用すると、自然的に覚えていきます。簡単な操作であるのに、また多くの人が難しいと言うのは、よく理解できません。ただ1つのDimは難しくことと言えば、IF……Else……、For……Next、Do……はより難しいではないでしょうか。では、バブルソート、バイナリツリー、赤黒木…がDimより難しいではないでしょうか。

上記に基づいて、変数を使用する前に変数を宣言する習慣を身に付けることは損がありません。

では、変数宣言は必須ですか?答えはいいえですが、変数宣言に損がなければ、変数宣言を薦めます。これは、プログラムを改善するためではなく、プログラムに問題を引き起こす時、お早めにエラーを見つけるためです。(改善の効果は自分の経験によって決まります。一般的に5000行以上のコードに対して変数宣言は便利ですが、コードは100行以内の場合、宣言するかどうか差があまりありません。

変数宣言に特定のルールを使用することは何の役割がありますか? 例えば多くの人がハンガリー記法を使用していますが、著者本人に対しては大きな意味がありません。しかし、多くの人が協同作業でコードを入力する場合、このルールの大きなメリットがあります。自分のコードを他人によりよく理解できるようにするものです。著者本人にとってはこのルールは必要がありません。逆に、他人にコードを理解されたくない場合は、わざと特定のルールをつけなければよいです。著者がコメントを返信する際に、元のコードを訂正する代わりに、コードを一から書き直します。原因は多くの場合に、書き直すことはより速いです。

次はいくつかの簡単なコード(基本的に5行以内)です。変数を使用する際にいくつかの注意点を説明します。

Sub Test0A()
A = 123
B = "A123"
C = 123
Debug.Print A + B
Debug.Print A + C
End Sub

Sub Test0B()
Dim A As String, B As String, C As String
A = 123
B = "A123"
C = 123
Debug.Print A + B
Debug.Print A + C
End Sub

Sub Test1A()
A = "+1"
B = "-1"
Debug.Print A & " > " & B & " = " & (A > B)
A = 1
B = -1
Debug.Print A & " > " & B & " = " & (A > B)
End Sub

Sub Test1B()
Dim A As Long, B As Long
A = "+1"
B = "-1"
Debug.Print A & " > " & B & " = " & (A > B)
A = 1
B = -1
Debug.Print A & " > " & B & " = " & (A > B)
End Sub

Sub Test2A()
ReDim Arr1(0 To 12)
Open "C:\Boot.ini" For Binary As #1
Get #1, , Arr1
Close #1
Debug.Print StrConv(Arr1, vbUnicode)
End Sub

Sub Test2B()
Dim Arr1() As Byte
ReDim Arr1(0 To 12)
Open "C:\Boot.ini" For Binary As #1
Get #1, , Arr1
Close #1
Debug.Print StrConv(Arr1, vbUnicode)
End Sub

注意点:上記のコードの問題点は、変数宣言を使用しないとエラーが発生することを証明するものではなく、変数宣言を使用しないと、データソースに注意しないと、エラーが発生するかもしれないとのことです。このエラーはステートメント上のエラーかもしれませんし、論理上のエラーかもしれません。

初心者がコードを入力する前にすべてのデータ型の特性を完全に理解することが必要ではなく、基本的な概念を理解し、コードを入力するたびに少しづつ学習していけばよいです。例えば、BSTR構造をすべて理解した後、またString型を使用することは無理です。初心者がSafeArray構造を理解してから配列を勉強することも無理です。

“Option Explicit”を開くままにする方法

VBAエディターウィンドウで、[ツール]メニューリストから[オプション]を選択します。

次に、[編集]タブで、[変数の宣言を強制する]をチェックマークしてください。

これより、各VBAモジュールの上部にOption Explicitが自動的に配置されます。

注意点:これは、まだ開かれていないモジュール、クラスモジュールなどに適しています。ですから、[変数の宣言を強制する]をチェックマークした前にSheet1のコードが表示した場合、Option Explicitは追加されません。

Option Explicitでは、Dimステートメントの使用など、使用する前に各変数を定義する必要があります。 Option Explicitが有効になっていない場合、VBAコンパイラは、認識されない単語がVariant型の新しい変数であると見なし、プリントエラーに関連するエラーを見つけるのが非常に困難になります。 Option Explicitを有効にすると、認識されない単語があるとコンパイルエラーが表示され、問題のある行を示します。

次のコードを実行する場合:

Sub Test()
my_variable = 12
MsgBox "My Variable is : " & myvariable
End Sub

次のメッセージが表示されます。

my_variableの代わりにmyvariableでエラーを表示すると、メッセージボックスに空の変数が表示されます。 Option Explicitを使用する場合、コンパイルエラーメッセージが表示されるため、エラーを実行できません。

正しい宣言を追加すると、次のようになります。

Sub Test()
Dim my_variable As Integer
my_variable = 12
MsgBox "My Variable is : " & myvariable
End Sub

myvariableのエラーを示すエラーメッセージが表示されます。

Option ExplicitおよびArraysに関する注意点

ReDimステートメントを使用して、プロシージャ内の配列を暗黙的に宣言できます。

ReDimステートメントを使用する時、配列の名前を間違えないように注意してください
モジュールにOption Explicitステートメントが含まれている場合でも、新しい配列が作成されます

Dim arr() as Long
ReDim ar() 'creates new array "ar" - "ReDim ar()" acts like "Dim ar()"

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です