9-15.その他のテクニック:ステータスバーに文字を表示するには?

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

 

実行結果

 

2022年9月21日

9-14.その他のテクニック:フォルダーの選択画面を開くには?

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

 

実行結果

2022年9月21日

9-13.その他のテクニック:ショートカットキーを設定するには?

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

2022年9月21日

9-12.その他のテクニック:定数を使うには?

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

 

実行結果

 

2022年9月21日

9-11.その他のテクニック:オブジェクト型変数を使うには?

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

 

実行結果

 

2022年9月21日

9-10.その他のテクニック:配列をコピーするには?

配列をコピーするには?

バリアント型変数 = 配列

配列は、複数の値を格納できる“変数の一種”です。変数が一戸建て住宅だとすれば、配列は集合住宅のようなものでしょう。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

 

実行結果

 

2022年9月21日

9-09.その他のテクニック:画面の更新を止めるには?

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セルが選択されたことがわかる

 

2022年9月21日

9-08.その他のテクニック:ユーザー定義関数を作るには?

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

 

実行結果

2022年9月21日

9-07.その他のテクニック:別のプロシージャを呼び出すには?

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

 

実行結果

 

2022年9月21日

9-06.その他のテクニック:マクロを強制終了するには?

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

 

実行結果。空欄の場合。

 

 

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

 

 

 

2022年9月21日