VBA 変数と定数
VBA 変数と定数について
▲上へ [ 編集 ]
VBA の変数
vb2005(…というより Java とか、C とかも含め…) と vba の大きく異なるところはこの変数の取扱いかもしれない。何しろ、変数の宣言もせずにいきなり代入文を書いて使い始められると言うのが何より手軽。
しかしながら、デバックなどを考えるときちんと変数の宣言をしてから使う事が無難とも思われます。
変数の話以前のお話し
VBA では既定で変数名宣言がなくても変数使用が可能です。デバッグ時のトラブルを考える場合 Option Explicit を宣言してから使うのが望ましいと思います。
Option Explicit
モジュールの宣言領域で "Option Explicit" を入力することで、Dim で宣言した変数だけを有効とすることが出来ます。※変数名入力ミスによる代入エラーなど、目視確認による変数名再チェック不要となるのでデバックの手数が減少します。
Optiion Explicit Sub main() Dim strText As String Dim lngNum As Long '//宣言のない変数の利用は実行時エラーですぐ分かる。 lngNym = 3.14 '変数名誤りのためエラー発生 End Sub※[ツール]→[オプション]→[オプションダイアログ]→[編集タブ]→[変数の宣言を強制する]で Option Explicit が自動入力されるよう設定できます。(既定値:チェックなし)
Option Base *
配列添字の初期値を指定します。モジュールの宣言領域で "Option Base 1" と指定すると、添え字の開始値を 1 からへ変更可能です。指定できるのは、0 / 1 のみ。既定値の初期値は 0 からなので指定の必要はない。しかし「使っちゃ如何!」と思いつつ使いたくなる機能である … (^_^;) …
※VB2005との違い確認中…っうか、VB6 とかには遭ったと思われるが VB2002-3 あたりで一回カットされて、VB2005 あたりで機能的には復活してるかも…使う気ないので確認するのもめんどい。
■添字0-99の配列を定義
Option Base 0 Sub main() Dim arr(100) '〜処理を記述 End Sub■添字1-100の配列を定義
Option Base 1 Sub main() Dim arr(100) '〜処理を記述 End Sub※使い易いが、他の言語系との統一性とか、別の意味で混乱しそうな機能です。
▲上へ [ 編集 ]
VBA 変数のデータ型
いきなり纏めちゃうと、(お薦めするわけでは無い)小さいプログラムを単独で作るなら宣言なしの Variant型 、または、変数名に型指定記号をつけて利用するなどが簡単。計算処理が主なプログラムで精度が必要な場合(処理速度、メモリ効率は考慮しない場合)Double の使用がよいかも。理由は、整数型へ小数点付きデータを代入すると”算術型”の丸めが行われないため。
データをメモリに大量に読み込んで使用する場合や、人に見せて恥ずかしくないソースコードを書くなら、データの特性をよく考慮した変数のデータを宣言するのが好ましい。
その他、思いついたことはその都度追記していきます。
※こんなのきっちり覚える必要ないとは思う … (^_^;) …整数は Long 小数点扱うなら Double 文字列は String … あとはどーにでもなるので、お気軽に!(こんなこと書いていいんかい?)
データ型 | 記 号 | データの 種類 | byte | 適用 |
Byte | - | 正の整数 | 1 | 0 〜 255 ■使用例: ・文字コード(Ascii)取得に便利 bytCode = Asc("a") ・0〜255 範囲の大量のデータ配列(メモリ効率考慮) ■不適と思われる使い方 ・カウンタ用変数(計算単位が Long なのにあまり意味が無い:人手で管理できないほどカウンタ変数を多用する場合は除きます。) |
Integer | % | 整数型 | 2 | -32,768 〜 32,767 ・(参考)記号を使った型指定: intVar% = -32768 ■使用例: VBA の Integer はメモリ使用量、扱い数値範囲が中途半端なので、やはりデータが取扱い範囲内で大量の配列へ読み込むような場合に限られると思います。 分類コード(ISBN,JANとか長いのは不可)、取引先コード(4桁なら…)、商品コード(無理かも…)・・・> Long 使った方が無難かも・・・ |
Long | & | 長整数型 | 4 | -2,147,483,648 〜 2,147,483,647 ※VB2005 での Integer / Int32 :4Byte に相当 ・(参考)記号を使った型指定: lngVer& = -2147483648 |
Single | 単精度 浮動小数点 | 4 | 負の値:-3.402823E+38 〜 -1.401298E-45 正の値:1.401298#-45 〜 3.402823E+38 ・(参考)記号を使った型指定: sglVer! = 0.000003 | |
Double | # | 倍制度 浮動小数点 | 8 | 負の値: -1.79769313486231E 〜 -4.94065645841247E-324 正の値: 4.94065645841247E-324 〜 1.79769313486231E ※vb2005の Double と同じ ・(参考)記号を使った型指定: dblVer# = 0.000000236412 |
Decimal | - | 10進型 | (3) | ※VBE から呼び出した Microsoft Visual Basic のヘルプで探し回ると特定のページにこの型も一応記載がある。…が宣言しようとすると必ずエラーになる変数型です。 ※調べたところ「〜バリアント型 (Variant) の内部処理形式〜云々〜CDec 関数を使用することにより〜」と言った記述がヘルプに載ってます。要は、直接扱えない型ということと思います。 (*3)VBE のヘルプを参照すると 12Byte と 14Byte の二通りが別々のページに載っている。(どっち?) |
Currency | @ | 通貨型 | 8 | -922,337,203,685,477.5808 〜 922,337,203,685,477.5807 ・(参考)記号を使った型指定: curVer@ = 9000000 |
String | $ | 文字列型 | (*1) | "文字列" 最大約20億文字 (*1) ■可変長: Dim str_a As String 10Byte + 文字列の長さ:0〜約2GB(10〜ではないのか?VBE help参照) ※動的なメモリ配列へ格納されるようなので、ポインタ+実体となると思います。 ■固定長: Dim Str_b As String * 256 1〜65526Byte(宣言時指定) 1〜約2GB(ヘルプ上の記載はこれですが?) ※文字数を限定する値は直定数で指定(計算式はエラー発生) ※HELP上で 1 〜 約2GB と記載ありますが、文字数指定で 約63KB(65526までOK確認)エラー。約63KBと言うのも同じ HELP の別ページに書いてあった数値。また、0 指定も当然エラー。環境や Office のバージョンに依存するかもしれません。 ・(参考)記号を使った型指定: strTxt$ = "テストテキスト" |
Variant | - | バリアント型 | (*2) | 何でもOKのVBらしい型…(^.^) 型指定なしはこの型となる。 (*2) 文字列以外:固定長 → 16Byte(固定) 文字列代入:可変長 → 22Byte + 文字列の長さ(可変) |
Date | - | 日付・時刻 | 8 | 日付と時刻 値の代入:newDate = "2007/10/24" |
Boolean | - | Yes / No型 (ブール型) | 2 | True(真:-1) / False(偽:0) ※Yes / No型としてますが、実際には Yes とか No は使えません。どうしても使いたい場合は、定数として Yes = -1 / No = 0 として定義(Integerで動作確認済み/Booleanでもいいと思いますが…)してあげれば利用可能です。 |
Object | - | オブジェクト型 | 4 | Workbook , Range , Font 等 オブジェクトを格納する |
(任意の型名) | - | ユーザー定義型 | - | vb2005 での構造体のようなもの。(厳密には違うかも…)定義方法は、vb2005 が刷新されている事から違うでしょう(^.^)未確認 |
※データ型指定記号と Option Explicit の併用は出来ません。(意味が無い) ※数値型は、Long(4Byte) と Double(8Byte) の使用が推奨されています。 |
※Variant型は便利ですが動作効率やメモリ消費量が増えるなど弊害も考えられる。大量のデータ処理や大量の配列を利用する場合は最適なデータ型を宣言して利用するのが望ましい。
※各型のサイズは、各処理系( VBA , VB2005 , Java , … )や使用PC、OSなどにより変わる。ちなみに VB2005 では Integer(Int32) が VBA の Long に相当する。
※上記の表は覚え書きとして記載。思い込みとか勘違い、入力ミスもあるかも知れませんので参考程度にご覧下さい。
▲上へ [ 編集 ]
変数の宣言
変数の宣言方法はVB2005とほぼ同じようです。Option Explicit '大域変数を定義 Dim GlobalVal As Long Sub main() 'ローカル変数を定義 Dim a '型指定なしは Variant型 勿論 VB2005 ではダメ。 Dim localVal As Long '値の代入は一緒に出来ません。VBAではエラーとなる。 'Dim localVal As Long = 100 '〜処理定義 End Sub※または、Option Explicit なしで、変数宣言せずに a = 10 + 5 等と使い始めても可。但し入力ミスのデバックでしっぺ返しのおまけが付きます。この場合のデータ型も Variant です。または、a# = 3.15 のように変数の型記号を添えることで Long などの型指定が可能。
値の代入
strText = "テキスト" lngNum = 128 dblNum = 640.5 'Let を付けてもいいです。なくてもOK '※N88BASIC とか思い出す書き方…♪ Let nowDate = "2007/10/25"※注)整数の型へ小数点付き数値の代入では、整数値偶数と整数値奇数で小数点以下の丸め方法が異なると言うとんでもない仕様があるため、小数点以下の値は、切上・切捨・四捨五入の関数で処理してから代入する必要あり。知らずにVBAに丸めを処理させる場合は精度が要求されない処理のみとしないと、デバックでかなり悩む事になる。
※注:補足1)Byte,Integer,Long すべてで確認済み。
※注:補足2)整数型変数へ、小数点以下が発生する計算結果を代入する場合にも注意。
※補足)この丸めは”銀行型”丸め方式と言うらしい。常に偶数になるような丸めを行う事をこういうらしい(MicroSoftサポートオンライン)。一般的な丸めは、”算術型”とのこと。
Fix(expression) | 整数・負数の小数部を単純に切捨て expression 省略不可。小数を含んだ値/計算式 |
Int(expression) | 負数の場合、見かけ上切り上げ数値的に切捨て。 expression 省略不可。小数を含んだ値/計算式 例: int(-3.14159)なら-4を返すが、 fix(-3.14259)は-3を返すという違いがある。 |
Round(expression [,numdecimalplaces]) | 丸めの指定 expression 省略不可。小数を含んだ値/計算式 numdecimalplaces 省略可。小数点以下桁数。 省略すると整数部のみを返す。 Round関数も”銀行型”で値を返すので使用には注意。 |
※小数点あり変数で処理を行い、最終的に切り上げ、切捨てを指定して逃げるしかない?かも・・・確認中。→とりあえず小数部の丸め処理手動(+5とか)で、Int又はFixで小数部カットすれば”算術型”で計算可能。
※Round関数で小数点以下を丸めても”銀行型”です。確認済み。
▲上へ [ 編集 ]
VBA の定数
組込定数
vbCrLf | 改行 |
vbTab | Tab文字 |
※VBA では vb2005 の MSDNライブラリ の変わりになるのが、VBE の Microsoft VisialBasicヘルプになると思います。よく見ると結構詳しく載っているので参考になります。
ユーザー定数の定義
Const G_TEXT As String = "Hello " Sub main() Const L_TEXT As String = "World!!" Const MAX_TOTAL As Integer = 100 + 100 MsgBox G_TEXT & L_TEXT & " " & MAX_TOTAL End Sub※当然ながら、宣言時に値を代入可能。変数は宣言時の代入不可(エラー)
※定数値の代入には、変数や計算式の利用が可能。
▲上へ [ 編集 ]
変数の型とデータ型変換関数
※VBA 変換関数 を新規作成、即移動しました。
▲上へ [ 編集 ]
リンク
初めてでも分かるVBAの本
内部リンク
- VBA(VisualBasic for Applications)
- VB2005リファレンス(覚え書き)
外部リンク
- まだありません
▲上へ [ 編集 ]
2009年02月03日(火) 23:52:13 Modified by cafeboy1