| 14 . ユーザーからの入力を受け付ける |
![]() |
マクロ実行中に、ユーザーにファイルを選んでもらったり、ファイル名を付けて保存してもらう場合があります。 |
| @ ファイルを開くダイアログボックスを使う | |
|
Excelが持っている「ファイルを開く」ダイアログボックスを使用きるようにするメソッドです。 GetOpenFilenameメソッドは、実行すると「ファイルを開く」ダイアログボックスが表示され、ユーザーによってファイルが選択されると、そのファイル名をドライブ名を含むフルパスで返してきます。 ダイアログボックスのキャンセルボタンが押された場合は、メソッドはFalseを返してきます。 メソッドの実行に際しては、いくつかの引数を操作することで、ダイアログボックスに表示するファイルの種類やウィンドウのタイトルを設定することが出来ます。 引数「FileFilter」は、ダイアログボックスに表示するファイルの種類を、特定の種類のファイルだけにすることが出来ます。 たとえば、Excelの「ファイルを開く」ダイアログボックスは、拡張子がxlsやxlaのファイルだけを表示するようになっていますが、これと同じ効果を引数「FileFilter」を使うことで実現できます。 ただし、やや複雑な記述方法になっていますので、わかりやすく整理して説明します。 1) 1つのファイルフィルタ文字列をセットする場合 1種類のファイルフィルタを使って、特定の拡張子のファイルだけを表示したい場合は、次のように記述します。 まず、ファイルフィルタ全体を""で囲み、その中に最初にダイアログボックスに表示する文字列を記述します。 次に、「,」で区切って実際にフィルタにかけるファイルの拡張子を記述します。 Ret = Application.GetOpenFilename ("Excel ブック (*.xls), *.xls") ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^ | | | 表示する拡張子を指定 | ダイアログボックスのリストに表示される文字列 これで、「ファイルを開く」ダイアログボックスには、画面のようなファイルフィルタが設定されます。 ![]()
拡張子が「.xls」のファイルだけが表示される |
<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(引数)
【属性】
メソッド
<記述例> |
| 使用例 |
|
次の例は、GetOpenFilenameメソッドを使用して、「ファイルを開く」ダイアログボックスを表示します。ダイアログボックスには、Excelのブックとテキストファイルを表示するファイルフィルタを設定しています。ユーザーによってファイル名が選択されると、メッセージボックスを使用してそのファイル名のフルパスを表示します。キャンセルボタンが押されると、その旨をメッセージボックスで表示します。
<使用例 取得したファイル名を表示する> |
| 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(引数
【属性】
プロパティ
<記述例>
|
|
| 使用例 | |
|
<使用例 保存するファイル名を表示する> 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(引数)
【属性】
関数
<記述例> |
<使用例 ユーザー入力をセルに転送> Range("A1") = InputBox("年齢を入力してください") |
![]() |
||
| C ワークシート関数を使用する | 書式 |
|
ワークシートで使用する関数郡を、VBAのコードから使用することが出来る、「WorksheetFunction」オブジェクトを取得するプロパティです。 このプロパティを使用してWorksheetFunctionオブジェクトへの参照を行い、続けてワークシート関数を記述すると、関数の戻り値をコードの式で使用できます。 「WorksheetFunction」オブジェクトを使用すると、ワークシートで使用できるExcelの関数を、VBAのコード内でも実行できます。そして、関数の実行結果も、コード内の式で使用することが出来ます。各ワークシート関数の書式は、基本的にはワークシート上で使用する場合と同じ書式ですが、セルおよびセル範囲を指定する場合は注意が必要です。 通常、ワークシート上でExcelの関数を使用する場合は、関数の引数にセル番地を直接記述しています。 =AVERAGE(A1:A10) しかし、VBAのコードで関数の引数にセル番地を指定する場合は、Rangeオブジェクトとして指定する必要があります。 WorksheetFunction.Average(.Range("A1:A10")) また、ワークシート関数の引数に直接数値や変数を指定して計算させることも出来ます。 このように、統計関数や財務関数をVBAのコード内で使用すれば、複雑な計算式を作成しなくても簡単な書式で計算が実行できます。 |
Application.WorksheetFunction.関数名
【属性】
プロパティ
<記述例>
|
| 使用例 | |
次のプロシージャは、ワークシートSheet2のセルA1からA10に入力されている値の平均値を、ワークシート関数「Average」を使用して算出し、その結果をメッセージボックスで表示します。 次の例は、合計計算を実行する統計関数の1つ、SUM関数をVBAのコード内で実行しています。引数に直接数値を指定した場合と、変数を指定した場合の2通りの方法で計算を行っています。
<使用例 SUM関数の引数に変数を指定して実行>
|
| Dマクロの実行を一時停止させる | 書式 | 使用例 |
|
指定した時刻までマクロの実行を停止させるメソッドです。 メソッドが実行された瞬間からマクロの実行を停止し、引数に指定した時刻がくるとマクロの実行を再開します。 引数に指定する時刻は、Excelの時刻の書式で指定します。 また、現在の時刻を取得する関数「Now」や、指定した時刻から時・分・秒を取り出す関数「Hour」「Minute」「Second」、逆に指定した時・分・秒から時刻を作成する関数「TimeSerial」を組み合わせて使用すると、一定の時間だけマクロを停止させることが可能になります。
|
Application.Wait 時刻
【属性】
メソッド
<記述例> |
次の例は、Waitメソッドが実行された時点から、引数に指定した時刻までマクロの実行を停止します。
次の例は、プロシージャを実行した時刻から10秒間だけマクロを停止させます。 |