Wordマクロ その3 – 変数と定数の話 1


PAK12_101100500

今回からプログラミングの話に入っていきます。
プロを目指すわけでも資格を取るためでもないので、超初心者でもわかりやすい内容にするつもりです。用語の定義など、自己流ですので厳密に学びたい方はちゃんとした本で学ばれることをお勧めします。

今回は「変数」の話です。

プログラムの仕事から離れて既に10年以上経ち、ここ数年は趣味レベルでもしっかりとしたあまりやらなくなってしまっています。
感覚が鈍っているせいか、たまにプログラムを書くと情けないミスがあったりします。
FaceBookに「選択した文字列を★で囲む」コードを投稿しました。

———————————————————————
Sub CommentwStar()

'
' 選択した文字列を★で囲みます
'
'
Dim vTxt As String

vTxt = Selection.Text '選択した文字列を変数vTxtに退避
Selection.Text = "★" & vTxt & "★" '文字列を★で囲んで入れ替え。

End Sub
———————————————————————

このコードは正常に動きます。
じゃあ、何が情けないミスだったかというと、
マクロ名と変数名が変だったのです。
特に変数名は恥ずかしいミスですので、以下のようにコードを修正しました。

———————————————————————
Sub EncloseText()

'
' 選択した文字列を指定した文字で囲みます
'
'
Dim strTxt As String
Dim strEnclosure As String

strEnclosure = "★"

strTxt = Selection.Text '選択した文字列を変数strTxtに退避します
Selection.Text = strEnclosure & strTxt & strEnclosure '文字列を★で囲んで入れ替えます。

End Sub
———————————————————————

何が問題であったかというと、最初に書いた「vTxt」は一般的な表記ではないということです。
プログラムが動かなくなるような致命的なミスではありませんが、プログラムとしては良いコードとは言えません。

書き換えた後の「strTxt」という名前は「str」がプリフィックス(接頭辞)となっており、一目でこの変数がString型であることが分かります。ついでに、もう少し扱いやすいコードに書き換えてました。

ここまで、何の説明もなく「変数」「プリフィックス」「String型」と言ってきましたが、これから説明をしたいと思います。

大雑把に言うと、プログラムは「変数」「関数」「条件分岐」の3つの重要な要素で構成されます。
ほぼすべてのプログラム言語にこの3つの要素が存在します。

変数について

「変数」とは、プログラムで使用するために、メモリ上に一時的に保持しておく値のことです。
変数はプログラムで使用する前に必ず宣言しなければなりません。
宣言とは「何という名前でどのような型の変数であるか」を定義することです。宣言を行うことにより、コンピュータがその変数はどのようなものであるか判断できるようになります。宣言をしなくてもよいケースもありますが、これは特殊な例です。

VBAでは変数を次のように宣言します。

Dim 変数名 AS データ型

これをDimステートメントといいます。

上記の例には、2つのDimステートメントがあり、「strTxt」と「strEnclosure」の2つのString型の変数が宣言されています。

データ型について

変数は「一時的に保持された値」ですが、この値がどのようなものかを指定する必要があります。指定することによって、保持するためのメモリサイズを確保し、正しい型同士での処理を行えるようにするためです。データ型には以下のようなものがあります。

データ型 名前 内容
Boolean ブール型 True/Falseの論理値
Integer 整数型 -32,768~32,767の整数値
Long 長整数型 -2,147,483,648~2,147,483,648の整数(32ビット版のみ)
Double 倍精度浮動小数点型 -1.79769313486231E308~-4.94065645841247E-324の負の値、および4.94065645841247E-324~1.79769313486231E308の正の値
String 文字列型 約2GBまでの文字列
Object オブジェクト型 オブジェクトへの参照
Variant バリアント型 文字列と数値型。万能のデータ型

その変数を扱うプログラムに適した型を選ぶことが大切です。
int型で十分な処理にLong型(またはLongLong型)を使ったり、万能だからといってVariant型を使用するのはメモリの無駄になり、処理速度の低下を招きます。さらには、意図しない結果を生む場合もあります。

変数名について

変数名にはいくつかの命名規則があります。

アンダースコア(_)以外の一般的な記号やスペースは使用できない
先頭の文字に数字は使用できない、など

どのような値かを見ただけで分かるように命名する必要があります。
そこでデータ型を表す以下のような「プリフィックス」を付け、意味が伝わる程度に短縮した名前を付けるのが一般的です。

Boolean型: bln
Int型:int
String型:str
Variant型:var
Object型:obj
など

上記の失敗例では「vTxt」としてしまいました。これは「テキスト」だろうということは分かりますが、「String型」か「Variant型」かは分かりません。

変数は使用する前に宣言しなければならないので、通常プログラムの最初に書かれます。
宣言された変数は、その後何度でも値を設定することができます。上記の例では★を設定しましたが、コードの途中で他の文字を設定することができます。値を変えることができるため「変数」と呼ばれます。

さて、改変前のコードでは「★」をそのまま式の中で使用しましたが、改変したコードでは変数strEnclosureを使用するようにしました。strEnclosure = "★" の行でstrEnclosureに★を代入して、式の中ではこの変数を使っています。
このように変数を使用することで、より複雑な式になった場合でも、この行で代入する値を★から他の文字(■)などに変更するだけで済みます。

定数について

変数の他に「定数」というものもあります。これは読んで字の如く、固定された値です。一旦値を定義すると、その値はプログラムが終了するまで変更されることはありません。例えば、単価や係数など、プログラムのさまざまな箇所で使用される値を固定しておきたい場合に使用されます。
定数には「組み込み定数」「ユーザー定義定数」があります。

組み込み定数

VBAで予め定義されている定数のことです。
使用できる定数は対象によって異なります。
例えば、フォントの色を青にする場合、「16711680」という数字を設定するよりも「wdColorBlue」の方が分かりやすいという利点があります。
非常に数多く存在しますが、VisualBasic Editorには入力補助機能がありますので覚える必要はありません。また、オブジェクトブラウザーを使って、何があるかを確認することもできます。

ユーザー定義定数

ユーザー自身が定数を定義することもできます。
定義するにはConstステートメントを使って宣言します。

Const 定数名 AS データ型 = 設定値

ほとんど変数の場合と変わりませんが、宣言と同時に値が設定されます。
例えば、単価が更新された場合、プログラム内でそのままの数値で処理していた場合、すべての数値を新しい単価に変える必要があります。定数を使用すれば、一度の変更で済ませることができます。
上記の例では変数「strEnclosure」を使用しましたが、これを定数「cstrEnclosure」にした方がよい場合もあります。

Const cstrEnclosure AS String = "★"

定数と判別できるように「c」を加えました。

以上で、ざっと変数と定数について説明しました。
単純に一言で片付けるとすれば、次のようになります。

変数や定数は値を格納するもの

プログラムとは「値を格納した変数や定数をあれこれと処理する手順」と言えると思います。

次回は「関数」についてお話ししたいと思います。
もう少しだけ(3回ほど)プログラムの基礎について話してから、本格的にVBAの話にするつもりです。

息切れしない程度、ぼちぼちと。

では、また。


コメントしてみる

One thought on “Wordマクロ その3 – 変数と定数の話