ApplicationオブジェクトのStatusBarプロパティ
Application.StatusBar = 文字列
画面の一番下にあるステータスバーには、任意の文字列を表示できます。表示する文字列は、ApplicationオブジェクトのStatusBarプロパティに設定します。
右のサンプルコードでは、変数iが1から1000まで変化する様子を、ステータスバーに表示します。このように処理の経過がわかるようにすると、処理の途中でも「フリーズしているのでは?」と心配になることがないでしょう。
なお、ステータスバーの表示をExcelの標準に戻すには、StatusBarプロパティにFalseを指定します。
処理の経過をステータスバーに表示する
Sub Sample()
Dim i As Long
For i = 1 To 1000
Application.StatusBar = i & “回目の処理を実施中です”
Next i
Application.StatusBar = False
End Sub
実行結果


FileDialogオブジェクト
Application.FileDialog(定数)
マクロの実行中、ユーザーにフォルダーを選択させるには、“フォルダーの選択”ダイアログボックスを使うと便利です。方法はいくつかありますが、FileDialogオブジェクトを使う方法が簡単です。引数には、表の定数を指定できます。 次のサンプルコードは、フォルダーを選択する「参照」ダイアログボックスをShowメソッドで表示します。フォルダーを選択してOKを押すとTrueとなるので、選択結果(パス)をメッセージボックスに表示します。
FileDialogオブジェクトの主な定数
ファイルの選択 |
msoFileDialogFilePicker |
フォルダーの選択 |
msoFileDialogFolderPicker |
ファイルを開く |
msoFileDialogOpen |
名前を付けて保存 |
msoFileDialogSaveAs |
「参照」ダイアログでフォルダーを選択する
Sub Sample()
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
MsgBox .SelectedItems(1)
End If
End With
End Sub
実行結果


ApplicationオブジェクトのOnKeyメソッド
Application.OnKey キー, プロシージャ名
ApplicationオブジェクトのOnKeyメソッドを実行すると、マクロ(プロシージャ)にショートカットキーを設定できます。キーの指定は、{ }でキーの名前を囲みます。uキーなら「{u}」、F2キーなら「{F2}」と書きます。ShiftやCtrl、Altと組み合わせる場合は、それぞれ「+」「^」「%」を手前に記述します。なお、「{U}」と大文字で書くと、Shift+uキーの意味になるので注意してください。Excelが標準で備えるショートカットキーと同じキーを指定した場合は、Excelの標準キーよりも優先されます。
設定したショートカットキーを解除するには、引数にプロシージャ名を書かずに、キーのみを記述して実行します。
’Sample1:Sample1の実行後、Ctrl+Alt+uでSample2を実行可能になる
Sub Sample1()
Application.OnKey “^%{u}”, “Sample2”
End Sub
Sub Sample2()
MsgBox “Ctrl+Alt+uキーが押されました。”
End Sub
Sample1を実行した後、Ctrl+Alt+uキーを押した結果


’Sample3:Sample1のキー設定を解除する
Sub Sample3()
Application.OnKey “^%{u}”
End Sub

Constステートメント
Const 定数名 = 値
Const 定数名 As データ型 = 値
定数を宣言するときは、Constステートメントを使います。変数を宣言するDimステートメントと同様、「Const」に続けて定数名を書き、その後ろに「As」とデータ型を指定します。Dimと異なるのは、さらに続けて、その定数が指し示す値を記述できる点です。なお、データ型の指定は省略可能です。 定数は、プロシージャ内で変更することができません。同じ値を固定的に利用したいときに使います。プロシージャ内だけで使用するローカル定数だけでなく、宣言セクションに記述することで、グローバル定数を宣言することも可能です。
定数Bと定数Tを定義して利用する
Sub Sample()
Const B As Long = 7
Const T As String = “Jam&Momo”
Dim i As Long
For i = 1 To B
Cells(i, 1) = T
Next i
End Sub
実行結果


Setステートメント
Set 変数名 = オブジェクト
オブジェクト型変数を使うと、任意のオブジェクトを別の名前で操作できます。オブジェクト型変数にオブジェクトを格納するときは、Setステートメントを使います。値を変数に入れるときのように、単に「変数名 = 値」と書くだけではダメで、「Set 変数名 = オブジェクト」のような書き方をします。
「As Worksheet」(シート)や「As Range」(セル)のようにタイプを明示する“固有オブジェクト型”のほか、「As Object」と書いてすべてのオブジェクトを表す“総称オブジェクト型”があります。
オブジェクト型変数を利用して、シートの追加や罫線の設定を行う
Sub Sample()
Dim WS As Worksheet, R As Object
Set WS = Worksheets.Add
Set R = WS.Range(“B2:E5″)
R.Borders.LineStyle = True
End Sub
実行結果


配列をコピーするには?
バリアント型変数 = 配列
配列は、複数の値を格納できる“変数の一種”です。変数が一戸建て住宅だとすれば、配列は集合住宅のようなものでしょう。VBAでは、配列名の後ろにカッコを付けて、配列内の要素の番号を書きます。番号は0から始まる点に注意してください。
この配列を別の配列にコピーするときは、配列に格納するのではなく、バリアント型変数に格納します。VBAでは、配列に配列を入れることができません。配列は受け取り側になれない仕様だからです。配列を格納したバリアント型変数は、それ以降、配列として操作できます。次のサンプルコードでは、配列Fをバリアント型変数Sに代入しています。
配列をバリアント型変数にコピーすると、以降は配列として扱える
Sub Sample()
Dim F(2) As String, T As Variant
F(0) = “いちご”
F(1) = “メロン”
F(2) = “ブルーベリー”
S = F
MsgBox S(1)
End Sub
実行結果


ApplicationオブジェクトのScreenUpdatingプロパティ
Application.ScreenUpdating
マクロを実行すると、何らかの操作をするたびに画面が更新され、その更新処理により処理速度が遅くなることがあります。そこで、マクロによる画面の更新を抑止すると、マクロ
の実行が速くなる場合があります。画面の更新を止めるには、ApplicationオブジェクトのScreenUpdatingプロパティにFalseを指定します。
ScreenUpdatingプロパティは、プロシージャが終了すると自動的にTrueになりますが、可読性を高めるためにも、明示的にTrueに戻しておくといいでしょう。
画面を更新せずに処理を実行
Sub Sample()
Dim i As Long
Application.ScreenUpdating = False
For i = 1 To 10000
Cells(i, 1).Select
Next i
Application.ScreenUpdating = True
End Sub
実行結果。1セルずつ選択しながら移動する様子は表示されない。名前ボックスでA10000セルが選択されたことがわかる


Functionプロシージャ
Function 関数名(引数 As データ型) As データ型
標準モジュールに記述したFunctionプロシージャは、ワークシートのセル内でワークシート関数のように使用できます。これを、ユーザー定義関数と呼びます。
「Function」に続けてプロシージャ名(関数名)を書き、後ろのカッコ内に必要な引数名とそのデータ型を書きます。さらに続けて、「As」と戻り値のデータ型を記述します。必要な処理を書いた後、「プロシージャ名 = 戻り値」のように記述して、「EndFunction」で閉じます。 作成したユーザー定義関数は、通常のワークシート関数と同様に、「=プロシージャ名(引数)」という形の数式をセルに入力することで利用できます。ただし、ブックを開くときは、もちろんマクロを有効にしなければなりません。
次のサンプルは、指定したセル範囲の文字列を1つに結合するユーザー定義関数です。
‘指定したセル範囲内の文字列をすべて結合する
Function JamMomo(Target As Range) As String
Dim c As Range, buf As String
For Each c In Target
buf = buf & c.Value
Next c
JamMomo = buf
End Function
実行結果

Callステートメント
Call プロシージャ名
プロシージャとは、Sub~End SubやFunction~EndFunctionなどと表される、マクロの最小実行単位のことです。あるプロシージャの中で、別のプロシージャを呼び出すには、Callステートメントを使います。
Callステートメントを使わずに、単にプロシージャ名を記述するだけでも呼び出せますが、可読性を高めるためにも、Callステートメントを使った方がいいでしょう。
Sample1のプロシージャからSample2のプロシージャを呼び出す
Sub Sample1()
Range(“B2”).Value = “JAM”
Call Sample2
End Sub
Sub Sample2()
MsgBox “MOMO”
End Sub
実行結果


Exitステートメント
Exit Sub
実行中のマクロ(プロシージャ)を強制終了するには、「Exi tSub」と記述します。これは、Exitステートメントにキーワード「Sub」を付けたものです。Exitステートメントは、あるブロックから外に出ろという命令です。Subプロシージャを抜けるほか、For Nextの繰り返しを終了する「Exit For」や、Do Loopの繰り返しを終了する「Exit Do」という書き方もできます。
なお、繰り返し処理を抜け出す条件を記述し忘れたり、条件が常に成り立たない状態に陥ったりして、処理が永遠に終了しなくなる場合があります。このような“無限ループ”に陥った場合は、Ctrlキーを押しながらBreakキーを押すというキー操作で、マクロを一時停止することができます。表示されたダイアログで「終了」をクリックすれば、マクロを終了できます。
アクティブセルが空欄なら何も実行せずに終了する
Sub Sample()
If ActiveCell.Value = “” Then Exit Sub
MsgBox ActiveCell.Value
End Sub
実行結果。空欄の場合。


実行結果。空欄ではない場合。

