Home » ExcelVBA Rangeオブジェクト » セル数式 » FormulaR1C1プロパティで計算式を入力するExcelマクロ

FormulaR1C1プロパティで計算式を入力するExcelマクロ

対象:Excel2007, Excel2010, Excel2013

FormulaR1C1プロパティで計算式を入力するExcelマクロ

「excel マクロ 計算式 埋め込み formular1c1プロパティ 割り算」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。

RangeオブジェクトのFormulaR1C1プロパティを使って、割り算を行う数式をセルに入力する、Excelマクロ・Excel VBA(Visual Basic for Applications)のコードを探している方による検索です。

[スポンサードリンク]

FormulaR1C1プロパティで割り算を入力するサンプルマクロ

まずは、簡単なサンプルマクロをご紹介しましょう。

Sub 割り算を入力する()

 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]」の表すセルを確認すると、下図のとおりです。

FormulaR1C1プロパティで計算式を入力するExcelマクロ

上記のコードをFormulaプロパティで書くとすれば、
 Range("C1").Formula = "=A1 / B1"
です。

FormulaR1C1プロパティで計算式を入力するExcelマクロ

つまり、
 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」といった数式を入力するなら、以下のようなマクロです。

Sub 割り算をループで入力する()

 Dim i As Long

 For i = 1 To 10
  Cells(i, "C").FormulaR1C1 = "=R[0]C[-2] / R[0]C[-1]"
 Next i

End Sub

ループ処理に慣れている方なら、特に難しくないコードです。

寧ろここで知っていただきたいのは、単純にC1:C10セルに「=A1 / B1」といった数式を入力するのならば、実は、ループ処理をする必要はないということです。

特にプログラミングの経験があって、Excelマクロにあまり慣れていない方の場合、なんでもループ処理で行おうとする傾向がありますが、以下のようなコードで連続したセルに数式を入力できてしまいます。

Sub 割り算を一気に入力する_R1C1形式()

 Range("C1:C10").FormulaR1C1 = "=R[0]C[-2] / R[0]C[-1]"

End Sub

更に言うと、見慣れないR1C1形式の数式を入力することになるFormulaR1C1プロパティを使った上記のようなマクロではなく、Formulaプロパティを使った以下のようなマクロでもOKです。

Sub 割り算を一気に入力する_A1形式()

 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でループを回す必要もない、ということを、特にプログラミングの経験がある方には、知っておいていただきたいところです。

[スポンサードリンク]

Home » ExcelVBA Rangeオブジェクト » セル数式 » FormulaR1C1プロパティで計算式を入力するExcelマクロ

「セル数式」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.