みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
初心者向けエクセルVBAで請求データから請求書を作成するシリーズをお送りしています。
前回の記事はこちら。
終了時の親切処理として、指定のシートのセルにカーソルを移動しておく方法をお伝えしました。
今回は、InputBoxメソッドを使って、任意の月でも処理ができるように改善を図っていきたいと思います。
エクセルVBAでInputBoxメソッドを使って入力ダイアログを使用する方法です。
なお、こちらの記事は以下のYouTube動画と連動していますので、合わせてご覧くださいませ。
では行ってみましょう!
前回までのおさらいと今回のお題
前回までで作成したプログラムはこちらです。
Sub 請求書作成()
'初期処理
wsTemplate.Rows("21:50").Hidden = False '隠れているかもしれない行を再表示
wsTemplate.Range("A21:C50").ClearContents
'メイン処理
Dim rowsData As Long '行数カウント用の変数
rowsData = wsData.Cells(Rows.Count, 1).End(xlUp).Row '最後の行数を取得
Dim i As Long, k As Long
k = 21
For i = 2 To rowsData
Dim deliDate As Date
deliDate = wsData.Cells(i, 1).Value
If Year(deliDate) = 2018 And Month(deliDate) = 1 Then
wsData.Range(wsData.Cells(i, 2), wsData.Cells(i, 4)).Copy wsTemplate.Cells(k, 1)
k = k + 1
End If
Next i
'終了処理
wsTemplate.Rows(k & ":50").Hidden = True 'データがない行を隠す
wsTemplate.Range("A18").Value = "ご請求金額:" & Format(wsTemplate.Range("D54").Value, "#,##0") & " 円"
wsTemplate.Select
wsTemplate.Range("A21").Select
End Sub
以下の「請求データ」シート(wsData)から
隣の「請求書ひな形」シート(wsTemplate)に2018年1月のデータのみを転記していくというプログラムです。
転記する対象のデータの年月を都度指定したい
ただし、このプログラムだと、月が替わったらVBEを開いて、If文の条件となっている年月を手打ちで書き換えないといけません。
16行目ですね。
これは面倒なので、マクロの実行時に入力ダイアログにより年月を入力できるように変更していきたいと思います。
InputBoxメソッドで入力ダイアログを表示する
エクセルVBAで入力ダイアログを表示するにはInputBoxメソッドを使います。
最もシンプルな使い方は以下のように書くものです。
ちなみに、Applicationというのは、Excelのアプリケーション自体を表すオブジェクトです。
例えば、イミディエイトウィンドウで、以下のように入力して Enter すると
? Application.InputBox("年月を入力してください")
以下のような入力ダイアログが表示されます。
これで、例えば「2018/1」などと入力してOKをクリックすると、イミディエイトウィンドウに以下のように出力されます。
ただ、この場合、ユーザーがうっかり年月じゃないデータを入力してしまうこともあるかもしれません。
そんな時に追加で指定できる引数が、InputBoxメソッドには用意されています。
引数とは
引数とは、関数やメソッドの実行時に渡すことができる値のことです。
関数やメソッドによって、引数の数やその指定する内容と役割、必須で指定する必要がある引数が異なります。
また、引数はその決められた順番通りに指定すれば、カンマ区切りで値を入力していけば良いですが、省略可能な引数を飛ばして次の引数を指定するときなどには、以下のようにコロンとイコールを使った形式で引数名とその値を指定するようにします。
InputBoxメソッドの引数
今回のInputBoxメソッドの引数は8つも用意されていて、まとめると以下のようなものがあります。
引数名 | 省略 | 説明 |
---|---|---|
Prompt | 不可 | 入力ダイアログに表示するメッセージ |
Title | 可 | 入力ダイアログのタイトルバーに表示するタイトル |
Default | 可 | テキストボックスに既定値として表示する文字列 |
Left | 可 | 入力ダイアログを表示する位置のX座標 |
Top | 可 | 入力ダイアログを表示する位置のY座標 |
HelpFile | 可 | 使用するヘルプファイルの名前 |
Context | 可 | ヘルプトピックに指定したコンテキスト番号 |
Type | 可 | 入力するデータの型を指定する(省略時は文字列型) |
ただ、全部はさすがに使いません。
先程紹介したPrompt(メッセージ)を含め、今回有効ないくつかを含めるとInputBoxメソッドの書式は以下の通りになります。
タイトルバーに表示するタイトル
タイトルは簡単ですね。
入力ダイアログに表示するタイトルを文字列で指定します。
今回の場合は、「年月を入力」なんだとすればOKですね。
デフォルト値
入力ダイアログのテキストボックスにデフォルト値を入力しておくと、ユーザーがどのように入力すればよいかわかりやすいので親切です。
今回は、日付データの年と月を入力してほしいわけですから
を指定します。
Date関数は本日の日付を返す関数ですが、その表示形式を「yyyy/mm」としているわけです。
これで、ほとんどのユーザーは「2018/02」などと入力してくれるようになることでしょう。
Format関数については、以下記事をご参考下さいね。
入力するデータ型
入力するデータ型は、InputBoxメソッドの強力な味方になります。
なぜなら、入力するデータ型を指定することができるからです。 つまり指定したデータ型以外のデータを入力しようとすると、弾かれて入力することができません。
値としては以下のようなデータ型に対応した数値を指定します。
値 | 説明 |
---|---|
0 | 数式 |
1 | 数値 |
2 | 文字列(デフォルト値) |
4 | ブール値 (TRUEまたはFALSE) |
8 | セル範囲 (Rangeオブジェクト) |
今回は、日付型なのですが一般的に文字列として入力したものをVBA側で日付型に変換してくれますので、「2」を指定します。
(ただ、Typeのデフォルト値は「文字列」なので、今回は省略しても大丈夫です。)
InputBoxメソッドを使った請求書作成
では、InputBoxメソッドを使って、冒頭のプロシージャを変更していましょう。
こちらです。
Sub 請求書作成()
'初期処理
wsTemplate.Rows("21:50").Hidden = False '隠れているかもしれない行を再表示
wsTemplate.Range("A21:C50").ClearContents
'メイン処理
Dim rowsData As Long '行数カウント用の変数
rowsData = wsData.Cells(Rows.Count, 1).End(xlUp).Row '最後の行数を取得
Dim dayCutoff As Date
dayCutoff = Application.InputBox("年月を入力してください", "対象年月を入力", Format(Date, "yyyy/mm"))
Dim i As Long, k As Long
k = 21
For i = 2 To rowsData
Dim deliDate As Date
deliDate = wsData.Cells(i, 1).Value
If Year(deliDate) = Year(dayCutoff) And Month(deliDate) = Month(dayCutoff) Then
wsData.Range(wsData.Cells(i, 2), wsData.Cells(i, 4)).Copy wsTemplate.Cells(k, 1)
k = k + 1
End If
Next i
'終了処理
wsTemplate.Rows(k & ":50").Hidden = True 'データがない行を隠す
wsTemplate.Range("A18").Value = "ご請求金額:" & Format(wsTemplate.Range("D54").Value, "#,##0") & " 円"
wsTemplate.Select
wsTemplate.Range("A21").Select
End Sub
12行目が今回のInputBoxメソッドを使用して、対象とする年月を入力ダイアログから取得する部分です。
それを用いて、天気をするかどうかの条件判定をする部分、19行目も変更しているので確認しておいてください。
InputBox関数との違いは?
実は、VBAにはInputBoxメソッドとは別にInputBox関数があります。
役割としては、InputBoxメソッドと同様、入力ダイアログを表示するというもので、最もシンプルな書き方は以下の通りです。
InputBoxメソッドとの違いは、8番目の引数TypeがInputBox関数にはないという点です。
より、便利な使い方ができるInputBoxメソッドのほうを覚えておけばOKです。
(本来、Applicationオブジェクトはトップレベルのオブジェクトなので省略可能なのですが、 InputBoxメソッドでは記述しなければいけない理由がここにあるということですね。)
まとめ
以上、エクセルVBAで入力ダイアログを表示するInputBoxメソッドの使い方についてお伝えしました。
また今回は、関数やメソッドの引数についても解説しましたので、確認をしておいてください。
次回は、入力ダイアログで入力した日付から、請求日と支払い期限を求める方法についてお伝えします。
どうぞお楽しみに!
連載目次:データ一覧から請求書を自動で作る
お仕事において特定のデータ一覧から必要な情報を抽出するということは頻繁にありうると思います。ここではデータ一覧から請求書を作るということを目標に、実務で使えるスキルをまっすぐに身に着けることを目的としています。- 【初心者向けエクセルVBA】データ一覧から請求書を自動で作る
- 【初心者向けエクセルVBA】ワークシートをオブジェクト名で取り扱う方法
- 【初心者向けエクセルVBA】For~Next文で簡潔にプログラムを書く
- 【初心者向けエクセルVBA】行の数をカウントする&不要な行を隠す
- 【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
- 【初心者向けエクセルVBA】セル範囲を一気にまとめてコピーする方法
- 【初心者向けエクセルVBA】ワークシートのデータのある範囲だけをピッタリ取得する方法
- 【初心者向けエクセルVBA】セル範囲の平行移動をする方法・リサイズをする方法
- 【初心者向けエクセルVBA】日付データから年・月・日を取り出す
- 【初心者向けエクセルVBA】If~Thenを使った条件分岐の超入門
- 【初心者向けエクセルVBA】For~Next文でセル範囲を一行ずつ移動させる
- 【初心者向けエクセルVBA】セル範囲のクリア~ClearContentsメソッドとClearメソッド
- 【初心者向けエクセルVBA】ワークシート・セルを選択する方法の色々について
- 【初心者向けエクセルVBA】入力ダイアログを表示するInputBoxメソッドの使い方
- 【初心者向けエクセルVBA】日付データから月末日と翌月末日を自動算出する
- 【初心者向けエクセルVBA】ワークシートをコピーする方法とそのシート名を変更する方法
- 【初心者向けエクセルVBA】オブジェクトを変数にセットして取り扱う方法
- 【初心者向けエクセルVBA】Openメソッドで新たなブックを開く方法
- 【初心者向けエクセルVBA】現在マクロを書いているブックのフォルダパスを取得する
- 【初心者向けエクセルVBA】開いたブックとそのワークシートをオブジェクト変数にセットする
- 【初心者向けエクセルVBA】ワークブックを別名で保存して閉じる方法
- 【初心者向けエクセルVBA】取引先別に請求書を作成するマクロを作る
コメント
勉強させて頂いています。
一つ疑問があります。
請求データ上では、
“軽自動車”は、”ホームシアター”と同日扱いしているのでは?
こんな場合は、入力フォーム側で「納品日の空欄は禁止」
とするのがベストなんでしょうね?
たにやん のぶりんさん
コメントありがとうございます。
そうですね、おっしゃる通りの運用をしている組織はあるかなと思いますし、マクロのほうでそれに対処するように処理させることも可能です。
ただ、一般的には空欄があると処理が複雑になりがちなので、運用で吸収すべきか、マクロで吸収すべきかは、ご状況に合わせて都度判断をしていくことになると思います。