• ベストアンサー

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 どうぞよろしくお願いします!!  

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 >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 と、右から数式を入れているようですが、今回の場合、列の挿入がなければ、あまり関係がないようです。

acochaco
質問者

お礼

ありがとうございました!出来ました。 End(xlDown)よりも、End(xlUp)のほうがよいと、確かに 言われました。 いつも教えていただいてどうもありがとうございます。

その他の回答 (2)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

#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 でも可能です。

acochaco
質問者

お礼

セルの指定が難しくて、進まない箇所が多いのが 現状です・・。 上記のような記述をするんですね! ありがとうございました! 勉強になりました!!

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

なにか随分複雑に作ってますね。 そのまま使うならこんなかんじでしょうか? (計算式の入力と、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

acochaco
質問者

補足

ありがとうございます!書き方ひとつでこんなに すっきり実行できました。 もう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) と文字が返ってきます。。 セルの指定方法をすみませんが教えて下さい! お手数をおかけします。。

関連するQ&A

専門家に質問してみよう