
任意のセルに、計算式を入力しております。
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
どうぞよろしくお願いします!!
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 と、右から数式を入れているようですが、今回の場合、列の挿入がなければ、あまり関係がないようです。
ありがとうございました!出来ました。
End(xlDown)よりも、End(xlUp)のほうがよいと、確かに
言われました。
いつも教えていただいてどうもありがとうございます。
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
でも可能です。
セルの指定が難しくて、進まない箇所が多いのが
現状です・・。
上記のような記述をするんですね!
ありがとうございました!
勉強になりました!!
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
この回答への補足
ありがとうございます!書き方ひとつでこんなに
すっきり実行できました。
もう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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
はじめまして。私、配管業を個...
-
製造業に勤めています。 外注さ...
-
天井開口費の見積について
-
外構見積もりましたが、どうで...
-
一式という言葉の使い方
-
積算 高所作業車 建築
-
CIF単価→FOB単価の算出の仕方を...
-
仕入単価
-
公共建築工事(設備)の積算に...
-
1工数1人工
-
事務所ビルの電気料金について...
-
表示方法
-
投信の「数量」がよく分からない
-
IFERROR、SMALL関数について
-
卸単価の95掛けってどうゆう意...
-
Access columnプロパティについて
-
売上、客数、単価から買い上げ...
-
リストボックスの項目に、他の...
-
食材の単価と価格の違いを教え...
-
ACCESSのレコード順番の入れ替え
おすすめ情報