- 締切済み
エクセル 応用
A列 B列 C列 D列 E列 F列 G列 1 数 数 平均 空白 平均のコピー 2 3 4 5 上のような形でA列には今日の売上(数字)B列にも今日の売上 C列にはA列とB列の同じ行の平均がでています。 D列は空白列です。 その平均を今日はE列にコピー貼り付け、次の日はA列とB列のデータを消去し、次の日のデータを打ち込み平均を次はF列に貼り付け、 その次の日はG列に貼り付け、その次の日はまた戻ってE列に貼り付けを毎日繰り返しています。このコピー貼り付けの作業でだいぶ時間がとられるので何かいい方法はないでしょうか? 色々関数を考えて見ても思いつきませんし、マクロでボタンをつくろうと試みましたが、なにぶんVBAの知識がほとんどなくてうまくできません。どなたかいい案があればぜひ教えて下さい。 お願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- tarinko_06
- ベストアンサー率24% (15/62)
行(商品かな?)毎に日付がバラバラなのですか? 例えば18日の売上があったとすると 1行目はE列。2行目はF列。3行目はE列。4行目はG列みたいな。 もし毎日全部の行が同じ列なら(今日は全部E列、明日は全部F列 明後日は全部G列、そのまた次の日は全部E列)まとめてコピーすれば良いだけです。 これなら30秒もかからないですよね? そうでないならマクロでやらないときついかもしれません。 もし、マクロでやるならどこかいらない列に前回コピーした列がどこかを記憶しておかないといけないでしょう。 どこまでコピーしていたのかわからくなってしまいます。 というか、これはマクロ以前の問題な気がします。この行はこの前ここに コピーしたなんて情報100行以上も覚えるのはさすがに人間技じゃ無理。 そこら辺はどうしているのですか? 私がマクロで作るなら1行更新ボタンと一括更新ボタンを用意して 前回コピーした日付と列、本日更新済みかどうか (5日にコピー済の場合"TE5"、コピー済みじゃない場合"FE5")をどこかに格納して 格納した列を非表示にします。 ちなみにブックを開いた時にチェックして前の日付ならTからFに戻します。 【1行更新ボタン動作】 ボタンを押したらアクティブセルの行を更新。もしその日に 既に一度更新されている場合はメッセージで確認。 更新(コピー)したら売上データ(A・B)は消去する。 売上データが入っていない場合はエラーメッセージ。 【一括更新ボタン動作】 本日更新されている分は考慮するかしないか メッセージで確認して、該当する全ての行を更新する。 何も入力されていない空白セルは更新しないで無視する。 更新(コピー)したら売上データ(A・B)は消去する。 ↑みたいな感じでいいんですか?それとももっと違う機能が必要なのですか??
- imogasi
- ベストアンサー率27% (4737/17069)
これなど典型的にVBAで処理すべき課題です。 それと売上数値を日が変わっては、前のデータに上書きするようだが ビジネスのデータ処理上、前の日のデータが消えてしまうというのは、おかしいやり方です。システム全体のことの経験不足のうちから、エクセルを弄くり回しているように見える。 また、本質問では、日付を横に流しているようだが、エクセルのやりやすいのは縦に流す方式であるjことを、頭においておくこと。 ーー 不可能の例 例データ A列 B列 C列 D列 E列 (1)3月1日 0 (2)A売上 B売上 平均 (3)10 20 15 15 ーー A1にはそれぞれの売上発表日を入れます(上書き、2日には3/2とA1に入れる) A3,B3には売上を入れる。 C3には平均を出す。 E3には =IF(COLUMN()-5=$A$1-"3/1",$C3,"") と入れる。この式は1日の日付で増加で1列右に動くようにしている。 この段階ではこれでよい。 3/2 日になった。A1に3/2を入れると、瞬間にE列だった15がF列に移る。 3/2日分の売上20,30をA,B列に入れると今度はF列にただしく 25が入る。しかしE列の15が残らない。 これはこの方法が、したいことに対し、仕組みが適当でないのだが、じゃあ適当な方法と言われても、根本的に質問の表組を変えないと良い方法はないだろう。 毎日1セルだけ式を消していけば(3月2日の日付けを入れる前に前日分E3を式を消して値化してしまう)、質問をかなえるようにはなる。しかし面倒だ。 やはり各日(A列を列挿入し)各行に日付を入れて)の売上を下の行に順次残す形で考えないとダメだろう。
#1です。 ゴメンなさい。123行目と書かれているので、1ヶ月分だけではないですね、 するとDAY(TODAY())は使えませんね。 > E~G列には123行目の平均のコピーが入っているとゆう状態です。 これが、123行のE~G列という意味なら E1に =IF(ROW()>=3,$C1,0) F1に =IF(ROW()>=2,$C2),0) G1に =$C3 として、下にコピー。 でも、本当はどんな表なんだろう...
#1です。だとするとまだ根本的な説明が足りません。 123行目のE列、F列、G列には何が入るのですか? 推理直を最大限発揮して、初心者さんが陥りそうなことを想像すると 2行目以降のE列、F列、G列には何も入らず、1行目のE列、F列、G列に 今日と前2日の平均を表示したいのでしょうか? 「今日」という時点を何で把握するのでしょうか? 単純には「今日」は「TODAY関数」で取得できます。 しかし、これと比較する対象が表の上に有りません。 行だけで日付を判断してよいなら、 もし、A列の前に各行のデータに対する日付が入っていて、 A列 B列 C列 D列 E列 F列 G列 1 数 数 平均 空白 2日前 1日前 今日 2 数 数 平均 空白 3 数 数 平均 空白 4 数 数 平均 空白 としてよいなら、 E1に =IF(DAY(TODAY)()>=3,INDEX(C:C,DAY(TODAY)())-2,1),0) F1に =IF(DAY(TODAY)()>=2,INDEX(C:C,DAY(TODAY)())-1,1),0) G1に =INDEX(C:C,DAY(TODAY)()),1) とします。 しかし、別の月に開くとうまく働きません。 そこまでするには、別の工夫が必要ですし、 ご質問の内容からだけでは、式が作れません。
A列 B列 C列 D列 E列 F列 G列 1 数 数 平均 空白 2 数 数 平均 3 数 数 平均 として、 E1に「=$C$1」 F1に「=$C$2」 G1に「=$C$3」 として、 1日目に1行目データを入力 2日目に2行目データを入力 3日目に3行目データを入力 4日目に1行目データを上書き入力 5日目に2行目データを上書き入力 6日目に3行目データを上書き入力 と繰り返していけばよいのでは?
補足
返事ありがとうございます! すみません…ちょっと説明が足りなかったです… データは100行以上打ち込んでおりまして… なのでA~C列内に別の日のデータを入れるって事はできないんです。A~C列はその日のデータで基本、埋め尽くされます。 なので例を上げると 123行目のデータのC列は A123 と B123 の平均で、E~G列には123行目の平均のコピーが入っているとゆう状態です。 説明不足ですみませんでした。