• ベストアンサー

Excelの計算・積算方法

表記積算方法についてご教授下さい やりたいこと---- 毎日の数値データをあるのセル(A1)に入力します その日の数値を集計表のセル(G1)にいれます 次の日もセル(A1)に数値を入れます 前日の数値(G1)の値に本日の値(A1)を加算し(G1)に保存します また次の日も(A1)に数値を入れる それをたした数値を(G1)に保存 といった事を行いたいのですがよく分かりません ヒントでも良いのでご教授ください よろしくお願いします

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

  • ベストアンサー
noname#240783
noname#240783
回答No.7

Private Sub Worksheet_Change(ByVal Target As Range) If (1 <= Target.Row And Target.Row <= 15) And (1 <= Target.Column And Target.Column <= 5) Then total = Worksheets("Sheet4").Cells(Target.Row, Target.Column).Value + Cells(Target.Row, 7).Value Rem total = Worksheets("Sheet4").Cells(Target.Row, Target.Column).Value + Cells(Target.Row, Target.Column + 6).Value Cells(Target.Row, 7).Value = total Rem Cells(Target.Row, Target.Column + 6).Value = total End If End Sub 上記のIF文後半は、入力を拾いたい列が連続した複数行の場合です。 これですと「入力値が変化したセルが、1から15行目の中で、かつ、 1列から5列、つまり、A列からE列の場合」となりますネ。 入力列が飛び飛びの場合は If (1 <= Target.Row And Target.Row <= 15) And (Target.Column = 1 Or Target.Column = 5) Then てな具合かな。行が飛び飛びの場合も同様の考え方でOKです。 次に累計計算と表示部分ですが、上記のコードは第7列、つまりG列に固定になります。 A1セルからE15セルの範囲に入力された値はすべて各行G列に累計されます。 Rem total...とRem Cells...で始まる2行ペアですと、 A1セルの入力値はG列に累計され、B1セルの入力値はH列に累計され... つまり、入力セル列から6列離れたセルに累計される、といえばいいのかな、です。 Remをはずして(当然対応するもう一方の行はRem文でコメントアウトして) 色々確かめてみてください。 まっ、そろそろ日本酒でデキあがってきた頃でしょうからボチボチとやってください。私も来週は飲みに行こうかな、っと...

amuro_kamui
質問者

お礼

おはようございます。昨夜あれから少しいじってみたのですがやはり無知の悲しさ。力技での処理以外はいかんともしがたくてそれ以外の方法をあきらめてしまいました。(2時30分位までお返事は待っていたのですが・・) まったく今回はお世話になりました。これから本屋さんに行ってVBA教本を購入してきます。 とりあえずは、求める答えを出せるようになったのでこのまま上司に渡してしまいます。 もしまた質問が発生したらよろしくお願いします

すると、全ての回答が全文表示されます。

その他の回答 (6)

noname#240783
noname#240783
回答No.6

ほにゃぁ??コンパイルエラーですか? まずは、この行ですが↓ --- total = Cells(Target.Row, Target.Column).Value + _Cells(Target.Row, Target.Column + 6).Value --- Cellsの前のアンダーバーは1行のコードを2行に分割するためのものですので、1行にするならアンダーバーは消して下さい。 次に、この行ですが↓ --- ”Private Sub Worksheet_Change(ByVal Target As Range) ” --- ダブルコーテーションが気になりますが、これは記述してないですよね!? それと、Sub Worksheet_Changeプロシージャはシートにひとつだけですので前回のものが残っていてはいけません。 うーむっ?後は何でしょうねぇ... エラーが出た場合はエラーメッセージを控えておいて そのまま伝えるようにしましょう(って、説教臭くてすみません) 今度は余計な記述のないコードを送りますので、これで試してみて エラーが出ましたらエラーメッセージをお知らせください。 Private Sub Worksheet_Change(ByVal Target As Range) If (1 <= Target.Row And Target.Row <= 15) And Target.Column = 1 Then total = Cells(Target.Row, Target.Column).Value + Cells(Target.Row, Target.Column + 6).Value Cells(Target.Row, Target.Column + 6).Value = total End If End Sub (ラーメンすすりながら待ってますのでご遠慮なく)

amuro_kamui
質問者

補足

ラーメンはおいしいですか? 私は必死に日本酒をいただきながら取り組んでいます。 ただ、私の大いなる勘違いがあり前述が誤りであり、 かつ何とか欲しかった動作にはなりましたのでご報告をかね相談いたします。 まず、動いたので安心したら酔いが回ってきました。ちょっと表現が不足するやもしれませんがあしからず。 *** 上記をそのままコピペすれば問題なく動作しました。 私の勘違いでお騒がせして申し訳ありませんでした。 そして再度もう毒をくらわば皿までの気持ちで再度ご相談です 何度も追加要求をだして、すみません。 今までの要求はColamnを1列だけでだしていましたが実は複数列あるのです(多分もうご想像されていたかも知れませんね・・・)すみません どうも気後れで正直に全部の要求を一気に書けなかったもので なので行(Row)と列(Column)が複数だった場合の分かりやすくて綺麗な記述はどうするのでしょうか? 今回、入門者の私は上記の記述を必要列数羅列しました。要求通りに動いてくれましたが・・・・・ とっても見ずらい まあ、私が知らなさすぎるのですが もう少し綺麗な方法まで良かったらお教えください

すると、全ての回答が全文表示されます。
noname#240783
noname#240783
回答No.5

あっ、イタタッ! 一般的にRangeコレクションはセル範囲を指定する時に便利なので その流れでセルひとつを指定する時も、ついつい使ってしまう 私の悪いクセでした。 今回の様に、行・列の値が可変の場合は、Cellsプロパティを使えば解決です。 ( Cellsは、Worksheetsオブジェクトのプロパティですので、正しくは   Worksheets("Sheet1").Cells(1,1) とかになります ) Private Sub Worksheet_Change(ByVal Target As Range) If (1 <= Target.Row And Target.Row <= 15) And _ Target.Column = 1 Then '日次入力欄を、A1からA15までのセルと仮定しています。 '条件文の括弧は念のためと見易い様につける私のクセです。  total = Cells(Target.Row, Target.Column).Value + _ Cells(Target.Row, Target.Column + 6).Value '累計値表示欄を、各行のG列と仮定して、+6しています。 Cells(Target.Row, Target.Column + 6).Value = total End If End Sub セルの指定方法は色々な形があるのでHelpなどでサンプルコードを いくつか見ておくと応用が効くので「お勉強」しておくことを お勧めします(って、ちとエラそうでした、反省...)

amuro_kamui
質問者

補足

うるうるうる。どーもありがとーごぜーやす。 ここまで親切に指導していただくとは恐れ入ります。 でも、エラーでExcelにおこられた。 上記のとおりにコピペして実行すると「コンパイルエラー」としかられる。 --- ”Private Sub Worksheet_Change(ByVal Target As Range) ” --- の定義「Range」と --- total = Cells(Target.Row, Target.Column).Value + _Cells(Target.Row, Target.Column + 6).Value --- の「Celles」の表記がちがうのではじかれているような気がします。 こまってーーしまうま。。。(古いかな) すみません、真剣なのですが・・・ このところがどうなれば動いてくれるのか お願いします。もう少しご教授下さいませ

すると、全ての回答が全文表示されます。
  • coco1
  • ベストアンサー率25% (323/1260)
回答No.4

#2です。 設計思想というのは、ややもすると神学論争になりがちなのですが、要は使い回しの効く、使い勝手のよい表にする、と言うことです。 もちろん、社の定型であるとか上司の指示であるとかであれば考える余地はないわけですが。 基本的に、表は 名前|国語|社会|理科 山田| 佐藤| の体裁で、T字型に展開しているものが理想です。 こうするとオートフィルタ、ピボットテーブル、集計、ソートなどの機能を無理なく使えるし、列・行の挿入・削除にも対応が簡単だし、将来的に本格的なデータベースに移行するときにも手間が掛かりません。 ところが、こういった二次利用のことを考えず、従来のペーパー上の書式をそのままシート上に展開しようとしたりして 名前|国語|前回比|社会|前回比|理科|前回比| 山田| 伸び率| 全体順位| 佐藤| 伸び率| 全体順位| みたいに異質の内容が入れ子になったものになると途端に使い勝手が悪くなります。作成も大変ですし。 後から集計できるものはそちらに任せて、入力のしやすさとか一覧性の良さとか兼ね合いを謀るのが難しいところです。 ご質問の要領で気になったのは、シートに残っているのは最新の計算結果だけ、ってことですから、内容の照合・検算ができないわけですよね? やはり、日々のデータは行を変えて蓄積していき、計算式や機能を使って集計した方が理想ではないのかな、と思って、先の回答をしました。

amuro_kamui
質問者

お礼

ご説明ありがとうございます。 今後私が設計するような場合は貴重な参考意見として 受け取っておき、活用のしるべとさせていただきます。 まあ、今回は上司からの注文なので何も言わずに受けました。(ちょっと反省) どうもありがとうございました

すると、全ての回答が全文表示されます。
noname#240783
noname#240783
回答No.3

シート画面で ALT + F11キーで「VBエディタ」が開きます。 画面左側のツリーから目的のシートをダブルクリックします。 (値を入力し加算値を表示するシートです) 画面右側に開いたウィンドウ上部左(General)のリストボックスを 開いて Worksheet をクリックしてください。 現れたコードは、とりあえず無視して、End Sub から下に 私の投稿文のコード部分をそっくりそのままコピペして、 そのまま「上書き保存」して下さい。これでOK!です。 あとは、エクセルシートに戻って、A1セルに値を何回か入力して テストして下さい。 Worksheet_Change...は「対象のシートで、セルの値が変わったら 発生するイベント」を受けるSubプロシージャです。 引数のTargetにイベントが発生したセル情報がありますので それを判定して、A1セルの時だけ「お仕事」します。 このSubプロシージャは実は、上記の 「ウィンドウ上部左(General)のリストボックス」の右隣の リストボックスにある、「VBAが用意してくれている」Subです。 Functionプロシージャは、「お仕事」した結果の値を返してくれるもの、 Subプロシージャは、「お仕事」だけ黙ってしてくれるもので、 どちらもVBAで使えますし、上記のような既存のものだけでなく 自分独自のSubプロシージャも作成可能です。 なお、「Function...しか記述がない」ような教本は お捨てなさいっ!!(オヒオヒ...) 説明が「おヘタ」ですみません。うまくいかなかったらまた お知らせください。

amuro_kamui
質問者

補足

回答ありがとうございました。指示されるがままに行ったらばっちり希望通りに動きました。まずはありがとうございます。 で、あつかましいついでにさらに質問が・・・ 実はデータ入力するセルは複数あります。大体10から20位の入力項目が同列(A1-A1*)あります。 当然集計表も(G1-G1*)あるのです この範囲をまったく同じように計算させるにはどのようにセル範囲を指定すればよいのでしょう? ----------------- If Target.Row = 1 And Target.Column = 1 Then '↑この文は、セルA1つまりR1C1を判断しています。 このコメントでセルを指定していると思うのですがこれと同じ行を必要数書かなければいけないのか それともセル範囲の指定に“1-15”のように指定できるのか分からないのです というかやってみてうまく動かない total = Range("A1").Value + Range("G1").Value また、こちらで足し算を実行している(と思う)がこれも複数書かないといけにのでしょうか? 単純そうで単純でないことに四苦八苦しています どうぞよろしくご教授お願いいたします

すると、全ての回答が全文表示されます。
  • coco1
  • ベストアンサー率25% (323/1260)
回答No.2

まず、ワークシート上で無理がありそう?というのは、そもそも表の設計思想に無理があることが多いです。 その入力要領が本当に一番合理的なのかどうかをまず考えてみて下さい。 あと、セル移動の手間などを省きたい(ワークシートを開いてすぐに入力→加算をしたい)と言うことであれば、セルに拘らず、VBAでユーザフォームを表示させて、そこで入力させる、というのがよいと思います。 不明なところは補足要求して下さい。

amuro_kamui
質問者

お礼

まずはご教授ありがとうございます。 この発想は上司の発想で、その上司曰く「これがベストだよ」とのたまうのです 私も受けた瞬間は無理かなーーーとは感じました で、後学のために質問です 表の設計思想で無理がある との事ですが、どういう発想の部分が無理なのかな? よろしければ教えてください

すると、全ての回答が全文表示されます。
noname#240783
noname#240783
回答No.1

シート上でやろうとすると「循環参照」のドツボに はまる、ってヤツですね。 私はこういう時はアッサリVBAに頼ります。 Private Sub Worksheet_Change(ByVal Target As Range) Dim total If Target.Row = 1 And Target.Column = 1 Then '↑この文は、セルA1つまりR1C1を判断しています。 total = Range("A1").Value + Range("G1").Value Range("G1").Value = total End If End Sub

amuro_kamui
質問者

補足

大変参考になりました。やっぱりワークシート上では不可な事らしいですね(そんな気はしていましたが)それで、まったくあつかましいのですがこれを使用したいのですがVBAにまったく無知なので方法が分かりません。手にあるExcelの教本ではVBAでは 「Function 関数名」で始まり「End Function」で終了する方法しか記述してなくて・・・ VBAの教本を購入して学習しないといけないことだとは思いますがどうぞよろしくお願いします

すると、全ての回答が全文表示されます。

関連するQ&A