• 締切済み

エクセル(マクロ)で累計部分を更新しながらシートを

日報作成をマクロで自動化する方法を探しています。 とりあえずできたのは、 1:「1日」シートを作り、セルA1には日付「2015年9月1日」を入力。 2:「1日」シートをコピーして「2日」シートを作成し、セルA1の日付を「2015年9月2日」に変更。 3:2の作業を「31日」シートまで繰り返す。 というところまでです。 (1つのワークブックに、「1日」~「31日」までのシートがある状態です。) これに加えて、たとえば、セルB1に当日売上を入力すると、 セルB2に月累計が出るようにしたいのです。 試してみたのは、「1日」シートのセルB2に「=B1」と入力し、 「2日」~「31日」シートのB2に =INDIRECT(TEXT(A1-1,"1日")&"!B2")+B1 と入力してみましたが、これだと月累計ではなく「1日」シートのみとの合計になってしまい、 「3日」~「31日」シートでは、数式内のシート名"1日"の部分を 手動で更新していかなければなりません。 数式内のシート名を翌日の日付に変更しながらシートをコピーする方法はありますか? または、 B2=前日シートのB2+当日シートのB1 となる数式は無いでしょうか?? ちなみに今マクロで使っているのは下記のコードです。 ——————————— Sub 日報作成() Dim firstDay As Date firstDay = InputBox("日報", "最初の日付を指定", Date) '最初のシートの日付を指定 Worksheets("1日").Range("A1") = firstDay Dim i As Integer For i = 1 To 30 Worksheets("1日").Copy after:=Worksheets(Worksheets.Count) '1日のコピーを末尾に作る Worksheets(Worksheets.Count).Name = i + 1 & "日" 'コピーしたシートの名前を変える Range("A1").Value = DateAdd("d", i, firstDay) '日付を一日ずつ足していく Next i End Sub ――――――――――― 似たようなデータを毎月大量に作るので、どうにか効率化できたらと思っています。 ちなみに、わたしはプログラミングCを少しかじったことがありますが、 マクロを使うのは初で、上記もネットで見つけたコードを少しいじった程度です、、 詳しい方がいらしたら教えてください。 よろしくお願いいたします。

みんなの回答

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

sub macro1()  dim w as worksheet  dim i as integer ’クリンナップ  application.displayalerts = false  for each w in worksheets   if w.name <> "1日" then    w.delete   end if  next  application.displayalerts = true ’シート1日の準備  worksheets("1日").range("A1") = date - day(date) + 1  worksheets("1日").range("B2").formula = "=B1" ’シートの展開  for i = 2 to day(dateadd("M",1,range("A1") - 1))   worksheets("1日").copy after:=worksheets(worksheets.count)   range("A1") = range("A1") - 1 + i   activesheet.name = i & "日"   range("B2").formula = "=" & i - 1 & "日!B2+B1"  next i end sub このマクロで各シートB2に記入される関数式を見てわかるとおりですが,マクロを使うなら直接欲しい数式を書かせてしまった方が簡単です。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

 月累計を求めるためのワークシート関数に関してですが、当日のB1セルに値を入力した場合にのみ、前日のB1セルの値に、当日のB1セルの値を加算するというやり方では、もし途中のシートにB1セルが未入力となっているセルが存在した場合、そのシートよりも後のシートのB2セルの値には、そのシートよりも前のシートのB1セルに入力されている分が反映されなくなってしまいます。  ですから、B2セルに入力する関数は足し算ではなく、SUM関数の串刺し計算にされた方が良いと思います。 【参考URL】  Excel 複数シートのデータを集計、串刺し演算 3D参照~Excelの達人技   http://kokodane.com/tec2_38.htm  複数のシートの同じ位置にあるセルまたはセル範囲に対する 3-D 参照を作成する - Office Support   https://support.office.com/ja-jp/article/%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AE%E5%90%8C%E3%81%98%E4%BD%8D%E7%BD%AE%E3%81%AB%E3%81%82%E3%82%8B%E3%82%BB%E3%83%AB%E3%81%BE%E3%81%9F%E3%81%AF%E3%82%BB%E3%83%AB%E7%AF%84%E5%9B%B2%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B-3-D-%E5%8F%82%E7%85%A7%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-40ca91ff-9dcb-4ad1-99d2-787d0bc888b6  それで御質問のマクロに関してですが、まず、 >1:「1日」シートを作り、セルA1には日付「2015年9月1日」を入力。 に関しては、「1日」シートは雛型ですので手作業で作成して頂いた方が良いと思います。  ですから、下記のマクロは「1日」シートが既に存在している状態で起動させる様にして下さい。  尚、下記のマクロでは、「1日」シートのA1セルに入力されている日付の月に合わせて、他のシートのA1セルの日付も自動的に変更される様になる"ワークシート関数"を、各シートに入力する様になっておりますので、下記のマクロを使って1度2日~31日のシートを作成してしまえば、後はファイルをコピーしてから、B1セル等に入力済みのデータを消去し、「1日」シートのA1セルに入力されている日付を変更するだけで、他の月用のファイルを作成する事が出来ます。 Sub QNo9043435_エクセルマクロで累計部分を更新しながらシートを() Const EndWord As String = "日", DateCell As String = "A1" _ , InputCell As String = "B1", CumulatCell As String = "B2" Dim FirstSheet As Worksheet, i As Byte, _ DateCellRC As String, InputCellRC As String DateCellRC = Range(DateCell).Address(, , xlR1C1) InputCellRC = Range(InputCell) _ .Address(, False, xlR1C1, , Range(CumulatCell)) If IsError(Evaluate("ROW('1" & EndWord & "'!A1)")) Then MsgBox "シートのレイアウトの雛型として設定されている" _ & vbCrLf & vbCrLf & 1 & EndWord & vbCrLf & vbCrLf & _ "というシート名のシートが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "存在しないシート" Exit Sub End If Set FirstSheet = Sheets(1 & EndWord) With Application .ScreenUpdating = False .Calculation = xlManual End With For i = 2 To 31 If IsError(Evaluate("ROW('" & i & EndWord & "'!A1)")) Then FirstSheet.Copy After:=Sheets(i - 1 & EndWord) ActiveSheet.Name = i & EndWord ActiveSheet.Range(InputCell).ClearContents End If With Sheets(i & EndWord) With .Range(DateCell) .FormulaR1C1 = "=IF(ISERROR(1/(DAY('1" & EndWord & "'!" & _ DateCellRC & ")/(""1904年1月""&REPLACE(CELL(""filename"",RC)" _ & ",1,FIND(""]"",CELL(""filename"",RC),FIND("".xl""," & _ "CELL(""filename"",RC))),)))),"""",(TEXT('1" & EndWord & "'!" _ & DateCellRC & ",""yyyy年m月"")&" & "SUBSTITUTE(RIGHT(" & _ "CELL(""filename"",RC),3),""]"",))+0)" .NumberFormatLocal = "yyyy""年""m""月""d""日""" End With .Range(CumulatCell).FormulaR1C1 = _ "=IF(ISNUMBER(" & InputCellRC & "),SUM('1" & EndWord _ & ":" & i & EndWord & "'!" & InputCellRC & "),"""")" End With Next i With Application .Calculation = xlAutomatic '計算モードを自動に切り替え .ScreenUpdating = False 'モニター表示の更新を行う End With End Sub

  • shintaro-2
  • ベストアンサー率36% (2266/6244)
回答No.2

>=INDIRECT(TEXT(A1-1,"1日")&"!B2")+B1 何か勘違いをされていませんか? text関数で日付の出力形式を指定するのは"d"か"dd"です。 ”1日”なら、どの日付でも戻り値としては1日になります。 関数でやるのなら =INDIRECT(TEXT(A1-1,"d")&"日!B2")+B1 となるはずです。

  • dogs_cats
  • ベストアンサー率38% (278/717)
回答No.1

月初に月末分のフォームをコピーし、累計式をB2に挿入する事で良いのですよね。 月の月末日は変動するのでinputboxの日付から当月の日にちを取得する。変数Days for~nextは1日目は不用なので2から開始。 inputboxは1日以外でも一日を表示するようにしました。 Sub 日報作成() Dim firstDay As Date Dim i As Integer Dim Days As Integer firstDay = InputBox("日報", "最初の日付を指定", DateSerial(Year(Date), Month(Date), 1)) '最初のシートの日付を指定 With Worksheets("1日") .Range("A1") = firstDay .Range("B2").Formula = "=B1" End With Days = Day(DateAdd("m", 1, firstDay) - 1) For i = 2 To Days Worksheets("1日").Copy after:=Worksheets(Worksheets.Count) '1日のコピーを末尾に作る Worksheets(Worksheets.Count).Name = i & "日" 'コピーしたシートの名前を変える Range("A1").Value = DateAdd("d", i - 1, firstDay) '日付を一日ずつ足していく With Worksheets(i & "日") .Range("B2").Formula = "=B1+" & i - 1 & "日" & "!B1" End With Next i End Sub 31枚ものシートを作成するのは得策とは思えませんが。 データ量はそんなに多いのでしょうか。1枚のシートで纏められるものは纏める。 累計計算が思ったように出来ないのは1シートで無いからです。 工夫すれば1ケ月分を1シートにする事は出来ますね。

関連するQ&A

  • エクセル内の数式を反映させながらシートをコピーする方法

    エクセルのシートのコピーについて教えて下さい。 1日1シートで表計算できる表を作るよう指示されました。 シート内には、累計を出すように(前日までの合計)+(本日の数字) の数式が入っています。 具体的に書きますと、セルA1に本日の数字を入力。 セルB1に(前日までの合計)+(本日の数字)と数式を入れました。 数式でいうと、例えばシート3のセルB1には(シート2:B1)+A1 シート4のセルB1には(シート3:B1)+A1 という具合にセルB1には前日までの合計を反映させるように、常に 前シートの累計をリンクさせています。 シートをコピーしては、セルB1の数式「前シート」部分を修正して こつこつシート7まで作ったのですが、30日分作って欲しいと 言われて困っています。 時間がたくさんあればこつこつ続けて完成させるのですが、就業上の 問題があってこれにずっと時間を割くことができません。 説明が長くなりましたが、ここで教えて頂きたいのです! 数式を反映させながら、シートをどんどんコピーする方法は ありませんでしょうか? 今、シート7まで作ったので、まんまコピーして7枚ずつ増やす 事は簡単ですが、累計部分の(前シート:B1)シートのリンクが 勝手には直ってくれません。 コピーすると同時に、前シートのリンクも直ってくれる方法が あればぜひ教えて下さい。 よろしくお願いします。

  • EXCELのシート間でのマクロ計算

    毎日の日報をEXCELのワークシートで作成しております。日報は、その「日」の売上とその「月」の売上(累計)を出すようにしております。月の売上(累計)は、前日の売上のシート(前日分)+本日の売上のシート(本日分)で表しております。日報は、項目がたくさんあるので、月売上を出す場合、シート間での毎日の計算作業が面倒です。ですから、この計算作業をマクロで出来ればと思っております。1つのシートでマクロを使用することは解るのですが、シート間でマクロを利用するやり方がわかりません。 なにとぞ、よろしくお願いいたします。

  • シート名を計算式に反映させる方法

    お世話になります。 エクセル2003で、毎日の日報を作成しており、日ごとに1シートを使用しています。B1セルには日付が入り、シート名はその日付と連動させています。その中で、当日までの売り上げの累計欄があり、その計算方法は串刺し計算で、日々のシートの前後に「Top」と「End]というシートを作り、例えばA1セルに当日の売り上げを入力するとすれば、A2セルに「=SUM(Top:End!A1)」と入力して、「Top」から「End」の合計を出しています。 ところがこの方法では、日付を遡って日報を出したい場合は、Endシートまでの合計が、遡った日付のシートでも計算されてしまうので、これを解決しようと思い、B1セルの日付データを使って =SUM('Top:text(B1,m月d日)'!A1) と入力してtopシートから当日までの串刺しをしようとしてみたのですが、=SUM('Top:[text(B1,m月d日)]text(B1,m月d日)'!A1)という式に自動的に変わってしまいできません。どのようにすればよいのでしょうか。マクロは使わない方向で、できればよろしくお願いいたします。

  • Excelシートの自動コピーでマクロを使いたい

    表題通り、Excelシートの自動コピーをマクロを使って行いたいのですが、 マクロやVBAの知識が全くないため、どなたかコードを教えていただけないでしょうか。 まず今現在、B1セルに9月1日と日付を入れ、シート名を1日としたものがあります。 これを自動で複製して、B1セルの日付を9月2日 9月3日… シート名を2日 3日…となるように、日毎ごとの一ヶ月分のシートを作り ひとつのbookにしたいと考えております。 また、その際に、B1セルとシート名の日付が日曜・祭日に当たる場合、 シート名に色を付けたいと思っています。 (因みにB1セルの日付はシリアル値で入れていて、 書式で○月○日となるように表示していて、日付が日曜・祭日に当たる場合は 赤文字になるよう、別シートに祝日リストも作って 条件付き書式で設定してあります。) Excelの関数は使えても、マクロは全く分からないので どうかよろしくお願い致します。

  • エクセルの営業日報で累計を残す方法

    エクセル初心者です。 エクセルで一か月分の営業日報をつくりました。 当日売上と当月累計等が横並びになっていてるものです。 シートを1枚作り、1日を31日までコピーし、1,2,3,4~31となっています。 完成した日報の累計は串刺し算でもとめています。   例:売上累計は=SUM(Start:End!A1) この計算だと、たとえば15日まで記入した場合、10日の売上累計を確認したくても 1~31すべての累計が同じ数字になっていて見返すことができません。 毎日の累計を残したい場合はどのような対策が有効でしょうか?? ※マクロも少し(シートを「1」作り、シート名「1」~「31」でコピー)だけですが挑戦しました(汗)

  • エクセルで前シートを参照して累計金額をだしたい。

    エクセルで現場ごとに日報を作成しています。 (現場単位で、2~3ヶ月で1つの日報ファイルを作成しています) 1日1シートで作成し、シート名は日付(例:1月2日なら「0102」)でつけています。 毎日かかった経費と、その日までの合計(累計)の経費をだしたいと思っています。 その日の金額(A1)に、前日までの累計の金額(一つ前のシートのA2)を足して、その日までにかかった経費を(A2)に表示させたいと思い 色々と調べて以下の方法にたどり着きました。 名前の定義に「前シート」として、参照範囲に 「=MID(INDEX(GET.WORKBOOK(1)&T(NOW()),GET.DOCUMENT(87)-1),FIND("]",INDEX(GET.WORKBOOK(1)&T(NOW()),GET.DOCUMENT(87)-1))+1,31)」を入力し 累計を求めたいセル(A2)には 「=INDIRECT("'"&前シート&"'!A2")+A1」と関数を入れました。 これで一応でるようにはなったのですが、エクセルを閉じて、再び開くと A2には「#NAME?」と表示されてしまい また名前の定義を設定し直さなければなりません。 私一人が使うわけではなく年配の上司も見るので、できれば開くたび、数字が表示されるようにしたいのですがどうすればよいでしょうか? ちなみに、他の名前の定義を使用している関数については、再び開いても数字が表じされています。 あともうひとつ・・・名前の定義以外で同じように累計を計算する関数はありますか? よろしくお願いします。

  • Excelマクロについて(セルのコピー)

    今、マクロで自動的にセルのデータを別シートに貼り付けるというものを作っています。 Private Sub コピー定義() Worksheets("sheet1").Activate 'sheet1をアクティブにする コピー元行 = 2 コピー先行 = 1 コピー元セル = "A" & コピー元行 コピー先セル = "A" & コピー先行 Worksheets("sheet1").Range(コピー元セル).Copy _ Destination:=Worksheets("sheet2").Range(コピー先セル) End Sub これで、sheet1のA2からsheet2のA1にコピーできるのですが、 Private Sub コピー定義() Worksheets("sheet1").Activate 'sheet1をアクティブにする コピー元行 = 2 コピー先行 = 1 コピー元行 = 2 コピー先行 = 1 コピー元セル = "A" & コピー元行 コピー先セル = "A" & コピー先行 コピー元セル = "B" & コピー元行 コピー先セル = "B" & コピー先行 Worksheets("sheet1").Range(コピー元セル).Copy _ Destination:=Worksheets("sheet2").Range(コピー先セル) End Sub とすると、B2の項目しかコピーされません。複数のセルを一度にコピーするマクロの作り方をご存じの方、ご伝授下さい。

  • エクセルのマクロについて質問です。

    エクセルのマクロについて質問です。 マクロを発動した時に、あるセルに入力してある数値を参照し、その行のX列目に数値を張り付けるものを作成しようとしています。 例えば シート「1」の A1に日付を入力 B1にある数字を入力 シート「2」の A列にA1→1~A31→31の日付が入力されている時 マクロ発動時にシート「1」A1の日付と一致する シート「2」のB列にシート「1」のB1の値を貼り付け ↑たとえばシート「1」のA1が1日でB1が500だった場合 シート「2」の1日(A1)と同じ行でB列(B1に500を 貼り付けるものです。 かなり下手な説明だと自覚しておりますが、解読できる方 どうかご教授ねがいます。

  • エクセル2000のマクロにおける、複数シート間のコピー&ペーストについて

    閲覧ありがとうございます。 現在、エクセル2000(OS、WIN2KPRO)を用いて、以下のような仕様のマクロを組もうとしています。 1.Sheet1のCommandButton1から実行する。 2.Sheet2のA1セルから、O?セルまでのデータの入っているセルをコピーし、Sheet1のB4セル以下にペーストする。 3.O?セルの?は1000以下の値で変化する。 4.Sheet2のF列には、ユニークキーが入力される為、必ず値が入力されている。 上記の仕様に従い、以下のようなマクロを組みましたが、 > Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Select のラインでエラーが発生します。 激しく独学の為、汚いソースですみません^^; **************************************** Private Sub CommandButton1_Click() Worksheets("Sheet2").Select Worksheets("Sheet2").Activate Dim Line_Num Line_Num = 1000 - WorksheetFunction.CountBlank(Range("F1:F1000")) Worksheets("Sheet2").Range("A1").Select Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Select Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Copy Worksheets("Sheet1").Select Worksheets("Sheet1").Activate Range("B4").Select ActiveSheet.Paste End Sub

  • Excelで違うシートから日付を引っ張ってきたい

    すいませんが教えてください。 EXCELでAのシートとBのシートがあって、 Aのシートに日付を入力していきます。 その日付をBシートに引っ張ってきたいのですが、 ='Aシート'!A2 とBシートのA2に入れると Aシートの空白セルでは 「1月0日」となってしまいます。 空白セルは同じように空白セルにしたいのですが、 やり方がわかりません。 よろしくお願いします。

専門家に質問してみよう