- ベストアンサー
Excel VB 任意のセルから、最終行までの数式のコピー
任意のセルに、計算式を入力しております。 A B C 1 個数 金額 基準単価 2 5 15000 3000 3 123 25780 4 ・ ・ 600 C2には、B2/A2という計算式が入っております。 この計算式を、C600(浮動)までコピーしたいのですが、 どうしてもうまくいきません。。 Sub 基準単価() Dim i As Integer Application.ScreenUpdating = False '1行目で検索 For i = Range("IV1").End(xlToLeft).Column To 1 Step -1 If InStr(Cells(1, i).Value, "基準単価") > 0 Then Cells(2, i).FormulaR1C1 = B2/A2 Cells(2, i)Selection.AutoFill Destination:= Range("Cells(2, i).End(xlDown)).Type:=xlFillDefault End If Next i Application.ScreenUpdating = False End Sub どうぞよろしくお願いします!!
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 >Cells(2, i).Formula = "=B2/A2" >のところを、 >Cells(2, i).Formula ="=Cells(2, i - 1) / Cells(2, i - 2)" >としました。 ワークシートにはワークシートの表現の仕方がありますから、VBAの表現方法ではうまくいきません。 "=B2/A2" これは、絶対参照になっていませんから、そのままでよいのです。 この意味は、 VBAでは、 Cells(2, i - 1) / Cells(2, i - 2) と同じことです。つまり、R1C1 方式でいうと、 "=RC[-1] /RC[-2]" このように書き表します。分かりやすいので、私は、こちらを使っています。 私なりの方法で考えてみました。オートフィル・メソッドは、デフォルト方式の場合などは、VBAではあまり使われません。 Sub 基準単価r() Dim i As Integer Application.ScreenUpdating = False '1行目で検索 For i = Range("IV1").End(xlToLeft).Column To 3 Step -1 If InStr(Cells(1, i).Value, "基準単価") > 0 Then '基準単価の列で範囲を取るよりは、個数や金額のところで範囲を取ったほうがよいと思います。ただし、End(xlDown)は、多少問題は残っています。 Range(Cells(2, i), Cells(2, i - 2).End(xlDown).Offset(, 2)).FormulaR1C1 = _ "=RC[-1]/RC[-2]" '相対参照式を使います End If Next i Application.ScreenUpdating = False End Sub もし、下に何も入れていない状態だったら、 Range(Cells(2, i), Cells(65536, i - 2).End(xlUp).Offset(, 2)).FormulaR1C1 = としたほうがよいと思います。それは、1行目だけか、2行目だけにしか入っていない場合は、一番、下まで、行ってしまいます。 また、Step -1 と、右から数式を入れているようですが、今回の場合、列の挿入がなければ、あまり関係がないようです。
その他の回答 (2)
- merlionXX
- ベストアンサー率48% (1930/4007)
#1のmerlionXXです。 Wendy02さんがお書きのとおりですが。 Cells(2, i).Formula = "=B2/A2" を x = "=" & Cells(2, i - 1).Address(0, 0) & "/" & Cells(2, i - 2).Address(0, 0) Cells(2, i).Formula = x でも可能です。
お礼
セルの指定が難しくて、進まない箇所が多いのが 現状です・・。 上記のような記述をするんですね! ありがとうございました! 勉強になりました!!
- merlionXX
- ベストアンサー率48% (1930/4007)
なにか随分複雑に作ってますね。 そのまま使うならこんなかんじでしょうか? (計算式の入力と、AutoFillのやりかたを変えただけです) Sub 基準単価() Dim i As Integer Application.ScreenUpdating = False '1行目で検索 For i = Range("IV1").End(xlToLeft).Column To 1 Step -1 If InStr(Cells(1, i).Value, "基準単価") > 0 Then Cells(2, i).Formula = "=B2/A2" Cells(2, i).AutoFill Destination:=Range(Cells(2, i), Cells(2, i - 1).End(xlDown).Offset(0, 1)), Type:=xlFillDefault End If Next i Application.ScreenUpdating = False End Sub
補足
ありがとうございます!書き方ひとつでこんなに すっきり実行できました。 もう1つだけ教えて下さい。。 実際には、 Cells(2, i).Formula = "=B2/A2" のところを、 Cells(2, i).Formula ="=Cells(2, i - 1) / Cells(2, i - 2)" としました。 =Cells(2, i - 1) / Cells(2, i - 600) と文字が返ってきます。。 セルの指定方法をすみませんが教えて下さい! お手数をおかけします。。
お礼
ありがとうございました!出来ました。 End(xlDown)よりも、End(xlUp)のほうがよいと、確かに 言われました。 いつも教えていただいてどうもありがとうございます。