VBA100本ノック 5本目:セルの計算

こちらで公開されている、100本ノックに挑戦。
www.excel-ubara.com
素晴らしい教材を公開いただき、ありがとうございます。

上記リンク先から、問題文を転載。
f:id:Infoment:20220110220324p:plain

問題文を読むと、「計算した値を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


解答を実行した結果がこちら。
f:id:Infoment:20220110224914g:plain

※冒頭リンク先の解答例および解説も、ぜひご一読ください。

参考まで。