4.変数と定数
 4ー1変数と定数の宣言方法

	Const fil1 As String = "c:\4月PKG.xls"  '定数の例
        Public Const dva As String = "b:"        '共通定数
	'
        Dim aaa As Integer     '整数型
        Public xxx As Integer '整数型(共通の場合)
	Dim bbb As Long        '長整数型
	Dim ccc As Single      '単精度浮動小数点数型
	Dim ddd As Double      '倍精度浮動小数点数型

	Dim eee As String      '文字列型
	Dim fff As Date        '日付型
	Dim ggg As Currency    '通貨型
   
	Dim hhh As Object      '任意の型のオブジェクト
	Dim iii As Variant     'バリアント型
	Dim jjj                'バリアント型
        Dim kkk As Boolean     'ブ−ル型(TrueかFalse)
	Dim lll(50) As String   '文字列型1次配列
	Dim mmm(3.20) As String '文字列型2次配列
 
 ----- 下記の方法でも可(最近は余り使用しない)----------
	Dim aaa%             '整数型
	Dim bbb&             '長整数型
	Dim ccc!             '単精度浮動小数点数型
	Dim ddd#             '倍精度浮動小数点数型
	Dim eee$             '文字列型

----- 1行に記述する場合 ----------
(正) Dim aaa As Integer,bbb AS Integer
 (誤) Dim aaa,bbb AS Integer            'aaaはバリアント型となる


・上記はモジュール変数・定数の記述例で、そのモジュールの最初に入れる
・最初の行に"Option Explicit"と記述しておけば宣言していない変数を使用した場合 メッセ−ジが出る。

(参考4-1a) 変数の名前付けの使用制限
・VBA関数、メソッド、プロパティで使用の文字は使用不可
・名前は255文字(半角)以内にする
・名前の先頭は文字(数字や記号はダメ)
・名前の中に、[!][@][&][$][#][.]等の記号文字は使用不可


参考4ー1:変数とステートメントの関係
変数名ステートメント宣言する場所記事
ローカル変数なし
Dim
Static

プロシージャー内
その値はそのプロシージャが実行さ
れている間たけ保持(なし:暗黙宣言)
Excelが起動されている間保持
モジュール
レベル変数
Dim
Private
モジュール先頭の
宣言セクション
モジュール内の全てのプロシージャ
で使用できる。Privateも同じ機能だ
が、ローカルのDimと区別したい時使用
パブリック変数Public
(Global)
モジュール先頭の
宣言セクション
すべてのブック・モジュール・プロ
シージャで使用できる。
ただし、全てのブックで使用するには
[ツール(O)] [参照設定(F)]で参照
するブックの指定が必要

参考4ー2:定数とステートメントの関係
変数名ステートメント宣言する場所記事
ローカル変数なし
Const

プロシージャー内
その値はそのプロシージャが実行さ
れている間たけ保持(なし:暗黙宣言)
モジュール
レベル変数
Const
Private
モジュール先頭の
宣言セクション
モジュール内の全てのプロシージャ
で使用できる。 Privateも同じ機能だ
どこでも使用できる。
パブリック変数Public
Const
モジュール先頭の
宣言セクション
すべてのブック・モジュール・プロ
シージャで使用できる。
ただし、全てのブックで使用するには
[ツール(O)] [参照設定(F)]で参照
するブックの指定が必要

参考4−3:変数の適用範囲
下記図は変数の適用範囲の適用範囲を示す。変数の適用範囲を理解すれば因数等を ほとんど使用する必要もなくVBAでマクロを簡単に作成出来るようになる。

・上図のパブリック変数"pa"は、Modele1、Modele2に対し有効
・上図のモジュ−ル変数"ma"は、Modele1、に対し有効
・上図のモジュ−ル変数"mb"は、Modele2、に対し有効
・上図のローカル変数"a"〜"d"は各subプロシジャ内で有効

4ー2データの種類
変数や定数にとって重要なのが、データのタイプを表すデータ型である。 各データ型で消費するメモリ量が異なるので、必要以上に大きい数値まで扱える データ型を使用しない方がよい。(バイトが小さければマクロ実行速度も早くなる)

バリアント型は、数値と文字列のどちらにも使用することができる、しかしバリアント型 は最もメモリを消費するので他を宣言できるのであれば、そちらを宣言した方がよい。

参考4ー4:データの種類
データ型の種類表記データ範囲記事
ブール型Boolean Trueまたは False 2バイト
整数型 Integer -32,768 〜 32,7672バイト
長整数型Long -2,147,483,648 〜 2,147,483,6474バイト
単精度浮動
小数点型
Single -3.402823E38〜-1.401298E-45(負の値)
1.401298E-45〜3.402823E38(正の値)
4バイト
倍精度浮動
小数点型
Double -1.79769313486232E38〜
-4.94065645841247E-324(負の値)
4.94065645841247E-324〜
1.79769313486232E308(正の値)
8バイト
通貨型 Currency -922,337,203,685,477.4808〜
922,337,203,685,477.5807
8バイト
日付型 Date 西暦100年1月1日〜西暦9999年12月31日8バイト
オブジェクト型Object . 4バイト
文字列型String0〜65,535バイト1or2バイト
バリアント型Variant数値
文字列
16バイト
+アルファ
ユーザー定義型Type. .

参考4−5:数字フォ−マットの文字変数化

     For i = 2 To cend
        shu = Cells(i, 1)
              If VarType(shu) <> 8 Then
                Cells(i, 1).Select
                Selection.NumberFormat = "@"
                shu = "00" & shu
              End If
                
                lshu = LenB(shu)
              If lshu <> 5 Then
                   Cells(i, 1) = Right(shu, 5)
              End If
      Next
・セルのフォマット形式を予め指定し入力した場合はその形式が入力される。

・しかし、数字型または標準型指定のセルへ数字を入力し、その後そのセル  を文字型に変更した場合表示は左詰めとなり、文字型になった様に見えるが  実際はVarType=5のままであり変わっていない。

・この様な場合同じのうに見えても検索してもそれを抽出することが出来ない。

・ 本例は文字形式以外を文字型に変えたケ−ス。


参考4−6:共通定数の使用方法

	Public Const filp As String = "11月PKG.XLS"
	Public Const filg As String = "11月架.XLS"
	Public Const filk As String = "11月欠品.XLS"

	Public Const filpa As String = "a:\進捗管理\11月PKG.XLS"
	Public Const filga As String = "a:\進捗管理\11月架.XLS"
	'
	Sub ファイル名()
	' 本マクロは、各プログラムで使用しているファイル名を
	' そのVBAをそのつど変更するのは面倒なので
	' ここに集めた。(月一回変更すること)
	End Sub						
・本例では定数のみを使用しているので、SUBにはメセ−ジ以外何も入れてない。

・このマクロ参照を設定する方法は、まずこのマクロをオープンにしてから、次に  対象のブックをオープンし、アクティブの状態で、[ツール(O)]→[参照設定(F)]  で、共通定数の入っているマクロにマ−クを付ける。

参考4−7:演算子の種類と優先順位
演算子の概要 演算子 内容 優先順位
 
算術演算子
 
 
 
 
 
数値のべき乗を求める  
高い


 
低い
 
引き算
掛け算
/ 割り算(浮動小数点)
\ 割り算(整数)(余りはカット)
Mod 割り算(余り)(整数部カット)
足し算
 
関係演算子
 
 
 
 
 
 
左辺と右辺は等しい  
高い
 


 
低い
 
<> 左辺と右辺は等しくない
右辺より左辺が小さい
右辺より左辺が大きい
<= 左辺より右辺が小さいか等しい
>= 右辺より左辺が大きいか等しい
Like 二つの文字の比較
Is 二つのオブジェクト変数の比較
文字連結演算子
 
2つの文字列の連結  
 
2つの文字列の連結
 
論理演算子
 
 
 
 
Not 式の論理可否を求める  
 
 
 
 
 
And 2つの式の論理積を求める
Or 2つの式の論理輪和を求める
Xor 2つの式の排他的論理和
Eqv 2つの式の論理等価演算
Imp 2つの式の論理包含演算

    参考4−8:セルに関数が入っている時の注意点

Sub 例s48()
    Cells(1, 2) = 3
    Cells(2, 2) = 5
    Cells(3, 2).Formula = "=SUM(B1:B2)"
    
    d1 = Cells(2, 2)
    d2 = Cells(2, 2).Formula
    d3 = Cells(3, 2)
    d4 = Cells(3, 2).Formula
End Sub
・上記の例で、変数d1とd2は同じ内容になる。しかし、変数d3は"8"が入っているのに  対し、d4は"=SUM(B1:B2)"が入っている。

・マクロの中で、セルの内容を取り込む時、"d3 = Cells(3, 2)"とした場合は、その  セルにワ−クシ−ト関数が入っていると、関数を実行した後その結果が変数に代入  されるので、マクロがエラ−(場合によっては暴走)することがあるので注意が必要。

・下記はセル内容を事前にチェックした例

   moz = Cells(r, c).Formula
   If Left(moz, 1) = "=" Then
        ms1 = "セルに関数がありHTMLへ変換出来ません" & Chr$(10) _
               & "  (セルの場所 行=" & r & " 列=" & c & ")"
        me2 = MsgBox(ms1, 16)
             Exit Sub 
        End If
追記:セルに数式があるかチュックするプロパティがあった。上記の
   最初の2行は下記1行に変更。

  If Cells(r, c).HasFormula Then 
追記の追記:上記はワ−クシ−ト関数をチェックした例であるが、その計算結果がエラ− になった場合も暴走した。(#N/A,#VALUE!,#REF!,#DIV/O! 等) 下記はセル内容にエラ−値があるか事前にチェックした例

If Application.IsError(Cells(r, c)) Then
     ms1 = "行=" & r & " 列=2" & c & "にエラ−値"
    me2 = MsgBox(ms1, 16)
        Exit Sub
 End If
ワ−クシ−ト関数の「IsError」はエラ−値の場合Trueを返すのでこれでチェックできる なお、本例のようにワ−クシ−ト関数を使用する場合は、関数の前に「Application」を 付ければマクロ内でワ−クシ−ト関数を使用出来る。(If関数は使用不可)
参考4−9:取得方法で変数デ−タは異なる(Value、Formula、Text)
下表は、下記マクロValue(dat1)、Formula(dat2)、Text(dat3)を実行した場合の 変数に入っているデ−タを表にしたものである。


Sub val()
  For i = 2 To 20
     dat1 = Cells(i, 2).Value
     MsgBox dat1
  Next
End Sub
Sub form()
  For i = 2 To 20
     dat2 = Cells(i, 2).Formula
     MsgBox dat2
  Next
End Sub
Sub txt()
  For i = 2 To 20
     dat3 = Cells(i, 2).Text
     MsgBox dat3
  Next
End Sub
セルに実際に表示されているデ−タの取得であれば、"###"になる欠点はあるが Textプロパティがよい。
参考4−10:配列変数の指定を(1)からスタート
ワ−クシートの行・列の番号スタートは1からであり、配列変数も "Option Base 1"で1からスタートにすると便利なケースがあります。

Option Base 1

Sub 例s410()
Dim w  As Integer
Dim week As Variant
  week = Array("日", "月", "火", "水", "木", "金", "土")
    hia = InputBox("「年/月/日」を入力して下さい")
    If IsDate(hia) Then
        hi = CDate(hia)
        hi = Format(hi, "yyyy""年""mm""月""dd""日""")
    Else
        MsgBox "「年/月/日」を入力して下さい"
        Exit Sub
    End If
        w = Weekday(hi)
    MsgBox hi & " は " & week(w) & "曜日です"
End Sub
上記例は、曜日取得は数字1〜7でありweek(1)からにしたケース。

参考4−11:配列変数の初期化
同じ配列変数をマクロ内の各所で使用する場合必要に応じ初期化して から新たなデータを代入する。

'Forステートメントによる初期化(小さな配列ではよく使用する)
Sub s411a()
For i = 0 To 5
   For j = 0 To 100
     da(i, j) = ""
   Next
Next
MsgBox "データチェック(" & da(1, 1) & ")"
End Sub

'動的配列を新たに宣言し初期化(要素数も変更できます)
Sub s411b()
ReDim da(5, 100) As String
MsgBox "データチェック(" & da(1, 1) & ")"
End Sub

'Eraseステートメントによる初期化(配列の初期化では一番便利)
Sub s411c()
Erase da
MsgBox "データチェック(" & da(1, 1) & ")"
End Sub

4ー3変数を他のブックへの引渡
下記例では、Book1の変数dddの値がBook3のセルB2へ入力される。

'Book1に記述のマクロ
Sub Macro1()
    ddd = "abcd"
    Call Application.Run("Book3.xls!Macro2", ddd)
End Sub

'Book3に記述のマクロ
Sub Macro2(ddd)
    Windows("Book3.xls").Activate
    Sheets("Sheet1").Select
    Cells(2, 2) = ddd
End Sub

目次へ戻る