ExcelVBAの基礎知識

同じモジュール内の別々のマクロから同じ変数を使う

複数のマクロで同じ変数を使う場合や、1度マクロが終わっても
値を保持したい場合は「宣言セクション」という場所で
変数を宣言します。

宣言セクションとは、各モジュールの1番目のマクロの前、
右上のコンボボックスで「(Declarations)」となっている場所です。

変数06


宣言セクションで宣言した変数は、同じモジュールのマクロすべてから呼び出せます。

サンプルコード



Dim test As Long

Sub 変数のテスト1()

test = 1
test = test + 10

MsgBox test

End Sub


Sub 変数のテスト2()

MsgBox test

End Sub


1回目実行すると変数は0から始まります。
変数07


2回目以降も前回の値が保持されています。
変数08


別のプロシージャでも値は保持されています。
変数09


サンプル「変数のテスト1」では、
まず「test = 1」と変数testの値を初期化しています。

宣言セクションで宣言する時は、値の初期化をする事が大事です。

初期化をせずに「test + 10」だけにすると、
マクロを終了しても値がそのまま残るので、
最終的には変数で扱える範囲を超えてオーバーフローを起こしてしまいます。

宣言セクションで宣言した変数は、ブックを閉じるまで保持されます。

ブックを閉じても値を保持したい場合は、適当なセルに変数の値を書き込みます。

ExcelVBAの基礎知識

変数の有効範囲

変数は、宣言する場所と宣言方法によって、
値を保てる範囲が変わってきます。

マクロ内でDimステートメントで宣言した変数は、
そのマクロが終わるまで値が保たれ、
マクロが終了すると値が初期値に戻ります。

また、この方法ですと、宣言したマクロでのみ
変数を使う事ができます。

サンプルコード



Sub 変数のテスト1()

Dim test As Long

test = 1
test = test + 10

MsgBox test

End Sub


Long型の初期値は0なので、プロシージャ開始時は0からはじまります。
変数03

マクロ実行中は変数の値が保たれます。
変数04


マクロが終了するとまた初期値に戻ります。
変数05

ExcelVBAの基礎知識

変数を使うときの注意点

変数を使うときの注意点は、変数の値を取り出したい時は
""で囲まない、ということです。

変数を""で囲んでしまうと、それは変数ではなく
文字列になってしまいます。

サンプルコード1



Sub 変数のテスト1()

Dim test As Long

test = 1
MsgBox test

End Sub


◆サンプル1の実行結果
変数01

サンプルコード2



Sub 変数のテスト2()

Dim test As Long

test = 1
MsgBox "test"

End Sub


◆サンプル2の実行結果
変数02


文字列と変数をつないで表示するような場合、
変数まで囲ってしまう事が多いので注意が必要です。

文字列と変数をつなぐ時は、文字列は""で囲み、
変数は囲まないで&でつなぎます。

サンプルコード3



Sub 変数のテスト3()

Dim test As Long

test = 1
MsgBox "TEST" & test

End Sub

ExcelVBAの基礎知識

変数のデータ型

変数のデータ型には以下のようなものがあります。

・文字列型
・数値型
・日付・時刻型
・ブール型(True/Falseの論理値)
・その他(オブジェクト型など)

数値型はさらに、整数だけを入れられるものと
小数も入れられるものがあります。

まとめると以下のような感じです。

データの種類データ型初期値
文字列StringvbNullString(初期化されていない文字列)
整数Byte0
Integer0
Long0
Currency0
小数Single0
Double0
日付・時刻Date#0:00:00#
論理値BooleanFalse
オブジェクト型ObjectNothing


データ型によって、入れられる値の範囲が決まっています。
たとえば、Integer型の値の範囲は「-32768〜32767」です。

Integer型の変数に、範囲を超えた32768以上の数を入れようとすると、
以下のようなエラーが表示されます。


「オーバーフロー」ときたら、変数の値の範囲を見直してみましょう。
オーバーフローエラー

サンプルコード


ステップインで1行ずつ実行するとわかりやすいです。

Sub データ型の値の範囲()

Dim test As Integer

test = 32767 '範囲内(エラーは出ない)
test = 32768 '範囲外(エラーが発生)

End Sub


数値型はたくさん種類があって迷いますが、
整数ならLong型、小数ならSingle型を使っておけば
たいていは処理できると思います。

それでやってみてオーバーフローを起こしたら
より大きい範囲が扱えるデータ型で宣言しなおす、という
ある種行き当たりばったりでも大丈夫だと思います。

気をつけないといけないのは、整数型の変数に小数を入れた場合です。
この場合は、自動的に小数が整数に変換されます。

端数が0.5より小さければ切り捨て、0.5より大きければ切り上げ、
端数が0.5なら切り上げの結果と切り捨ての結果が偶数になる方に変換されます。

ExcelVBAの基礎知識

変数を宣言する

変数は、まず始めに「こういう変数を使う」という事を宣言しなければいけません。
変数の宣言は基本的にDimステートメントで行います。

◆Dimステートメント
Dim 変数名 As データ型

変数名は最初に数字が使えないなど、規則があります。
基本的にはアルファベットでつければいいと思います。

最後のデータ型ですが、変数には数値や文字列など、
いろいろな値を入れることができます。

こういった中身のデータの種類のことを「データ型」といいます。

そのままでもデータ型をある程度自動で判別して処理してくれるのですが、
誤判定される可能性や処理速度の効率化を考えたら、最初に自分で指定しまう方がよいです。

ExcelVBAの基礎知識

変数とは

変数とは、値を入れておく箱のようなものです。
まずは変数でどんなことができるかを見てみましょう。

次のサンプルは、変数testに値を入れておき、
test番目のシートの名前を変更します。

サンプルコード1



Sub 変数を使う1()

Dim test As Long

test = 2
ThisWorkbook.Worksheets(test).Name = "TEST" & test

End Sub


test = 1にすれば、1番目のシートが「TEST1」、
test = 2にすれば2番目のシートの名前が「TEST2」になります。

また、変数はマクロの中でいつでも値が変更可能ですし、
数値が入っている変数は、数値と同様に計算も可能です。

サンプルコード2



Sub 変数を使う2()

Dim test As Long

test = 1
ThisWorkbook.Worksheets(test).Name = "TEST" & test

test = test + 1
ThisWorkbook.Worksheets(test).Name = "TEST" & test

End Sub


最初に変数testに1を入れておき、その後でtestに1を加算した数を入れています。
1番目のシート名を「TEST1」、2番目のシートを「TEST2」にしています。

変数は、Dimステートメントで宣言した後、値を=で格納して使います。



ExcelVBAの基礎知識

セルの指定方法2〜複数セル

単数セルに続き、複数セルの操作方法です。
これもいくつか書き方があります。

◆1.連続する複数セルを操作する場合
Rangeオブジェクトでセル範囲を指定するか、
Rangeオブジェクト内にCellsプロパティを入れ子にして指定します。

Range(開始セル番地:終了セル番地)
Range(Cells(開始行番号,開始列番号),Cells(終了行番号,終了列番号))
Range(Cells(開始行番号,開始列名),Cells(終了行番号,終了列名))

サンプルコード1



Sub 連続する複数セルを操作する()

With ThisWorkbook.Worksheets(1)
  .Range("A1:A3").Value = "Test2"
  .Range(.Cells(1, 2), .Cells(3, 2)).Value = "Test2"
  .Range(.Cells(1, "C"), .Cells(3, "E")).Value = "Test2"
End With

End Sub

Withステートメントは同じオブジェクトに対する動作をまとめる
ステートメントです。
詳しくは「同じオブジェクトに対する操作をまとめる」を参照。

◆2.連続しない複数セルを操作する場合
Rangeオブジェクトで指定するか、Unionメソッドを使います。

Range(セル1,セル2,セル3)
Union(セル1,セル2,セル3...)

サンプルコード2



Sub 連続しない複数セルを操作する()

With ThisWorkbook.Worksheets(1)
  .Range("A1,C4,D3").Value = "Test3"
  Application.Union(.Range("A4"), .Range("B7"), .Range("D10")).Value = "Test3"
End With

End Sub


ここではセル番地を直接記述する方法を例に出しましたが、
上から順番に処理するなど、マクロの途中で操作するセルを変えることもできます。

それには変数というものを使います。


ExcelVBAの基礎知識

セルの指定方法1〜単数セル

セルの指定方法は何パターンかあるので、ケースごとに説明します。
どれも何通りか書き方がありますが、どれでも好きなものを使ってOKです。


◆1.Cellsプロパティを使う方法
行番号、列番号(もしくは列名)の順に指定します。指定する順番に注意!

Cells(行番号,列番号)
Cells(行番号,列名)

列番号はA列=1、 B列=2、C列=3・・・・・・と順番についています。
列名で指定する場合は、文字列で指定します。

サンプルコード1



Sub 単数セルを操作する1()

ThisWorkbook.Worksheets(1).Cells(1, 1).Value = "Test" 'A1セルに記入
ThisWorkbook.Worksheets(1).Cells(1, "B").Value = "Test" 'B1セルに記入

End Sub


◆2.Rangeオブジェクトを使う方法
セル番地を文字列として指定します。
一般機能でセルを指定するときと同じような書き方です。

Range(セル番地)

サンプルコード2



Sub 単数セルを操作する2()

ThisWorkbook.Worksheets(1).Range("C1").Value = "Test" 'C1セルに記入

End Sub

ExcelVBAの基礎知識

シートとブックの指定方法3〜その他の指定方法

ブックの少し特殊な指定の仕方として、ThisWorkbookプロパティというものもあります。
これは、実行中のマクロがあるブックを表します。

ThisWorkbook.Worksheets(1)

とすれば、実行中のマクロがあるシートの一番左側のシートを指定しています。

マクロを作った後にファイル名を変更した、という場合でも
ThisWorkbookで指定しておけばマクロの内容を変更しないで済むので、
大変便利です。

ExcelVBAの基礎知識

シートとブックの指定方法2〜親を指定する

Worksheets("Sheet1")

とすれば、「Sheet1」というシートを指定したことになります。

しかし、複数のブックを開いていて、それぞれに
Sheet1という名前のシートがあった場合は困り者です。

ブックを指定しないと、どのブックのシートに対して
処理を行うかがその時の状況によって変わってしまいます。
(参考:ブックやシートを指定しなかった時の動作

これは、シートだけではなく、セルの操作などにもいえます。


オブジェクト同士をピリオドでつなぐことで、
どのブックのどのシートかを指定することができます。

Workbooks("Book1.xls").Worksheets("Sheet1")

とすれば、「Book1.xls」のSheet1を指定したことになります。


また、こうしてブックから指定しておけば、いちいちシートを
アクティブにしなくても操作できます。

シートをアクティブにするというのは、マクロが重たくなる原因の
NO1なので、マクロの高速化にもつながります。

オブジェクトを操作するときは、必ずブックから指定しましょう。

<< 1 2 3 4 >>


Powered by Seesaa
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。