プロが教える店舗&オフィスのセキュリティ対策術

任意のセルに、計算式を入力しております。
 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

どうぞよろしくお願いします!!

 

A 回答 (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 と、右から数式を入れているようですが、今回の場合、列の挿入がなければ、あまり関係がないようです。
    • good
    • 0
この回答へのお礼

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

いつも教えていただいてどうもありがとうございます。

お礼日時:2007/02/05 13:17

#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

でも可能です。
    • good
    • 0
この回答へのお礼

セルの指定が難しくて、進まない箇所が多いのが
現状です・・。
上記のような記述をするんですね!

ありがとうございました!
勉強になりました!!

お礼日時:2007/02/05 13:18

なにか随分複雑に作ってますね。


そのまま使うならこんなかんじでしょうか?
(計算式の入力と、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)
と文字が返ってきます。。
セルの指定方法をすみませんが教えて下さい!

お手数をおかけします。。

補足日時:2007/02/05 10:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!