14 . ユーザーからの入力を受け付ける  

マクロ実行中に、ユーザーにファイルを選んでもらったり、ファイル名を付けて保存してもらう場合があります。
また、ちょっとした入力を受け付けたい時に使用すると便利なメソッドや関数が用意されています。
 

@ ファイルを開くダイアログボックスを使う  
Excelが持っている「ファイルを開く」ダイアログボックスを使用きるようにするメソッドです。

GetOpenFilenameメソッドは、実行すると「ファイルを開く」ダイアログボックスが表示され、ユーザーによってファイルが選択されると、そのファイル名をドライブ名を含むフルパスで返してきます。
ダイアログボックスのキャンセルボタンが押された場合は、メソッドはFalseを返してきます。
メソッドの実行に際しては、いくつかの引数を操作することで、ダイアログボックスに表示するファイルの種類やウィンドウのタイトルを設定することが出来ます。
引数「FileFilter」は、ダイアログボックスに表示するファイルの種類を、特定の種類のファイルだけにすることが出来ます。
たとえば、Excelの「ファイルを開く」ダイアログボックスは、拡張子がxlsやxlaのファイルだけを表示するようになっていますが、これと同じ効果を引数「FileFilter」を使うことで実現できます。
ただし、やや複雑な記述方法になっていますので、わかりやすく整理して説明します。

1) 1つのファイルフィルタ文字列をセットする場合
1種類のファイルフィルタを使って、特定の拡張子のファイルだけを表示したい場合は、次のように記述します。
まず、ファイルフィルタ全体を""で囲み、その中に最初にダイアログボックスに表示する文字列を記述します。
次に、「,」で区切って実際にフィルタにかけるファイルの拡張子を記述します。

Ret = Application.GetOpenFilename ("Excel ブック (*.xls), *.xls")
                                                      ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^
                                                               |                    |
                                                               |                  表示する拡張子を指定
                                                               |
                                                        ダイアログボックスのリストに表示される文字列

これで、「ファイルを開く」ダイアログボックスには、画面のようなファイルフィルタが設定されます。

拡張子が「.xls」のファイルだけが表示される

2) 1つのファイルフィルタ文字列に複数の拡張子を同時に指定する
1つのファイルフィルタ文字列に、複数の拡張子を同時に指定するには、表示する文字列を記述したあとに、実際にフィルタにかけるファイルの拡張子をセミコロン (;) で区切って連記します。
次の記述は、ダイアログボックスに表示するファイルの種類を、Excel
のブック「.xls」とテキストファイル「.txt」の2種類に設定しています。しかし、ダイアログボックスの「ファイルの種類」リストには、1つしか表示されません。

Ret = Application.GetOpenFilename ("Excelブックとテキストファイル (*.xls;*.txt), *.xls;*.txt ")


3) 2種類のファイルフィルタをリストに表示させる
2種類のファイルフィルタをリストに表示させるには、引数の""の中に、ファイルフィルタ文字列を「,」で区切って1つづつ記述します。
並べた順番にリストの先頭から表示され、リストを選んだ時点でその拡張子のファイルがフィルタにかけられて表示されます。
ここでは説明の為に2種類のフィルタを設定していますが、このファイルフィルタのリストには、いくつでもフィルタを設定することが出来ます。

Ret = Application.GetOpenFilename ("Excel ブック (*.xls), *.xls, テキストファイル(*.txt),*.txt")
                                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                                                |                                     |
                                          最初のリストに表示される文字列       2番目のリストに表示される文字列


リストに2種類のファイルフィルタが表示される


このように、メソッドの引数「FileFilter」を使用して、ダイアログボックスに表示するファイルの種類に制限を設けて使用できます(メソッドの引数は他にもいくつか用意されています。これらは、別表を参照してください)。
 


<GetOpenFilenameの引数>
GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

*FileFilter
省略可能。開くファイルの種類を指定する文字列とファイルの拡張子 (ファイルフィルタ文字列) を指定。
この文字列は必要な数だけ指定でき、ワイルドカードも使用できる。ファイルフィルタ文字列とワイルドカードはカンマ (,) で区切り、各ペアもカンマで区切って指定する。れらの文字列は[ファイルの種類] ボックスにリスト表示される。
この引数を省略すると "すべてのファイル (*.*),*.*" を指定したことになる。

*FilterIndex
省略可能。引数 FileFilter で指定したファイルフィルタ文字列のリストの中で、何番目を既定値にするかを指定。この引数を省略するか、引数 FileFilter に含まれるファイルフィルタ文字列の数より大きい数値を指定すると、リストの先頭のファイルフィルタ文字列が既定値となる。

*Title
省略可能。ダイアログ ボックスのタイトルを指定。この引数を省略すると "ファイルを開く" になる。

*ButtonText
省略可能。Macintosh のみ指定可。

*MultiSelect
省略可能。Trueを指定すると、複数のファイルを選択できる。Falseを指定すると、1 つのファイルしか選択できない。既定値は False。


【ワンポイント・アドバイス】
ワイルドカードとは、トランプで言う「ジョーカー」みたいなもので、どのような文字にもマッチさせることができる記号のことを言います。
Windowsでは、「*」記号がすべての文字に一致する記号として使われています。
たとえば、「*.xls」と記述すると、拡張子がxlsのファイル名すべてを該当させることが出来ます。
また、「99*.*」と記述すると、ファイル名が「99」で始まる、すべての拡張子のファイルを該当させることが出来ます。



 
書式
戻り値 = Application.expression.GetOpenFilename(引数)

【属性】                        メソッド
【所属オブジェクト】         Application
【操作対象オブジェクト】   Application

<記述例>
Application.GetOpenFilename ("Excel ブック (*.xls), *.xls")
 

使用例
次の例は、GetOpenFilenameメソッドを使用して、「ファイルを開く」ダイアログボックスを表示します。ダイアログボックスには、Excelのブックとテキストファイルを表示するファイルフィルタを設定しています。ユーザーによってファイル名が選択されると、メッセージボックスを使用してそのファイル名のフルパスを表示します。キャンセルボタンが押されると、その旨をメッセージボックスで表示します。

<使用例 取得したファイル名を表示する>
Sub 取得したファイル名を表示する()
    Dim Ret As Variant

    Ret = Application.GetOpenFilename ("Excel ブック (*.xls), *.xls, テキストファイル(*.txt),*.txt")

    If Ret = False Then
        MsgBox "キャンセルが選択されました。"
    Else
        MsgBox Ret & "が選択されました。"
    End If
End Sub

 

A ファイルを保存するダイアログボックスを使う  
GetOpenFilenameメソッドとは逆で、Excelで使用される「名前を付けて保存」ダイアログボックスを表示するメソッドです。


「名前を付けて保存」ダイアログボックス

ユーザーによってファイル名の入力があると、メソッドの戻り値としてそのファイル名をドライブ名も含むフルパスで返してきます。また、ダイアログボックスのキャンセルボタンが押されると、Falseを返してきます。
GetOpenFilenameメソッドと引数に違いがあるので注意してください。
GetSaveAsFilenameメソッドでは、最初に引数「InitialFilename」が追加されています。これは、ダイアログボックスが表示された時点で、あらかじめ「ファイル名」の欄に表示しておくファイル名を設定します。引数「FileFilter」は、GetOpenFilenameメソッドとまったく同じ使い方をします。あらかじめダイアログボックスに表示するファイルの種類を指定したい場合に使用します。
次の例は、「名前を付けて保存」ダイアログボックスを表示し、入力されたファイル名をメッセージボックスで表示します。
ダイアログボックスにはあらかじめ「MyBook.xls」というファイル名を設定しておき、「ファイルの種類」リストボックスには2種類のファイルフィルタを指定しています。
入力されたファイル名は、拡張子を付けなくても、自動的に設定してファイルフィルタの拡張子が付加されて、メソッドの戻り値として返されてきます。
 
<GetSaveAsFilenameの引数>
GetSaveAsFilename(InitialFilename, FileFilter, FilterIndex, Title, ButtonText)

*InitialFilename
省略可能。ダイアログボックスに既定値として表示するファイル名を指定する。この引数を省略すると、作業中のブックの名前が使われる。

*FileFilter
省略可能。開くファイルの種類を指定する文字列とファイルの拡張子 (ファイルフィルタ文字列) を指定。
この文字列は必要な数だけ指定でき、ワイルドカードも使用できる。ファイルフィルタ文字列とワイルドカードはカンマ (,) で区切り、各ペアもカンマで区切って指定する。れらの文字列は[ファイルの種類] ボックスにリスト表示される。
この引数を省略すると "すべてのファイル (*.*),*.*" を指定したことになる。

*FilterIndex
省略可能。引数 FileFilter で指定したファイルフィルタ文字列のリストの中で、何番目を既定値にするかを指定。この引数を省略するか、引数 FileFilter に含まれるファイルフィルタ文字列の数より大きい数値を指定すると、リストの先頭のファイルフィルタ文字列が既定値となる。

*Title
省略可能。ダイアログ ボックスのタイトルを指定。この引数を省略すると "ファイルを開く" になる。

*ButtonText
省略可能。Macintosh のみ指定可。
 
書式
戻り値 = Application.GetSaveAsFilename(引数

【属性】                        プロパティ
【所属オブジェクト】         Application
【操作対象オブジェクト】   Application

<記述例>
Application.GetSaveAsFilename

 

使用例
<使用例 保存するファイル名を表示する>
Sub 保存するファイル名を表示する()
    Dim Ret As Variant

    Ret = Application.GetSaveAsFilename ("MyBook.xls", "Excel ブック (*.xls), *.xls, テキストファイル(*.txt),*.txt")

    If Ret = False Then
        MsgBox "キャンセルが選択されました。"
    Else
        MsgBox Ret & "が入力されました。"
    End If
End Sub

 

B 一行入力を受け付ける 書式 使用例
一行入力のフィールドを持った小さなダイアログボックス(インプットボックス)を表示する関数です。
インプットボックスには、必ずユーザーに入力を促す文字列を設定します。必要に応じて、インプットボックスのタイトルや表示位置を、引数を使用して設定出来ます。
ユーザーから入力があると、インプットボックスが閉じた時点で関数の戻り値として、入力されたデータを文字列で返してきます。
数値が入力されても、日付が入力されてもすべて文字列として返ってくる点に注意してください。
インプットボックスのキャンセルボタンが押されると、関数は""(空の文字列)を返してきます。
この関数は、マクロの途中でユーザーからちょっとした入力を受け付けたい場合に使用すると便利です。
次の例は、InputBox関数の戻り値をセルA1に転送します。

<InputBox関数の引数>
InputBox(prompt, title, default, xpos, ypos, helpfile, context)

*prompt
必須。ダイアログボックス内にメッセージとして表示する文字列を指定。この引数に指定できる最大文字数は、半角換算で約1,024文字。複数行を表示したい場合は、Chr(13)・Chr(10)を改行する位置に挿入する。

*title
省略可能。ダイアログボックスのタイトルに表示する文字列を指定。この引数を省略すると、タイトルバーにはアプリケーション名が表示される。

*default
省略可能。あらかじめテキストボックスに既定値として表示する文字列を指定。

*xpos
省略可能。画面の左端からダイアログボックスの左端までの水平方向の距離を、twip 単位で設定する。引数 xpos を省略すると、ダイアログ ボックスは水平方向に対して画面の中央の位置に配置される。

*ypos
省略可能。画面の上端からダイアログボックスの上端までの垂直方向の距離を、twip 単位で設定する。引数 ypos を省略すると、ダイアログ ボックスは垂直方向に対して画面の上端から約 1/3 の位置に配置される。

*helpfile
省略可能。ダイアログボックスに状況依存のヘルプを設定するために、使用するヘルプファイルの名前を指定。この引数を指定した場合は、引数 context も指定する必要がある。

*context
省略可能。ヘルプトピックに指定したコンテキスト番号を指定。
 

 

戻り値 = InputBox(引数)

【属性】                        関数
【所属オブジェクト】         Application
【操作対象オブジェクト】   なし

<記述例>
Range("A1") = InputBox("年齢を入力してください")

<使用例 ユーザー入力をセルに転送>
Range("A1") = InputBox("年齢を入力してください")

 

C ワークシート関数を使用する 書式
ワークシートで使用する関数郡を、VBAのコードから使用することが出来る、「WorksheetFunction」オブジェクトを取得するプロパティです。
このプロパティを使用してWorksheetFunctionオブジェクトへの参照を行い、続けてワークシート関数を記述すると、関数の戻り値をコードの式で使用できます。
「WorksheetFunction」オブジェクトを使用すると、ワークシートで使用できるExcelの関数を、VBAのコード内でも実行できます。そして、関数の実行結果も、コード内の式で使用することが出来ます。各ワークシート関数の書式は、基本的にはワークシート上で使用する場合と同じ書式ですが、セルおよびセル範囲を指定する場合は注意が必要です。
通常、ワークシート上でExcelの関数を使用する場合は、関数の引数にセル番地を直接記述しています。

=AVERAGE(A1:A10)

しかし、VBAのコードで関数の引数にセル番地を指定する場合は、Rangeオブジェクトとして指定する必要があります。

WorksheetFunction.Average(.Range("A1:A10"))

また、ワークシート関数の引数に直接数値や変数を指定して計算させることも出来ます。
このように、統計関数や財務関数をVBAのコード内で使用すれば、複雑な計算式を作成しなくても簡単な書式で計算が実行できます。

 
Application.WorksheetFunction.関数名

【属性】                        プロパティ
【所属オブジェクト】         Application
【操作対象オブジェクト】   Application

<記述例>
Result = Application.WorksheetFunction.Average(Range("A1:C10"))

 

使用例

次のプロシージャは、ワークシートSheet2のセルA1からA10に入力されている値の平均値を、ワークシート関数「Average」を使用して算出し、その結果をメッセージボックスで表示します。

<使用例 アベレージの算出>
Sub アベレージの算出()
    With Worksheets("Sheet2")
    Result = Application.WorksheetFunction.Average(.Range("A1:A10"))
MsgBox "平均値は" & Result
End With
End Sub

次の例は、合計計算を実行する統計関数の1つ、SUM関数をVBAのコード内で実行しています。引数に直接数値を指定した場合と、変数を指定した場合の2通りの方法で計算を行っています。

<使用例 SUM関数の引数に変数を指定して実行>
Sub 合計計算その2()
Dim NumA As Integer
Dim NumB As Integer

NumA = 100
NumB = 200 * 5
Result = Application.WorksheetFunction.Sum(NumA, NumB)
MsgBox "平均値は" & Result
End Sub

 

 

Dマクロの実行を一時停止させる 書式 使用例
指定した時刻までマクロの実行を停止させるメソッドです。
メソッドが実行された瞬間からマクロの実行を停止し、引数に指定した時刻がくるとマクロの実行を再開します。
引数に指定する時刻は、Excelの時刻の書式で指定します。

また、現在の時刻を取得する関数「Now」や、指定した時刻から時・分・秒を取り出す関数「Hour」「Minute」「Second」、逆に指定した時・分・秒から時刻を作成する関数「TimeSerial」を組み合わせて使用すると、一定の時間だけマクロを停止させることが可能になります。

 

Application.Wait 時刻

【属性】                        メソッド
【所属オブジェクト】         Application
【操作対象オブジェクト】   Application

<記述例>
Application.Wait "12:59:59"

次の例は、Waitメソッドが実行された時点から、引数に指定した時刻までマクロの実行を停止します。

<使用例 12:59:59までマクロを停止させる>
Application.Wait "12:59:59"

次の例は、プロシージャを実行した時刻から10秒間だけマクロを停止させます。

<使用例 指定した秒数だけマクロを停止させる>
Sub マクロを10秒間停止()
    newHour = Hour(Now())
    newMinute = Minute(Now())
    newSecond = Second(Now()) + 10
    waitTime = TimeSerial(newHour, newMinute, newSecond)
    Application.Wait waitTime
End Sub


このプロシージャは、まずNow関数で現在時刻を取得します。次に、この時刻を「Hour」「Minute」「Second」関数を使用して、それぞれ時・分・秒に分解し変数に格納します。
次に、秒を格納している変数に10を加え、10秒後の数値に変換し再度変数に代入します。
そして、「TimeSerial」関数の引数に、時・分・秒を格納している変数をセットし、時刻に変換します。これで、現在時刻から10秒後の時刻が作成されますので、この時刻をWaitメソッドの引数に指定すれば、現在時刻から約10秒間だけマクロの実行が停止することになります。
「約10秒間」というのは、実際にはプロシージャを処理する時間が加わった10秒間になるので、正確に10秒間マクロが停止するわけではありません。

 

著作・制作   瀬戸 遥   2004/05.