「excel マクロ 計算式 埋め込み formular1c1プロパティ 割り算」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。
RangeオブジェクトのFormulaR1C1プロパティを使って、割り算を行う数式をセルに入力する、Excelマクロ・Excel VBA(Visual Basic for Applications)のコードを探している方による検索です。
FormulaR1C1プロパティで割り算を入力するサンプルマクロ
まずは、簡単なサンプルマクロをご紹介しましょう。
Range("C1").FormulaR1C1 = "=R[0]C[-2] / R[0]C[-1]"
End Sub上記のマクロを実行すると、C1セルに「=A1 / B1」という割り算を行う計算式が入力されます。
代入文の右辺「"=R[0]C[-2] / R[0]C[-1]"」がポイントです。
ワークシート上で、「R[0]C[-2]」の表すセル、「R[0]C[-1]」の表すセルを確認すると、下図のとおりです。
上記のコードをFormulaプロパティで書くとすれば、
Range("C1").Formula = "=A1 / B1"
です。
つまり、
R[0]C[-2] が A1
R[0]C[-1] が B1
を、それぞれ表しているわけです。
Rの直後の[ ]にC1セルから見た行方向の位置関係を指定し、
Cの直後の[ ]にC1セルから見た列方向の位置関係を指定します。
[ ]の中が正の数値なら、下方向・右方向を意味し、
[ ]の中が負の数値なら、上方向・左方向を意味します。
[ ]の中が0(ゼロ)なら、行または列の位置関係が変わらないとこと意味します。
数式を入力するC1セルから見ると、
割り算で割られるほうのA1セルは、
同じ行(Row)の、2列(Column)左です。
これを意味しているのが R[0]C[-2] です。
数式を入力するC1セルから見ると、
割り算で割るほうのB1セルは、
同じ行(Row)の、1列(Column)左です。
これを意味しているのが R[0]C[-1] です。
R1C1形式の数式を入力する手順
説明をただ読むだけよりも、考えながら手を動かすほうが、理解は早まります。
特にR1C1形式の数式に慣れていない方に向けて、
Range("C1").FormulaR1C1 = "=R[0]C[-2] / R[0]C[-1]"
という代入文の右辺「 "=R[0]C[-2] / R[0]C[-1]" 」を入力する手順を書いておきます。
まず、
"=R[]C[]"
と入力してから、位置関係の変わらない行(Row)を表す R の直後の[ ]の中に 0 (ゼロ)を入力して、
"=R[0]C[]"
としてから、次に列(Column)方向の相対的な位置を考えて、Cの直後の[ ]の中に左方向に2つを意味する -2 (マイナス2)を入力して、
"=R[0]C[-2]"
と割り算で割られるほうを完成させます。
つづいて、除算演算子 / と R[]C[] を入力して、
"=R[0]C[-2] / R[]C[]"
先の割られるほうと同じように、位置関係の変わらない R の直後の[ ]に 0 を入力して、
"=R[0]C[-2] / R[0]C[]"
としてから、「C」の相対的な位置関係を考えて、Cの直後の[ ]の中に左方向に1つを意味する -1 (マイナス1)を入力して、
"=R[0]C[-2] / R[0]C[-1]"
という数式を完成させます。
R1C1形式の数式に慣れていない方でも、自分で考えながら数式を数回入力してみれば、難しいものではないことがわかるでしょう。
なお、R1C1形式に慣れている方の場合は、
"=R[0]C[-2] / R[0]C[-1]"
の[0]を省略して
"=RC[-2] / RC[-1]"
と書くことが多いと思いますが、[0]も書いておくほうが、R1C1形式に慣れていない方には理解しやすいはずです。
連続した複数のセルに割り算を入力するサンプルマクロ
ループ処理を使って、C1:C10セルに「=A1 / B1」といった数式を入力するなら、以下のようなマクロです。
Dim i As Long
For i = 1 To 10
Cells(i, "C").FormulaR1C1 = "=R[0]C[-2] / R[0]C[-1]"
Next i
ループ処理に慣れている方なら、特に難しくないコードです。
寧ろここで知っていただきたいのは、単純にC1:C10セルに「=A1 / B1」といった数式を入力するのならば、実は、ループ処理をする必要はないということです。
特にプログラミングの経験があって、Excelマクロにあまり慣れていない方の場合、なんでもループ処理で行おうとする傾向がありますが、以下のようなコードで連続したセルに数式を入力できてしまいます。
Range("C1:C10").FormulaR1C1 = "=R[0]C[-2] / R[0]C[-1]"
End Sub更に言うと、見慣れないR1C1形式の数式を入力することになるFormulaR1C1プロパティを使った上記のようなマクロではなく、Formulaプロパティを使った以下のようなマクロでもOKです。
Range("C1:C10").Formula = "=A1 / B1"
End Subこのマクロを実行すれば、C2セルには「=A2 / C2」、C3セルには「=A3 / B3」と、ちゃんと相対参照で数式が入力されます。
もちろん、代入文の左辺は
Range("C1:C10").Formula
ではなく、Rangeプロパティの引数を2つ指定した
Range("C1", "C10").Formula
でもOKです。
FormulaR1C1プロパティを使った
"=R[0]C[-2] / R[0]C[-1]"
よりも、Formulaプロパティを使った
"=A1 / B1"
のほうが、A1形式に慣れた多くの方にとって、理解しやすいはずです。
何らかのループ処理がそもそも存在していて、その一環でVBAからセルに数式を入力するのならFormulaR1C1プロパティを使うほうがコードを書きやすいとは思いますが、単に連続したセルにVBAで数式を入力するのならば、FormulaプロパティでもOKでループを回す必要もない、ということを、特にプログラミングの経験がある方には、知っておいていただきたいところです。
- Newer:条件付き書式のカラースケールで数値データを見やすく
- Older:Word VBAで選択範囲の段落数を取得する
Home » Excel VBA Rangeオブジェクト » セル数式 » FormulaR1C1プロパティで計算式を入力するExcelマクロ