VBA100本ノック 6本目:セルに計算式

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

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

図らずも、前回作成した別解がそのまま使えそうな設問だ。
ということで、流用して作成してみた。

Sub VBA_100Knock_006()
    ' 商品コードの範囲。
    Dim ItemCodeRange As Range
    Set ItemCodeRange = Range(Range("A2"), _
                              Range("A" & Rows.Count).End(xlUp))
    
    ' 金額列にセットする数式を格納する配列。
    Dim arr As Variant
    ' 配列のサイズは商品コードの範囲と等しいため、
    ' 仮に商品コードをセットする。
        arr = ItemCodeRange
        
    ' 商品コードが枝番か否かを判別し、結果によって配列の各要素を
    ' 数式または空白に置き換える。
    Dim i As Long
        For i = 1 To UBound(arr)
            ' 商品コードに"-"を含む場合。
            If arr(i, 1) Like "*-*" Then
                arr(i, 1) = vbNullString
            Else
                arr(i, 1) = "=RC[-2]*RC[-1]"
            End If
        Next
    
    ' 金額の列、つまり商品コード列の3つ右隣に計算式をセット。
        With ItemCodeRange.Offset(, 3)
            .Value = arr
            .NumberFormatLocal = "\#,##0_);[赤](\#,##0)"
        End With
End Sub

「枝番が付いている場合」の判定には、Like演算子を用いてみた。
他の方法としては、

  1. Instr関数で"-"の位置を求めて、0以外の数値なら枝番。
  2. Split関数で"-"の位置で分割し、分割できたならば枝番。
  3. 正規表現でパターンマッチング。
  4. その他。

などがあるか。どれを使うかは、時と場合と各自のお好みで。


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

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

参考まで。