
photo credit: marcoverch Neujahrsvorsatz: mehr Kekse und öfter Feiern via photopin (license)
みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
初心者向けエクセルVBAのシリーズということで請求書を作成するマクロについてお伝えしています。
前回の記事はこちら。
セル範囲を平行移動したり、リサイズをしたりしながらまとめてコピーする方法をお伝えしました。
データの転記はほぼ完成という形なのですが、エクセルとVBAの技を駆使することで、もっともっと実用的にそして便利にしていくことができます。
気持ち的にはこれの100倍くらいは便利にすることができます。
まず、目をつけるのは「日付」です。
請求書は月ごとに作成することが多いので、納品日を見て対象となる年月かを判断したいですよね。
ということで、今回はエクセルVBAで日付データから年、月、日を取り出す方法をお伝えします。
では、行ってみましょう!
今回のお題:「年月」を取り出したい
これまで使用していた請求データは、「日付」の概念がありませんでした。
つまり、記載している請求データは全て雛形に転記するという処理でオッケーだったわけです。
しかし実際は、以下の図のように「納品日」という項目もあったりしますよね。
多くの場合、請求書は月ごとにまとめますから、納品日の年月を見てデータを転記するかどうか判別する必要があったりするわけです。
今回は、まずA列の納品日から「年」と「月」を抜き出すことを考えてみたいと思います。
ベースとなるプログラム
前回記事のプログラムはこちらですが…
Sub 請求書作成() wsTemplate.Rows("21:50").Hidden = False '隠れているかもしれない行を再表示 Dim rowsData As Long '行数カウント用の変数 rowsData = wsData.Cells(Rows.Count, 1).End(xlUp).Row '最後の行数を取得 wsData.UsedRange.Offset(1, 0).Resize(rowsData - 1, 3).Copy wsTemplate.Range("A21") wsTemplate.Rows(21 + rowsData - 1 & ":50").Hidden = True 'データがない行を隠す wsTemplate.Range("A18").Value = "ご請求金額:" & Format(wsTemplate.Range("D54").Value, "#,##0") & " 円" End Sub
今回は行単位で納品日を確認する必要がありますから、まとめて一気のCopyメソッドは使えません。
ですから、その前段階の以下のコードからスタートをしたいと思います。
Sub 請求書作成() wsTemplate.Rows("21:50").Hidden = False '隠れているかもしれない行を再表示 Dim rowsData As Long '行数カウント用の変数 rowsData = wsData.Cells(Rows.Count, 1).End(xlUp).Row '最後の行数を取得 Dim i As Long, j As Long, k As Long k = 21 For i = 2 To rowsData For j = 1 To 3 wsTemplate.Cells(k, j).Value = wsData.Cells(i, j).Value Next j k = k + 1 Next i wsTemplate.Rows(21 + rowsData - 1 & ":50").Hidden = True 'データがない行を隠す wsTemplate.Range("A18").Value = "ご請求金額:" & Format(wsTemplate.Range("D54").Value, "#,##0") & " 円" End Sub
これであれば、行単位での処理になっていますからね。
日付から年・月・日を取得
日付から年、月、日を取得するには、それぞれYear関数、Month関数、Day関数を使います。
Month(日付)
Day(日付)
なんだかそのまんまですね。
例えば
Sub 日付() Debug.Print Year("2018/1/10") Debug.Print Month("2018/1/10") Debug.Print Day("2018/1/10") End Sub
を実行すると
と表示されます。年、月、日がそれぞれ取得できていることがわかりますね。
納品日から年月を取り出す
ということで、まずは各請求データについて、納品日の「年」と「月」を取り出すプログラムを作ってみました。
こちらです。
Sub 請求書作成() wsTemplate.Rows("21:50").Hidden = False '隠れているかもしれない行を再表示 Dim rowsData As Long '行数カウント用の変数 rowsData = wsData.Cells(Rows.Count, 1).End(xlUp).Row '最後の行数を取得 Dim i As Long, j As Long, k As Long k = 21 For i = 2 To rowsData Dim deliDate As Date deliDate = wsData.Cells(i, 1).Value Debug.Print Year(deliDate), Month(deliDate) ' For j = 1 To 3 ' wsTemplate.Cells(k, j).Value = wsData.Cells(i, j).Value ' Next j k = k + 1 Next i wsTemplate.Rows(21 + rowsData - 1 & ":50").Hidden = True 'データがない行を隠す wsTemplate.Range("A18").Value = "ご請求金額:" & Format(wsTemplate.Range("D54").Value, "#,##0") & " 円" End Sub
まず、12行目で各請求データの1列目の納品日をdeliDateという変数に格納していて、それを用いて、年と月を出力しているのが13行目ですね。
14~16行目は転記処理なので、今回はコメントアウトしています。
実行すると以下のようにデバッグ出力されますね。
まとめ
以上、エクセルVBAで日付データから年・月・日をそれぞれ取り出す方法をお伝えしました。
Year関数、Month関数、Day関数というそのままズバリの関数を使いました。
さて、次回ですがこの取り出した年と月を使って、If文による分岐処理を作成していきます。
どうぞお楽しみに!
連載目次:データ一覧から請求書を自動で作る
お仕事において特定のデータ一覧から必要な情報を抽出するということは頻繁にありうると思います。ここではデータ一覧から請求書を作るということを目標に、実務で使えるスキルをまっすぐに身に着けることを目的としています。- 【初心者向けエクセルVBA】データ一覧から請求書を自動で作る
- 【初心者向けエクセルVBA】ワークシートをオブジェクト名で取り扱う方法
- 【初心者向けエクセルVBA】For~Next文で簡潔にプログラムを書く
- 【初心者向けエクセルVBA】行の数をカウントする&不要な行を隠す
- 【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
- 【初心者向けエクセルVBA】セル範囲を一気にまとめてコピーする方法
- 【初心者向けエクセルVBA】ワークシートのデータのある範囲だけをピッタリ取得する方法
- 【初心者向けエクセルVBA】セル範囲の平行移動をする方法・リサイズをする方法
- 【初心者向けエクセルVBA】日付データから年・月・日を取り出す
- 【初心者向けエクセルVBA】If~Thenを使った条件分岐の超入門