VBA100本ノック 6本目:セルに計算式
こちらで公開されている、100本ノックに挑戦。
www.excel-ubara.com
素晴らしい教材を公開いただき、ありがとうございます。
上記リンク先から、問題文を転載。
図らずも、前回作成した別解がそのまま使えそうな設問だ。
ということで、流用して作成してみた。
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演算子を用いてみた。
他の方法としては、
- Instr関数で"-"の位置を求めて、0以外の数値なら枝番。
- Split関数で"-"の位置で分割し、分割できたならば枝番。
- 正規表現でパターンマッチング。
- その他。
などがあるか。どれを使うかは、時と場合と各自のお好みで。
解答を実行した結果がこちら。
※冒頭リンク先の解答例および解説も、ぜひご一読ください。
参考まで。