VBA(Visual Basic for Applications)からワークシート関数のIF関数を使った数式を入力するコードをご紹介しました。
マクロ記録を行うと作られるFormulaR1C1プロパティではなくFormulaプロパティでもOKなこと、ループを回さなくても複数のセルに一気に数式を入力できることは、是非知っておいていただきたいところです。
何らかのループ処理がそもそも存在していて、そのループの中でIF関数を入力したいということもあるようです。そんなときはFormulaR1C1プロパティを使うほうが、わかりやすいコードになります。
ループ処理の中でIF関数を含む数式を入力するサンプルマクロ
以下のマクロを実行すると、B1:B10セルに「=IF(A1>=80, "合格", "")」という、A列の値が80以上だったときに「合格」そうでなかったときには何も表示しないIF関数を使った数式が入力されます。
Dim i As Long
For i = 1 To 10
Cells(i, "B").FormulaR1C1 = _
"=IF(R[0]C[-1]>=80, ""合格"", """")"
Next i
サンプルマクロの解説
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, ""合格"", """")"
というコードをそれぞれ実行して、スピードの違いを体感しておくことをおすすめしておきます。
- Newer:開いているファイル・文書をすべて閉じるWordマクロ
- Older:画像だけをすべて選択するPowerPointマクロ
Home » Excel VBA Rangeオブジェクト » セル数式 » VBAからFormulaR1C1プロパティを使ってIF関数を入力する