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

エクセル2007でVBAを何度も挫折しています
任意のセルに小計、合計と入力したら自動計算してくれるVBAの方法を教えてください

セル
G21 商品名
L21 詳細
V21 数量
X21 単位
Z21 単価
AD21 金額(V21:数量*Z21:単価)

の何処にでもある見積書なのですが
任意のG行に小計・合計と入力すると
AD行に金額が自動で入力させるVBAの仕方が知りたいです。

3行ほどの見積もあれば100行を超える見積もあります

教えてください。

A 回答 (5件)

シート名タブを右クリックしてコードの表示を選び,現れたシートに下記をコピー貼り付ける



private sub worksheet_change(byval Target as excel.range)
 dim ta as range
 dim ha as range
 dim h as range
 dim d as range
 set ta = application.intersect(target, range("G22:G" & cells.rows.count))
 if ta is nothing then exit sub

 for each ha in ta.areas
 for each h in ha

 if h = "合計" then
  cells(h.row, "AD").formula = "=SUBTOTAL(9,AD21:AD" & h.row - 1 & ")"

 elseif h = "小計" then
  set d = range(range("G21"), h.offset(-1)).find(what:="小計", after:=h.offset(-1), lookin:=xlformulas, lookat:=xlwhole, searchdirection:=xlprevious)
  if d is nothing then set d = range("AD21")
  cells(h.row, "AD").formula = "=SUBTOTAL(9,AD" & d.row + 1 & ":AD" & h.row - 1 & ")"
  set d = range(h.offset(1), cells(cells.rows.count, "G")).find(what:="小計", after:=h.offset(1), lookin:=xlformulas, lookat:=xlwhole, searchdirection:=xlnext)
  if not d is nothing then
   cells(d.row, "AD").formula = "=SUBTOTAL(9,AD" & h.row + 1 & ":AD" & d.row - 1 & ")"
  end if
 end if
 next
 next
end sub

G列に小計や合計と記入する。


合計はまぁ1つしか無いという事にして,小計は上下で重ならない範囲を計算することにします。これに伴い,既存の小計範囲に割り込んで小計を挿入した場合は,既設小計の範囲を縮小します。
2層以上の中計小計をしたいときは,アウトラインの機能などを組み合わせてエクセルが最初からもっている集計の機能などを使って下さい。
ていうか,一体どこからどこまでの小計を出させたいのかは,あなたが本来考えて必要なら「こうしたい」をご相談すべき内容です。
    • good
    • 0

>任意のG行に小計・合計と入力すると


Gなどは列を指定するために使う。
だから何のいみかわからない。
数量X単価を出すなら、VBAで処理するにしても、
=Range("V21")*Range("Z21")
あるいはセルにFormulaで式を入れる方法もある。
で良いのでは。
>小計・合計と入力すると
なぜこういう文字列を入れる必要があるのか。
ーー
私が質問の意味を、誤解しているかも知れないが、原因はデータ例の構成を(数行で良いが)を質問文に書かないからだと思う。
ーーー
これはどういう場面で計算するのか
1社の明細が入力を終わったとき?
1行のデータを入力が終わったとき?
何か合計ボタンに様なものをクリックしたとき?(<-小計、合計と入力したら、はこの意味か?)
ーーー
>3行ほどの見積もあれば100行を超える見積もあります
これは1社辺りのことか。
ひょっとしてSUMPRODUCT関数で出来ることを言っているのか
Σ単価X数量のいみで
単価X数量の行合計か?
    • good
    • 0

ワークシート関数でもできる事をVBAで実現しようとしている事はご質問者がVBAをマスターしたいという事と想定すると質問の丸投げはやめて挫折しているコード等を質問すべきと思います。

    • good
    • 0

VBAでなく、エクセルの普通の計算式を入れればいいですね。



AD21に「=V21*Z21」の数式を入れておけば、自動的に入りますが、普段は、非表示にしておくのであれば、IF関数を使います。

任意のG列を仮にG2とします。

それでAD21に次の式を入れます。

=IF(G2="小計",V21*Z21,"")

これは、G2に小計と入力された場合、V21とZ21をかけた答えを表示する、という意味です。
    • good
    • 0

セル


G21 商品名
・・・・・AD21 金額(V21:数量*Z21:単価)
これは見出し行で、その下にデータが入力されるという事でいいのかな??

>エクセル2007でVBAを何度も挫折しています
ちなみに今回はどういうVBAを考えて、どこで挫折しているんでしょうか??

G行の最下段を選択して、その直情のデータ入力行(Ctrl+↑)へ飛んで
>任意のG行に小計・合計と入力すると
この位置を選び、そこから相対的に23セル右(ADxx)を選んで、AD22からの合計を出す式を入力する
・・・・・こんなんじゃ駄目かな??
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています