• ベストアンサー

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

  • EXCELで、1行おきに計算したい

    エクセルの表に集計された値を、1行おきに加算する方法を教えて下さい。 例えば、セルA2、A4、A6、A8、A10…の値のみを加算していくには、 どのような計算式を入れたら良いでしょう? =A2+A4+A6+A8+A10…などと入力していくと、気が遠くなるほど加算数が多いです。 どうぞ、よろしくお願いします。

  • エクセルの計算式を教えてください!

    誠に申し訳ありませんが、わかりましたら、教えてください。 エクセルの計算式でE1のセルに次の計算式があった時に =VLOOKUP(B1,$F$1:$G$10,2,FALSE)この式は、成り立っています。 「この時にもう1つ条件をつけて、A1のセルの値が1から20までの値に対して範囲を変えることはできますか。たとえばA1セルが1のときは、$F$1:$G$10ですが、A1セルが2のときの範囲は$F$11:$G$20、A1が3のときの範囲は$F$21:$G$30のように範囲はFとGと規則正しくタテ列に20種類あります、また、E列は1から1000のセルがあって計算式をコピー します。」わかりましたら、計算式を書いてお教えください。

  • エクセルでの一括計算方法がありましたら教えてください

    A2~A60の1列に数値が入っています。 その値すべてに 0.55を掛けた値を隣のセル B2~B60に表示したいのですが 一括でできる方法はあるでしょうか? 最終的には、B2~B60の数値に隣のセルC2~C60の値を掛けた数値をD2~D60に表示したいのですが。。 1セルごとに関数を入れる以外に方法があれば と思って質問しました。 ご存知の方がいらっしゃいましたら ご指導 よろしくお願いします<(__*)>

  • excel マクロで行番号の取得方法

    マクロ初心者です どうしてもできません お願いします! 集計合計値が記入されている行を(例えば、(c5:g5))をコピーをしてday関数を使って得たセルの値を取得してその値を行番号にして、例(k□)として貼り付けし、一日づつ(日付どうり)下にずらして貼り付けしていきたいのですがどうしてもできません また この式を利用して 日にちを集計表のファイル名として保存したいと思っています ご教授宜しくお願いします

  • エクセルで計算結果の最適を簡単にもとめたい。

    エクセルの表を使い多くの変数で計算するとき、計算結果を ある値に近つけたいときがあります。 たとえばA1セル、A2セル、・・・・・・・と変数が入っていて、その 計算結果をG1セルに入っている。 G1セルの答えが100になるA1セルの値は、いくつか?とか」です。 いまのやり方だと。まず、A1セルに適当に2を入れてみる。次に A1セルに3を入れてみる。そうすると2の方が近いので、今度は、 2.2をいれる、とかしていったりきたりして、2.33とかの答えを 求めています。 他の方法として、計算の表をたとえば10個作って、A1セルとG1セル の10個の値を表にして、10個分まとめて計算させる」とかが考えられ ますがこれも表がおおきいとあまり賢い方法とは思えません。 マクロを使わずにいい方法があれば教えてください。 マクロを使わないとできないなら、マクロの使い方から教えて いただきたく。(たとえばここのサイトを見ればいいよ」とかでも OKです。

  • エクセルの関数について

    エクセルの関数について教えて頂きたいです。 業務でエクセル(2000)で作成してある集計表があります。 その集計表の数値を別BOOKに反映させたいのです。 セルA1を検索値として、セルB1とセルB2の値を返す関数はありますでしょうか? 集計表の行数は約500行、並びはランダムでセルC1を検索値としてセルC2の値を返す 箇所もあります。一つの値を検索値として二つの値を返すことが出来ずに困っています・・・ 宜しくお願いします。

  • エクセルの計算式VLOOKUPを再度教えてください!

    再度,質問いたします、わかりましたら、教えてください。 エクセルの計算式でE1のセルに次の計算式があった時に =VLOOKUP(B1,$F$1:$G$10,2,FALSE)この式は、成り立っています。 「この時にもう1つ条件をつけて、A1のセルの値(20種類の値が、ある時)に対して範囲を変えることはできますか。たとえばA1セルが50という値のときは、$F$1:$G$10の範囲ですが、A1セルが130と言う値のときの範囲は$F$11:$G$15、A1が201のときの範囲は$F$16:$G$25を指定のように範囲を変えられますか?FとGに範囲が20種類タテにあります。H1からH10のセルは50という値、H11からH15のセルは130という値,H16からH25のセルは201と言う値があります。AからE列は1から1000のセルがあってE列は計算式をコピーします。」わかりましたら、計算式を書いてお教えください。

  • Excel での計算

    EXcelを初めて使用する初心者です。 Excelを使用し、次のような式を計算する場合、「数式バー」に入力すれば計算出来ることは、承知しているのですが、「セル」に入力し保存、必要な時に数式の一部だけを変更し計算する事は出来ますか?            ( A-( B÷C ×D + E + F +G ))  上式で、A,B,C,E,F,Gは定数(変更しない数値)で、Dを毎回変更するということが出来ますか?(そもそも「セル」に入力出来ますか?)

  • エクセル2000:IF関数?のこんな使い方をご教授ください。

    よろしくお願いいたします。 次のような場合、セル「B1」に入れる関数を教えてください。 ◇セルA1に、数値、「1」以上の数値が入っている場合、セル「B1」にそのA1の値を、 ◇セルA1の値が1以上の数値でないとき(A1が「0」だったり、文字だったり、スペースだったりするとき)は、「B1」には 空白(”” ? 要は空っぽの状態)を返したいのです。 IF関数を使うような気がしますが、それ以上は、ひらめきません。 どうか、ご教授くださいませ。

  • EXCELでSUMIFがうまく出来ない

    EXCELでSUMIF関数を使って、集計したいのですが以下の2つの文字列(数字)が認識できず正しい結果になりません。 2つのセルでそれぞれ ”88505180000200200”と”88505180000200250”を入力しているのですが、関数では同じ値とみなして集計してしまうようです。 該当セルの書式設定は文字列で、!の「数値が文字列として保存されています」が出て、 「数値に変換する」を選ぶとどちらも”88505180000200200”になってしまいます。 何かよい方法がないでしょうか?