Home » ExcelVBA Rangeオブジェクト » セル数式 » VBAからFormulaR1C1プロパティを使ってIF関数を入力する


VBAからFormulaR1C1プロパティを使ってIF関数を入力する

対象:Excel2007, Excel2010, Excel2013

VBA(Visual Basic for Applications)からワークシート関数のIF関数を使った数式を入力するコードをご紹介しました。

マクロ記録を行うと作られるFormulaR1C1プロパティではなくFormulaプロパティでもOKなこと、ループを回さなくても複数のセルに一気に数式を入力できることは、是非知っておいていただきたいところです。

何らかのループ処理がそもそも存在していて、そのループの中でIF関数を入力したいということもあるようです。そんなときはFormulaR1C1プロパティを使うほうが、わかりやすいコードになります。

[スポンサードリンク]

ループ処理の中でIF関数を含む数式を入力するサンプルマクロ

以下のマクロを実行すると、B1:B10セルに「=IF(A1>=80, "合格", "")」という、A列の値が80以上だったときに「合格」そうでなかったときには何も表示しないIF関数を使った数式が入力されます。


Sub VBAでワークシート関数のIFを入力する_R1C1()

 Dim i As Long

 For i = 1 To 10
  Cells(i, "B").FormulaR1C1 = _
   "=IF(R[0]C[-1]>=80, ""合格"", """")"
 Next i

End Sub

サンプルマクロの解説

RangeオブジェクトのFormulaR1C1プロパティを使った代入文の、
  Cells(i, "B").FormulaR1C1 = _
   "=IF(R[0]C[-1]>=80, ""合格"", """")"
右辺・IF関数の第1引数「R[0]C[-1]>=80」が、もちろんポイントです。

Rの直後の[0]が行Row(行)方向の相対的な位置関係
Cの直後の[-1]がColumn(列)方向の相対的な位置関係
をそれぞれ表しています。

R1C1形式は見慣れないと難しく感じるのかもしれませんが、自分の手を動かしながら一度理解できてしまえば、決して難しくはありません。位置関係が動かないときの[0]は省略できますが、省略しないで書いておくほうが、理解しやすいはずです。

ループ処理だから当然遅い

ループ処理の中でIF関数を入力したいという要望をいただくこともあるので、ここではFormulaR1C1プロパティを使ったコードをご紹介していますが、データ量が多いときは注意が必要です。

今回ご初回しているコードは、ループを回して、何度も何度もRangeオブジェクトを参照しているので、当然、遅いです。

B1:B5000セルに「=IF(A1>=80, "合格", "")」といった数式を入力するのに、今回ご紹介した、
 For i = 1 To 5000
  Cells(i, "B").FormulaR1C1 = _
   "=IF(R[0]C[-1]>=80, ""合格"", """")"
 Next i
というコードと、ループを回さないで一気に入力する、
 Range("B1", "B5000").Formula = _
  "=IF(A1>=80, ""合格"", """")"
というコードをそれぞれ実行して、スピードの違いを体感しておくことをおすすめしておきます。

[スポンサードリンク]

Home » ExcelVBA Rangeオブジェクト » セル数式 » VBAからFormulaR1C1プロパティを使ってIF関数を入力する

Home » ExcelVBA Rangeオブジェクト » セル数式 » VBAからFormulaR1C1プロパティを使ってIF関数を入力する

「セル数式」の記事一覧

検索


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

.