VBA100本ノック 5本目:セルの計算
こちらで公開されている、100本ノックに挑戦。
www.excel-ubara.com
素晴らしい教材を公開いただき、ありがとうございます。
上記リンク先から、問題文を転載。
問題文を読むと、「計算した値をD列に入れ」とある。
そこで今回は、単価の列をループして一行ずつ計算可能か評価し、
可能であれば結果をセットしてみた。
Sub VBA_100Knock_005() ' 単価の範囲。 Dim UnitPriceRange As Range Set UnitPriceRange = Range(Range("B3"), _ Range("B" & Rows.Count).End(xlUp)) ' 画面更新を一時停止(画面のチラつき防止のため)。 Application.ScreenUpdating = False ' 単価と点数が共に空欄でない場合に限り、 ' 金額に単価×点数をセット。 Dim r As Range For Each r In UnitPriceRange If r <> vbNullString And r.Offset(, 1) <> vbNullString Then With r.Offset(, 2) .Value = r * r.Offset(, 1) .NumberFormatLocal = "\#,##0_);[赤](\#,##0)" End With End If Next ' 画面更新の一時停止を解除。 Application.ScreenUpdating = True End Sub
ちなみに、
not A or not B
は、まとめて否定する場合
not (A and B)
となる(ド・モルガンの法則)。
或いは計算式をセットして金額を求めたのちに、コピーして値貼り付けする
方法もあるか。
Sub VBA_100Knock_005() ' 金額の範囲。 Dim PriceRange As Range Set PriceRange = Range(Range("B3"), _ Range("B" & Rows.Count).End(xlUp)) _ .Offset(, 2) ' 単価と点数が空白で無い場合に限り、金額を計算する数式をセット。 PriceRange = "=IF(OR(RC[-2]="""",RC[-1]=""""),"""",RC[-2]*RC[-1])" ' 計算が手動になっている場合を考慮して、自動計算に切り替え。 Application.Calculation = xlCalculationAutomatic ' 書式設定したうえで、範囲をコピーして値貼り付け。 With PriceRange .NumberFormatLocal = "\#,##0_);[赤](\#,##0)" .Copy .PasteSpecial xlPasteValues End With Application.CutCopyMode = False End Sub
解答を実行した結果がこちら。
※冒頭リンク先の解答例および解説も、ぜひご一読ください。
参考まで。