変数★Dim

わずかな知識で VBA!

変数
Dim


 

変数の型



   VBAで変数を使うと「マクロの記録」から1ランク上のプロシージャが作成できます。

   「マクロの記録」では変数は一切記録されません。


   変数は、「Dim」ステートメントを使ってデータの型と共に宣言します。

   変数の宣言は、通常は、プロシージャ定義の先頭行で行います。
   Sub・・・ あるいは、Function・・・と書かれたすぐ下です。

    例
      Sub nyuryokuiti()
         Dim na1 As String



   変数というのは、物をいれておく箱みたいなもので、
   実際の処理に入る前に、その中で使う変数を全て宣言しておきます。

    と、以前説明しました。

   では、変数ってなんでしょうか?

   プログラムは、ユーザーの操作によって様々な値を、データとして記憶します。
   それらの様々なデータを、記憶しておくために「変数」が用意されているのです。

   つまり、変数という名の、データ収納用のメモリー領域を確保することが、
   変数の宣言です。

   基本的には、数学で習ったXや、Yと同じものです。
   常に変化する可能性のある値なので、「変数」というわけです。

   読んでもつまらないと思いますが、とても重要なことばかりなので、
   ガマンして読んでください!
      

わずかな知識で
VBA!





  

  変数の名前

    変数を使うときには、まず、あなたがその名前を決めてください。
    パッと見でも、その変数の特性が分かりやすいものがいいです。

    VBEのオンラインヘルプでは、効率のよい変数の名前として、
    「データの型を表す文字」(その変数の役割を示すような文字)を勧めています。

    簡単なプロシージャだと、変数も少なく、プロシージャも短いので、変数名は何でもいいと思います。
 
    しかし、これが長いプロシージャだと、変数の宣言部分も画面から外れ、その変数の型は何かを確認する
    ためには、画面をスクロールして宣言部分を表示させなければ確認できなくなります。

    VBEのオンラインヘルプの中に、「intX」や「intY」というような変数を多々みつけることができます。
    この「int」がなければ、XやYというようにすっきりとしますが、上記の理由で、あとで説明する「Integer型」
    の変数だということを示しているのです。

    自分が分かればいいのですから、自分流の規則を作り、それに沿って変数の名前を付けてください。

       1)変数だとわかる名前を付ける
       2)プロシージャのタイトルや、VBAのキーワードと一致しない名前にする
       3)どの型の変数か連想できる名前にする

    この程度を押さえておけば十分です。


  変数の宣言

     一部の説明が、<(ゲームで覚えるVBAプログラミング)の章>の説明とダブリますが、
     もう一度おさらいをしておきましょう!

     変数は、実際には特に宣言をせずに、ソースの中でいきなり使用してもエラーにはなりません。

     それは、VBAには、「Variant型」という「どんな型のデータでも受け入れてくれる」
     便利なデータ型があるからです。

     宣言なしで使用された変数は、すべてこの型に設定されてしまいます。

     ですが、このような使い方はできるだけ避けるようにします。

     変数は、名前を付けられたメモリー領域のことですから、
     どんな型のデータも入る「Variant型」の変数は、他の変数に比べ非常にたくさんのメモリーを必要とし、
     それが原因で、Variant型の変数の多用は、処理速度の低下も招きます。
 
     このVariant型の存在が、プログラムミスの原因となることがあります。

     ソースの先頭行で正しく変数を宣言したとしても、変数名を入力したときにスペリングミスを犯すと、
     その変数は宣言した変数とは違うVariant型の変数とみなされてしまうからです。

     宣言したはずの変数に代入されるはずのものが、スペリングミスのせいで
     他の変数に代入されてしまいます。

     VBAには、構文エラーを見つける「プロジェクトのコンパイル」という機能がついていますが、
     それを使用しても正常終了してしまいます。

     スペリングミスは手作業で入力していくため、防げませんが
     スペリングミスを容易に発見することはできます。

     それが、「Option Explicit」ステートメントです。

     このステートメントを各Moduleの先頭で宣言すると、宣言した変数以外は使用できなくなります。
     つまり、実行時にエラーと判断されるわけです。

     また、「プロジェクトのコンパイル」でも見つけることができ、大変便利です。

     新しくモジュールを作成するたびに、
     「Option Explicit」ステートメントを自動的に挿入されるようにすることもできます。
 
     VBEのメニューから「ツール(T)」⇒「オプション(O)」を選択し、
     表示されたダイアログボックスの「変数の宣言を強制する(R)」チェックボックスにチェックマークを入れます。


         


  変数の通用範囲

    変数の宣言は、通常は、プロシージャ定義の先頭行、
    Sub・・・ あるいは、Function・・・と書かれたすぐ下で行うと書きました。

    つまり、そのプロシージャ内で宣言したことになります。
    この場合、宣言された変数は、そのプロシージャの中だけで利用できるようになります。

    プロシージャが終了してしまうとその変数も消えてしまい、
    当然、代入も、その値を参照することもできなくなります。

    しかし、同じ変数を複数のプロシージャで利用したい場合もあります。
    そのような場合は、プロシージャの外、コードウィンドウの一番上で宣言します。

      


     マウスカーソルを置いて「Enter」キーを押し、空白行を作ってそこに入力します。

     そこにDimステートメントで宣言した変数は、そのモジュール内の全てのプロシージャで利用できます。
     そこにPrivateステートメントで宣言した変数も、同じです。


     また、全てのモジュール内のプロシージャで利用したい変数もあります。
     その場合は「Public」ステートメントを使って宣言します。

     ただし、Publicステートメントで宣言した変数は、どのプロシージャからも変更が可能なため、
     プログラミングする上では、注意が必要です。

     プロシージャが終了しても、自動的にクリアされず、Excelを終了するまで、その値を持ち続けます。
     そのため、次のプロシージャの開始時に、意識的にクリアする必要もでてきます。

     加えて、宣言する場所もモジュール1に限定するなどして、わかりやすくしておくべきでしょう。


     エクセルでは、ワークシート上のセルを利用すれば、
     Publicステートメントで宣言する変数はあまり必要ないと思います。
 

  変数の型

     変数の宣言とは、その変数のデータの型を宣言することです。

     変数のデータ型を宣言すると、プログラミングミスも回避しやすくなります。
     宣言した型と違う種類のデータを変数に入力すると、
     プロシージャの実行時に、実行時エラーを返してくれるからです。

        

  
    変数の宣言は

    適用範囲 変数名 As データ型

    というように宣言して定義します。

   それぞれは、半角のスペースで区切ります。
   適用範囲は、記述の通りその宣言場所によって異なりますが、通常は「Dim」を用いて宣言します。


   VBAで使用できるデータは、数字だけでなく、文字やオブジェクトなどがあり、
   さらに、数値といってもいくつかの種類に分類されています。

   これらの分類がなぜ必要なのかと言うと、変数はメモリー領域だという説明をしました。
   「メモリー(拡張RAM)を増やせばWindowsは早くなる。」ということを耳にしていると思います。

   プログラムを実行するときは、できるだけメモリーを使わないようにしたほうが良いといわれています。
   変数もメモリーを消費するので、少しでも節約できるようにします。

   どんな型のデータも入る「Variant型」の変数は、他の変数に比べ非常にたくさんのメモリーを必要とし、
   それが原因で、Variant型の変数の多用は、処理速度の低下を招きます。

   プログラムの中で変数はどうしても使用しなければならないので、
   少しでもメモリーを節約できるように分類されているのです。

   たとえば、データが「1」という一桁でも、変数のデータ型により確保されるメモリー領域は、一定の大きさです。

   Variant型だと、この一桁のデータのためにも「22バイト+文字列の長さ」のメモリー領域が確保されます。
   一番小さな「Byte型」でも1バイト確保されます。

   1バイトとは、何かというと、コンピューターは2進法と言って0と1の組み合わせで数を表現します。
   電気的に判断するため、正確にはオン、オフではありませんが、オン状態を1、オフ状態を0としています。
   つまり、一桁で表現できる数値は2個だけです。この1桁分を1ビットといいます。
   これが、8桁分集まったものを、1バイトといいます。初期のコンピュータが8桁から始まった名残でしょうか。

   Variant型は、22×8 = 176ビット+文字列の長さ分のメモリーを消費することになります。
   たとえ、収納するデータが「1」でも、
   宣言せずに「Variant型」にされると、これだけ膨大なメモリーを消費してしまいます。

   
変数の主なデータ型
データ型 使用メモリー 値の範囲
バイト型:Byte 1バイト 0〜255の正の整数を保存できます。
ブール型 2バイト TrueまたはFalseを保存します。
整数型:Integer 2バイト -32,768〜+32,767の正の整数を保存できます。
長整数型:Long 4バイト Integerで保存できない大きな整数を保存します。
-2,147,483,648〜2,147,483,647
通貨型:Currency 8バイト Longより桁の大きな少数点がついた数値を扱う時に使用します。
-1922,337,203,685,477.5808〜1922,337,203,685,477.5808
単精度浮動小数点型:Single 4バイト 小数点を含む数値を保存します。
倍精度浮動小数点型:Double 8バイト Singleよりも桁の大きな小数点を含む数値を保存できます。
オブジェクト型:Object 4バイト オブジェクトの参照を格納できます。
日付型:Date 8バイト 日付と時刻を「日付リテラル形式」という特殊な形式で保存します。
文字列型:String 10バイト+文字列の長さ 文字列を保存します。
バリアント型:Variant 22バイト+文字列の長さ 悪名高きバリアント型です。なんでも保存できます。

  バイト型:Byte   1バイト

      一番メモリーを必要としませんが、「正」の値しか保存できません。
  
  整数型:Integer  2バイト

      -32,768〜+32,767の正の整数を保存できます。
      この範囲を超えるようなら、「長整数型(Long)」を使います。

  長整数型:Long  4バイト

      -2,147,483,648〜2,147,483,647
      Integerで保存できない大きな整数を保存します。

  通貨型:Currency  8バイト

      Longより桁の大きな少数点がついた数値を扱う時に使用します。
      -1922,337,203,685,477.5808〜1922,337,203,685,477.5808
      こちらは、下の「Single]や「Double」と違って、固定小数点です。

  単精度浮動小数点型:Single  4バイト

      少数点がついた数値を扱う時に使用します。
      ただし、この浮動小数点というのが曲者です。

      VBAには、「少数点を持つ型の変数を使用した計算をしてはいけない」という鉄則があります。

      答えが「1.00」のハズなのに、セルの中身は「0.99999999908758」みたいになっている
      数式の結果をみたことがあると思います。
      マクロ内で変数を使用した計算を実行すると必ず出現します。

       例
        Dim atai as single

          atai = 2.10
          atai = atai - 0.10
          Range("A3").Value = atai

      セルA3には、「2.00」ではなくて、「1.99999988079071」などと入力されます。

      これは、この浮動小数点が招いているもので、この型を使用するときは、セルに直接
      変数の値を入力するのはやめておいた方がいいです。

      セルに入力する場合は、端数処理や、Format関数等を使用し、形を整えてから行います。
      他にこれを防ぐ方法として、ワークシートで端数処理を伴った計算を行い、
      その結果を文字列(String型)として取得して、それをセルに記入する方法もあります。

      全てをマクロで行わずに、Excelの機能を使用することも
      必要なテクニックです。

      また、少数点付きの変数の計算を行うときは、SingleやDoubleではなくて、
      Currencyを使うという抜け道もあります。

  倍精度浮動小数点型:Double  8バイト

      Singleよりも桁の大きな少数点がついた数値を扱う時に使用します。
      私は、必要としたことが無いので、使ったことがありません。

  オブジェクト型:Object 4バイト

      この変数には、オブジェクトの参照を格納できます。
      ただし、「Object」は総称型で、他に固有オブジェクト型というものがあります。
    
        例:Workbook、Worksheet、Range

         Dim setcell As Object
        Dim setcell As Range


       上記2つは、機能的にはどちらも同じです。
       ただし、固有オブジェクト型には、エラーが発見しやすい。実行速度が若干向上するなどの
       利点があるそうです。体感したことはありませんが。

  日付型:Date 8バイト

      日付と時刻を「日付リテラル形式」という特殊な形式で保存します。
      ただし、古い年代を扱う場合には、注意が必要で、以前さわがれた、1990年問題や、2000年問題は
      この変数が原因です。

  文字列型:String 10バイト+文字列の長さ

      文字列を保存します。

  バリアント型:Variant 22バイト+文字列の長さ

      悪名高きバリアント型です。なんでも保存できます。
      変数の型を宣言しなかった変数は全てこの型になってしまいます。
      マイクロソフトもこの変数を使用すると、「僅かですが、処理速度が遅くなります。」と公言しています。
 

  昔のコンピュータは、8ビットから始まりました。現在は、32ビットはあたりまえで、64ビットのものもあります。
  一度に読み込めるデータの数が変わってきているので、必ずしも、使用メモリーの少ない変数の方が
  処理速度が速いとは言えなくなってきているそうです。

  そんな訳で、Variant型以外の変数は、どの型に宣言するかで、そんなに神経質になる必要はありません。
  同じような変数が数種類ありますが、そのなかで、この変数でなけでば動作しないというものは、
  あまりありません。

  怖がらずに、使用してみて、エラーになったら修正すればいいのです。

        


  わずかな知識でVBA!       TOP

  マクロで何ができる?   ユーザーインターフェース    マクロの記録   マクロの登録
 
  イベントについて      マクロの編集とデバッグ    ゲームで覚えるVBAプログラミング
 
  オブジェクトの操作     セルの操作            MsgBox関数・InputBox関数
 
  変数の型           ヘルプの活用          イミディエイトウィンドウ  
 
  Withステートメント      Setステートメント
 
  条件分岐のステートメント   If Then Else,Select Case
 
  繰り返しのステートメント   Do Loop
 
  繰り返しのステートメント   For Next
  
  ダイアログボックスを作ってみよう1               ダイアログボックスを作ってみよう2 【実践編】
  
  ActiveXコントロール   各コントロールのプロパティ       文字列の操作        Endプロパティ

  リンク・検索   相互リンク    マイプロフィール       YouTubeの部屋 

Copyright (C) わずかな知識でVBA! All Rights Reserved