みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
初心者向けエクセルVBAのシリーズとして請求データから請求書を作るマクロを作成しています。
前回の記事はこちら。
日付データから年月日を取り出す方法についてお伝えしました。
さて、なぜ年月日を取り出したかと言うと、月ごとの請求書を作るために、特定の年月の請求データだけを取り出したいわけです。
今回はそのために、今後はそれはもうお世話になりまくりになるはずの、If文を使った条件分岐の書き方についてお伝えします。
なお、この記事は以下のYouTube動画と連動していますので、合わせてご覧くださいませ。
では、エクセルVBAでIf~Thenを使った条件分岐の超入門、行ってみましょう!
前回のおさらい:納品日から年月を取り出す
まず、請求データのシートは以下のようになっているとします。
このA列、つまり納品日の「年月」を確認して、例えば2018年の1月のデータのみを、請求書ひな形に転記したいというわけです。
ベースとして、以下の前回作成したプログラムから始めます。
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
13行目で、Year関数、Month関数を使って、各請求データの「年」と「月」を取り出して出力していますが、これらの値を条件に、ひな形に転記するかどうかを判定すれば良いわけですね。
If~Thenを使った条件分岐
エクセルVBAで条件分岐の処理を書くときには、If文を使います。
書式は以下の通りです。
’条件式がTRUEだったときの処理
End If
「条件式」とは、成立しているときにTRUE、そうでないときにはFALSEのどちらかの値をとる式を指定します。
例えば「x < y」という条件式が合った場合、その条件式は以下のような値を取ります。
x | y | x =< y |
---|---|---|
5 | 10 | TRUE |
5 | 5 | TRUE |
5 | 0 | FALSE |
具体的には以下のようなコードになります。
Sub 条件分岐()
Dim x As Long, y As Long
x = 5
y = 5
If x <= y Then
Debug.Print "xはy以下です。"
End If
End Sub
xやyの値を変えて、何度か実行してみましょう。
複数の条件をIf文に用いる
「かつ」を表すAnd演算子
さて、今回の納品日の判定でいうと「年が2018で、かつ、月が1である」という複数の条件を使用する必要があります。
複数の条件式を「かつ」でつなぎたい場合は、論理演算子Andを使って以下のようなIf文を書いてあげればOKです。
'条件式Aと条件式Bが両方ともTRUEだったときの処理
End If
And演算子を使うと、指定した条件の両方を満たしたときに、処理を実行するという条件分岐を実現することができます。
したがって、今回の場合は以下のような条件分岐処理を使ってあげればよいということになります。
If Year(deliDate) = 2018 And Month(deliDate) = 1 Then
'処理
End If
「または」を表すOr演算子
なお、AndがあればOrもあるだろうということで、補足しておきます。
複数の条件式を「または」で繋ぎたい場合には、Or演算子を使って以下のように書きます。
'条件式Aと条件式BのどちらかがTRUEだったときの処理
End If
これで、いずれかの条件式が満たされていれば、Ifブロック内の処理が行われます。
納品日の年月を判定して転記するプログラム
以上、If文をプログラムに組み込んでみますと、以下のようになります。
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
If Year(deliDate) = 2018 And Month(deliDate) = 1 Then
For j = 1 To 3
wsTemplate.Cells(k, j).Value = wsData.Cells(i, j + 1).Value
Next j
k = k + 1
End If
Next i
wsTemplate.Rows(k & ":50").Hidden = True 'データがない行を隠す
wsTemplate.Range("A18").Value = "ご請求金額:" & Format(wsTemplate.Range("D54").Value, "#,##0") & " 円"
End Sub
13行目が「2018年かつ1月であれば」を条件としたIf文になります。それが成立していれば、14~17行目のIfブロック内の処理を実行します。
また、請求データシートにはA列に「納品日」列が増えたので、転記する対象の列が全体で1ずれます。したがって「wsData.Cells(i, j + 1).Value」というように列をカウント用変数jに対してプラス1をします。
さらに、21行目ですが、これまでは「rowsData+1」を使っていましたが、請求データの品目数と転記すべきデータの数は異なりますので、kを使うように変更しました。
実行結果
実行すると、以下のように納品日が2018年1月であったデータのみ転記されるはずです。
まとめ
以上、エクセルVBAでIf文を使って特定の条件のデータのみを転記するプログラムを作成しました。
And、Orといった論理演算子もぜひ合わせて覚えていただければと思います。
次回ですが、For~Next文でセル範囲を行単位で移動する方法で、もう少しスッキリしたプログラムにしていきます。
どうぞお楽しみに!
連載目次:データ一覧から請求書を自動で作る
お仕事において特定のデータ一覧から必要な情報を抽出するということは頻繁にありうると思います。ここではデータ一覧から請求書を作るということを目標に、実務で使えるスキルをまっすぐに身に着けることを目的としています。- 【初心者向けエクセル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】取引先別に請求書を作成するマクロを作る