VBAと日々のこぼれ話

  1. VBA

【VBA】モジュール先頭に記述する4種類のOption キーワード ステートメント

Option キーワード ステートメントとは?

マクロを実行するとまずモジュールに記述されたコードをコンピュータが理解できるように機械語に翻訳する作業があります。(これをコンパイルという)

その際に、このOptionステートメントを記述することで(省略されている場合は規定値を利用して)モジュール全体に関わる設定を行います。

ちょっと格好良く言うなら、コンパイルオプションステートメントと呼ぶのがいいでしょうか。
(公的な呼び方ではないのであしからず)

この「Option キーワード ステートメント」は、VBAには4種類存在しています。

Option Base
Option Compare
Option Explicit
Option Private Module

記述されているモジュール全体の設定を行うものなので、必ずモジュールの先頭に記述する必要があります。
またOptionステートメント同士では、記述する順番によって効果が異なると言ったことはありません。

 

Option Baseステートメント

構文:Option Base 指定値
指定値:0 or 1
ステートメント省略時の規定値:Option Base 0
設定内容:配列の添字(インデックス)の始まり(下限)を「0」とするか「1」とするか

Split関数等が影響を受けないため使い勝手が悪く、あまり人気がありません。

もし配列の添字の始まりを「1」にしたいのであれば、

Dim A(1 To 10) As String

といったようにインデックスの範囲を指定(下限 To 上限)と明示的することで簡単に設定できます。

配列の宣言について

そもそも配列の宣言を構文化すると「Dim 変数名(下限 To 上限) As データ型」といった書き方になります。

インデックスの始まり(下限)を調整したい場合だけ「Dim 変数名(下限 To 上限) As データ型」といった形が登場するので知らない方も多いようですが、一般的な「Dim 変数名(上限) As データ型」という書き方は、暗黙の了解でインデックスの下限・範囲指定の「To」を省略した形です。

省略した形が一般的なのは、「Option Base ステートメント」によってモジュール内の配列のインデックスの下限は決まっているためだと考えられます。必要もないのにコードを長くすることはありませんからね。

【スポンサーリンク】



Option Compareステートメント

構文:Option Compare 指定値
指定値:Binary or Text or DataBase
ステートメント省略時の規定値:Option Compare Binary
設定内容:文字列比較時の並べ順をどうするか

指定値について

Binary:バイナリ文字コードのコード順
Text:大文字小文字を区別しないシステムのロケール(特定の言語および国/地域に対応する情報)設定による並べ替え
DataBase:データベースの設定(データベースのロケールIDによる並べ替え ※Microsoft Accessのみ

ロケールについて

Textが利用するシステムのロケールは、Windowsの設定>時刻と言語>地域と言語の「言語」で確認できます。

DataBaseが利用するロケールIDは、Accessのファイル>オプション>基本設定の『新規データベースの並び順』で確認できます。(Office 2016)

ソフトによって規定が違う?

Accessでは新規モジュールを作成すると「Option Compare DataBase」が自動挿入(ツールバー等での設定不要)されます。
暗黙的にAccessVBAでの規定値は、DataBaseだと言っているようなものです。
ですが面白いのは、この記述を消すとExcelVBA等と同様に「Option Compare Binary」が採用されます。

Option Explicitステートメント

構文:Option Explicit
指定値:なし(記述がない場合は強制なし)
設定内容:すべての変数は明示的に宣言するように強制

一番重要視されている?

「Option キーワード ステートメント」の中では唯一、VBEのメニューバーのツール>オプション>編集より「変数の宣言を強制する」へのチェック有無でモジュールへの自動挿入の設定が可能です。

この設定については『チェックすべきだ』『しなくても良い』という情報がWebにはゴロゴロとしています。
個人的には『チェックがあった方が便利で綺麗なコードが書きやすく』メリットが大きいと思いますが、絶対にチェックすべきだとは言い切れません。

というのも先ほども触れましたが、Optionステートメントで唯一VBEのメニューバーより設定が可能です。
それだけで重要な設定だということは分かります。

もし本当に設定に必要な設定なのであればコーディング規約で縛っても良いはずなのですが、最終判断はユーザーに任せています。
何より、デフォルトでは明示的な変数宣言は任意状態です。

これは、必ずしも設定しなくても良いと言うことです。

そもそも『Option Explicit』を設定するのは変数の誤記チェックやデータ型のスコープチェックのためであり、これは時間と集中力があれば目視でもチェックできます。

『Option Explicitを付けるべき』だと思うのは、

・規模が大きい
・手間暇を減らしたい
・品質を担保したい

付けるべき理由を整理してみると、特別なポリシーがなければ設定した方が良いと思います

Option Private Moduleステートメント

構文:Option Private Module
指定値:なし(記述がない場合はアクセス制限なし)
設定内容:同モジュール内の全てのプロシージャについてアクセス制限

ただし同一プロジェクト内であれば別モジュールであっても呼び出しは可能です(もちろん他モジュールから呼び出せるのはPublicなもの)
制限がかかるのは他のプロジェクトからのアクセスです。

よって、複数のプロジェクトを連携するようなツールでなければ利用することもないのでマイナーなステートメントだと思います。

【スポンサーリンク】



VBAの最近記事

  1. 【VBA】未だに苦手としていること

  2. 【VBA】モジュール先頭に記述する4種類のOption キーワード ステートメント

  3. 【VBA】同じ階層体系のフォルダを量産したい

  4. VBAの腕を知るための3つの短い質問を考える

  5. 【VBA】ExcelやテキストへDAO・ADO接続する際に使用するISAMフォーマット一覧…

関連記事

【スポンサーリンク】




PAGE TOP