IF関数とVBAで10%、8%税率計算式を使い分ける
今回は、IF関数でイートイン、テイクアウトの10%、8%税率計算を使い分けます。コンビニでの食品もイートイン、テイクアウトで税率が異なります。IF関数は、条件により、計算式を変えることが出来ます。前半では、IF関数をROUNDDOWN関数も含めて使い方を解説します。後半は、IF関数をVBAで表現します。
IF関数
コンビニ食材のイートイン、テイクアウトで消費税が異なることを具体的な例題とします。
IF関数を用いて、もしイートインであれば10%、そうでなければ8%と計算します。
消費税G列に入る、各行の小計に対する消費税額をIF関数で次のように入力します。
=IF(D3=”イートイン”,F3*0.1,F3*0.08)
D列がイートインの場合、F3×0.1 そうでなければ F3×0.08 が入ります。
IF関数は IF(論理式,値が真の場合実行される計算式,値が偽の場合実行される計算式)と書きます。
D3=”イートイン”が論理式で、そうであれば、F3×0.1の計算式が実行され、そうでなければ、F3×0.08の計算式が実行されます。
G3セルをコピーして、下の行に順番にペーストしていきます。小数点以下の桁数も表示されてしまいます。
実際の通貨では、小数点以下はありませんので、小数点以下切り捨てにする必要があります。ROUNDDOWN関数を使います。
イコールとIFの間にROUNDDOWN(、末尾に,0)を追加します。
=ROUNDDOWN(IF(D3=”イートイン”,F3*0.1,F3*0.08),0)
ROUNDDOWN関数は、ROUNDDOWN(数値,桁数)と書きます。
小数点以下切り捨てにするときは、桁数には0を入れます。
このように、IF関数でイートイン、テイクアウトそれぞれの計算式を適用することができ、ROUNDDOWN関数で小数点以下を切り捨てにすることができます。
次に、VBAで IF関数を表現してみましょう。
VBAで IF関数を表現
キーボードのAltキーを押しながらF11キーを押してください。VBAのエディターが起動します。
もし、VBAのエディターが最大表示されていたら、右上の縮小をクリックして、縮小し、シートと並べて表示することをお薦めします。
挿入、標準モジュールをクリックしてください。
Module1上にプログラムコードを記載していきます。
1 2 3 4 5 6 7 8 9 10 |
Private Sub AAA() Dim i As Integer i = 3 If Cells(i, 4) = "イートイン" Then Cells(i, 7) = Cells(i, 6) * 0.1 Else Cells(i, 7) = Cells(i, 6) * 0.08 End If End Sub |
変数を一つ宣言します。
iは、売上表内の行番号を格納します。
エディターが非表示になったら、Altキーを押しながらF11キーを押せば、表示されます。
売上表の3行目の「焼き鮭おにぎり」に対する消費税を取得したいので、i=3とします。
右三角ボタンを押して、プログラムを実行します。
4列目が”イートイン”であったら、×0.1が、そうでなければ、×0.08の計算式が適用されます。
売上の3行目のから12行目まで、同じ処理をしたいので、for next 文を外側に書きます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Private Sub AAA() Dim i As Integer i = 3 For i = 3 To 12 If Cells(i, 4) = "イートイン" Then Cells(i, 7) = Cells(i, 6) * 0.1 Else Cells(i, 7) = Cells(i, 6) * 0.08 End If Next i End Sub |
右三角ボタンを押して、プログラムを実行すると、消費税額が計算されています。
小数点以下の桁数も表示されていますので、同様に、小数点以下切り捨てにする必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 |
Private Sub AAA() Dim i As Integer i = 3 For i = 3 To 12 If Cells(i, 4) = "イートイン" Then Cells(i, 7) = Application.WorksheetFunction.RoundDown(Cells(i, 6) * 0.1, 0) Else Cells(i, 7) = Application.WorksheetFunction.RoundDown(Cells(i, 6) * 0.08, 0) End If Next i End Sub |
Application.WorksheetFunction.RoundDown(数値,桁数)と書き、ワークシート関数ROUNDDOWNをVBAでも利用し、小数点以下を切り捨てます。
このように、Application.WorksheetFunction.関数 でワークシート関数をVBAからも利用することができます。
※利用できない関数もあります。
最後に、売上の行数が増えた場合、都度都度 for i = 3 to 11 の 11を書き換えるのもスマートではないです。
プログラムを書き換えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Private Sub AAA() Dim i As Integer i = 3 For i = 3 To 100 If Cells(i, 1) = "" Then Exit For End If If Cells(i, 4) = "イートイン" Then Cells(i, 7) = Application.WorksheetFunction.RoundDown(Cells(i, 6) * 0.1, 0) Else Cells(i, 7) = Application.WorksheetFunction.RoundDown(Cells(i, 6) * 0.08, 0) End If Next i End Sub |
変数iは3~100まで1づつ加算されていきますが、i行目の1列目が空白だったら、forのループからEXIT 抜け出します。このようにすれば、売上表が100行目まで増えても、プログラムを書き換える必要はありません。
VBAを有効にしたエクセルファイルを保存するときは、ファイル、名前を付けて保存、Excelマクロ有効ブック(*.xlsm)を選択し、好きなファイル名で保存してください。
ご拝読ありがとうございました。