アットウィキロゴ

変数の型

変数の型



まとめ

小規模な開発なら全部Variant型で良い(断言)。
さすがに何万行とか何十万行とかいう規模にもなると変わってくるかもですし、正確な型宣言はプログラマの誉ですが、それに囚われて先に進めなくなるくらいなら全部Variant型で良いです(断言)。

それでも、最低限、型の取り扱いスキルを上達させたいのであれば、以下の3つを最初の目標にするのが良いかと……。
  • 数値に関わる型の違いを知る。
  • Object型特有の性質(Setステートメント、オブジェクトとして取り扱う)を知る。
  • Object型に属するその他の型が何を格納できるかを知る。

もちろん上記のうち下二つは以下のセクションで必要最低限をまとめますので、参考になれば幸いです。





更新の方針

  • 型についてそれぞれの特徴を掴み、紛らわしい型をまとめる。
  • こういう時はどの型?全部Variant型じゃアカンの?といった疑問解消。



とりあえず参考サイト




変数の型とは?

情報には様々な種類がある、それは文字列であったり、数値であったり、日付であったり、という具合だ。
コンピューターはそれらの情報をハードウェアのリソース(CPUの性能、メモリの容量)が許す範囲内で、あらかじめ指示された処理を施し、加工する装置であると言える。
コンピューターの価値は人間には扱えないような大量の情報をいかに短時間で加工・処理できるかにある。
その価値を高めるために人間ができる事は、そもそものハードウェアのリソースを技術革新などによって増大させる方法と、加工の仕方をより効率的な方法に置き換える方法の二つが考えられる。
そして、変数の型の指定は後者に属する。

余談だが、後者の主役は"アルゴリズム"であろう。本ページでは割愛するが、興味があるなら調べてみると、その処理を工夫する事で劇的にパフォーマンスを改善しうる可能性を秘めているという点で面白いテーマだと思う。

話を戻そう。
変数は情報の入れ物であるわけだから、入れようとしている情報に応じて必要十分なリソース(容量)をあらかじめプログラムが使用する前に確保する必要がある。
仮にどのような情報でも入れることができる万能の変数型があったとしても(実際Variant型としてあるわけだが)、その変数型は最もリソースを消費する情報に合わせてリソースを確保しなければならない。

例えば、0~255の値を格納できるバイト型(Byte)の変数を宣言する場合、VBAでは8ビット(1バイト)のリソースを消費するが、『-1.79769313486231E308 ~ -4.94065645841247E-324 の負の値、および 4.94065645841247E-324 ~ 1.79769313486232E308(ざっくり言うと正の数も負の数も非常識な桁数まで数えられる)』を格納できる倍精度浮動小数点数型 (Double)は64ビット(8バイト)のリソースを消費する。

万能な型とはすなわち、バイト型(Byte)で事足りる処理をわざわざ倍精度浮動小数点数型 (Double)として処理するような話で、たかだか56ビット(7バイト)の無駄とはいえ、数十万行にも及ぶプログラムになれば無駄が積もり積もってコンピューターのパフォーマンスを低下させたり、コンピューターを操作する人間の感覚でもわかるレベルで遅延が発生する事は容易に想像できる。
変数の型とは、そうした無駄を排するアイデアとして必然の帰結だったのかもしれない。

ただ、変数の型で節約できるリソース程度なら、ハードウェアの性能が吸収してくれる事が多くなってきた。
それほどコンピューターの世界は加速度的に処理能力を向上させている。
本ページの冒頭で『全部Variant型で良い』と言い切ってしまっているのは、個人でくみ上げる程度のプログラムであれば、十分に発達したコンピューターがストレスなく動かしてくれてしまうからだ。



Selection型はObject型タイプ

選択範囲を変数に格納する場合に使用できるこの"Selection"型は"Object"型タイプの変数型なので、変数に代入する時は"Set"ステートメントが必要になる。
……どっちもObject型でええがな。
ちなみにこうした型は他にもある。
  • Page型
  • Shape型
  • FileSystemObject型
  • Connect型
みたいな感じ。
ちなみに、どんな型があるかまとめようかと思ったけど、プログラミングにおいて一般的な型以外はほとんど、そのソフトで使われているオブジェクト、すなわちシェイプだとかコネクタだとかを専用に格納する変数を作成するため、そのオブジェクト名そのままの型宣言となっている。
どんなデータを入れるのか?というのも当然、そのオブジェクトを入れるためにあるものと思って間違いない。

この特殊な型は使用するOfficeソフトによって使用できるものが変わってくるらしい。
例えば、ざくっと調べた限りだが、"Range"オブジェクトはExcel 2007のVisual Basic Editor(以下"VBE")では自動メンバ表示機能による入力候補一覧にはあったけど、Visio 2007のVBEには無かった。なぜかって、"Range"オブジェクトはセルの選択範囲を示すオブジェクトなので、セルの無いVisioではあるわけがないという事なのだろう。
その逆もしかり、"Selection"型はオブジェクトの選択状態を示す概念なので、、、ってあれ?Excelにも図形描画ツールあるよな?描画した図形を"選択"できるわけだし、"Selection"型あってもおかしくないんじゃ……。でも無い。どういう事なの?
と思って、試しにExcelで図形を描画する操作をマクロ記録してみた所……
Sub Macro1()
'
' Macro1 Macro
'

'
End Sub

なんてこった、記録されないでやんの。。。
Excel上での図形描画はVBAでは操作できないって事?
この謎は果たしてどうやって解明したらよいのかさっぱりわかりません。
というかVisioの操作が本wikiの主題なので、あまり脱線するのも……というわけで、どなたかお分かりの方がいましたら教えてくれるとうれしいです。




もう全部Variant型でええがな

っていうか、もう全部Variant型でええがな。頭真っ白でもちゃんと動くし。
デメリットとしては動作効率の低下、メモリを食う、とまあパフォーマンスに関わる部分。
個人で小規模な作業を定義する程度ならもう全部Variant型でええがな。

実際、こういうアプローチはVBAを覚えるにあたっての暫定処置としては悪くないみたいです。
:PC Online 型は覚えなくてもいい――基本編(3)



それでも適切な変数の型を宣言したい

――と、私が思う理由について、論理的に説得力のあるものは見つけられない。
あえて挙げるのであれば、それは以下の3つに集約されている。
  • 満足感がある
正しい変数型を指定したプログラミングは、処理に無駄が無いので我々の貴重な時間を無駄にせず、素早く処理を終える事でコンピューターの負荷を減らし、消費電力を減らし、限りある地球の資源を節(以下略。

  • 保守性の向上
例えば以下のようなコードがあったとする。
Sub Macro1()

    Dim hensu As Long
    ~略~
    hensu = x + y
    MsgBox hensu
    ~略~
    
End Sub

変数"hensu"は"Long"型なので、最後の2行の処理は『数値を加算してユーザーに通知しているのだな』と判断がつきます。
次に以下のコード。
Sub Macro1()

    Dim hensu As Variant
    ~略~
    hensu = x + y
    MsgBox hensu
    ~略~
    
End Sub

変数"hensu"は果たして数値計算の結果を代入されているのか?
それとも文字列結合の結果を代入されているのか?その違いを上記だけで判断できるだろうか?
それが数値の加算なのか、文字列の結合なのかを判断するためには前後の処理内容を読み解いて、"x"と"y"に代入されうる値を調べなければならない。

この程度であれば、大した労力にはならないかもしれないが、それが数十万行にも及ぶソースコードであれば"意味を把握する"事の面倒くささは計り知れない。

自分で書いたコードであっても、時間があいてしまうとどこの部位で何をやってるのかを把握するのは難しくなってくる。
そうした時に正しい変数の型宣言は一定の助けになる。
つまり保守性が向上するというわけだ。

  • 学習効果
正しい変数の型を指定するという事は、その型に入る情報の性質が一意に決まるという事であり、適切な型の指定は同時にその型に見合った正しい処理をあなたに強いるはずです。
情報の種類が違えば、その情報に対する適切な操作は変わってくるものです。
あいまいさを抱えたまま、ただ"動くからOK"というのも、ある状況に応じては正義たりえますが、どうせ身に着けるなら"美しい王道"であるべきです。
適切な理解は、あいまいな理解がもたらす予期しないバグを予防できることでしょう。
そうした大局的な意味で、変数の正しい型指定はあなたの学習効果を高めてくれるはずです。






以下編集中
最終更新:2013年05月23日 15:58