重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

日付順に並んだシート「項目0301」~「項目0303」があり、このシートは毎日1シートが追加されます。追加されるシート内の合計行B3:F3をコピーし、シート名「項目別一覧」のA列の日付と一致した行の日計セルへ貼り付ける記述をどのようにしたらよいか悩んでいます。
コピー元シートの「項目+日付」は毎日「項目別一覧」シートの右側へ追加される点と、
コピー先のシート「項目別一覧」のA列の日付行も毎日追加しなければいけない点、
で先に進めません。全体を通してどのような記述をしたらよいかご教授いただけませんでしょうか。
よろしくお願いいたします。

「他のシートから値をコピーし、追加した行へ」の質問画像

質問者からの補足コメント

  • ありがとうございます。
    コピー元のシート名「項目0303」を西暦「項目02210303」に変えた場合、記述上何処を変更すればよいでしょうか?
    お時間のある時、ご教授いただけませんでしょうか。
    よろしくお願いいたします。

    No.3の回答に寄せられた補足コメントです。 補足日時:2021/03/11 10:43

A 回答 (4件)

#3です。


西暦を入れた場合、
qdate = Format(Year(Date) & Replace(Sheets(shIndex).Name, "項目", ""), "####/##/##")を
qdate = Format(Replace(Sheets(shIndex).Name, "項目", ""), "####/##/##")とすればよいです。

朝走り書きのように書いてしまったのですが、Weekdayは日付にならない値を入れるとエラーが返ると思いました。例えば7桁だったり、スペースが入っていたり、、、エラー処理を加えるべき処理になります。

添付画像を拝見するとA1セルに日付が入力されているようですね。
このA1セルの入力を必ずする。又は、日付入力を確認して実行するように組み立てるのが良いでしょう。
その場合、
qdate = Format(Replace(Sheets(shIndex).Name, "項目", ""), "####/##/##")は不要になり下記のようになります。
#3のプロシージャでまず、不要(変更)になるコードです
上から順に

qdate = Format(Year(Date) & Replace(Sheets(shIndex).Name, "項目", ""), "####/##/##")
wkday = "(" & WeekdayName(Weekday(qdate), True) & ")"


Sheets(shIndex).Activate すでにあるのでこの下から
With ActiveSheet
If IsDate(.Range("A1")) Then
wkday = "(" & WeekdayName(Weekday(.Range("A1")), True) & ")"
qdate = Format(.Range("A1"), "M月D日") & wkday
Else
MsgBox ("A1セルの日付入力がされていません。")
sh.Activate
Exit Sub
End If
End With
’ここまで
With Worksheets("項目別一覧")すでにあるのでこの上に

更に
.Cells(lastRow, "A").Value = Format(Replace(Sheets(shIndex).Name, "項目", ""), "##月##日") & wkday 


With Worksheets("項目別一覧")すでにあります

.Cells(lastRow, "A").Value = qdate

For i = 2 To 6 すでにあるこの上に

これで右隣に作成されたシートのA1セルに日付データがあれば実行され
無ければメッセージボックスが表示され処理がキャンセルされます。

注意、項目別一覧シートの右隣にシートが無い場合は、エラーが出力されますので場合によっては対策が必要です。

A1セルの値を使うかシート名を使うかの判断は、運用を考慮して検討されてくださいね。
ご不明な点は、補足をしてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。走り書きでかけるなんて素晴らしい。私は1行ずつ凝視しています。

お礼日時:2021/03/11 18:03

おはようございます


#1です。自身の回答を読み返すと背景を理解せず少々横柄に感じました。
言いたい事は変わらないのですが、ご質問の躓きを解消していかなくてはならないでしょう。
一連のやり取りを考えると短期間でコードを理解して組み立てるのは難しいと思います。昨日回答したプログラムを少々いじったものです。
出勤しなくてはならないので時間がなくしっかりとした検証をしていませんが、項目別一覧シートの右隣のシートを対象にしています。
なので初めの3シートは順次位置を変え実行してください。その後、新しいシートを追加する度に実行します。(シート追加位置は項目別一覧シートの右隣です。)問題があれば補足してください。

Sub aa()
Dim i As Long, n As Integer, shIndex As Integer
Dim sh As Worksheet
Dim qdate As String, wkday As String
Dim lastRow As Long
Set sh = ActiveSheet
lastRow = Worksheets("項目別一覧").Cells(Rows.Count, "A").End(xlUp).Row + 1
If lastRow < 4 Then lastRow = 4
shIndex = Worksheets("項目別一覧").Index + 1
Sheets(shIndex).Activate
qdate = Format(Year(Date) & Replace(Sheets(shIndex).Name, "項目", ""), "####/##/##")
wkday = "(" & WeekdayName(Weekday(qdate), True) & ")"
With Worksheets("項目別一覧")
.Cells(lastRow, "A").Value = Format(Replace(Sheets(shIndex).Name, "項目", ""), "##月##日") & wkday
For i = 2 To 6
.Cells(lastRow, 2 + n).Value = Sheets(shIndex).Cells(3, i).Value
If lastRow = 4 Then
.Cells(lastRow, 3 + n).Value = .Cells(lastRow, 3 + n).Offset(, -1).Value
Else
.Cells(lastRow, 3 + n).Value = .Cells(lastRow, 3 + n).Offset(, -1).Value + .Cells(lastRow, 3 + n).Offset(-1).Value
End If
n = n + 2
Next
End With
sh.Activate
End Sub

タイムリミットなので取り敢えず。
この回答への補足あり
    • good
    • 1

シートの追加・編集が終わったらシートインデックスを用いて右から順にシート名を取得・加工し「項目別一覧」のA列に上書きしつつ、同時に日毎の値を代入、累計列は既出のSUM関数を代入した後に値に変換で宜しいようにも思います。


毎月全ての日毎のシートがあればシートインデックスを基にして行を決められるので、A列の値との照合検索は必要ないでしょう。
けど確か平日限定でしたよね?
なので存在しているシートを利用するのが宜しいのでは?と初級レベルなジジィは思いました。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2021/03/11 18:03

こんばんは、


VBAでのやり方は色々あります。
一例としては、(シートを作るタイミングで)シート名を取得して項目名を除いた数値と一覧表のA列の(曜日)を除いた値を共に比較できる値に加工して比較し該当した行に日付シートの該当行(3行目)を(B列より2ステップで代入)し、累計に関数SUMなどで4行目から該当行までを算出して.Value=.Valueとすればよいかな。。
コードを書く場合、3月1日(月)とあるセルの値は何ですか?
まんま文字列?書式&関数?など もし、曜日を入れるのなら、列を分けた方が良いかも

ただ、ご質問の問題点を解決するVBAを書いて又、次に出てくるであろう問題点の処理プログラムを書く形でつなげていった場合を想像すると、失礼かもしれませんが、ご自身でどうなっているか、少し変える時にどうすれば良いか分からなくなってしまうと思います。
出来上がったものは、おそらく毎日必要になる業務と思いますので、支障をきたす可能性もあります。
ここは、ひとまず立ち止まって考えてみてください。

多分、比較的簡単に出来るであろう提案としては、
ブックの形を変えないを前提にするなら、初めにすべての日にちシート、集計シートを作成しましょう。
一覧も参照先が決まっているのなら、VBAではなく数式や関数で該当シート、該当セルに入力します。
日々の入力は、該当日付のシートに行う。
VBAで処理しようとしている一連の作業は、あらかじめ表組みをして
数式を使用すれば実現可能と推察するとともにVBAでないと出来ない処理が無いように思います。都度シートを追加して行く部分は、確かに出来ないのですが、どこで区切るのか、1か月分なのか、4半期なのか1年なのか、、です、管理も分かり難くなるので1月単位でしょうか?
月の更新時も月日のセルを1か所入力すればすべてのシートの日付を変える事も出来るので出来上がった空のブックを複製して使えば取り敢えず3年ぐらいは良いのではないかと思います。

VBAで行う場合の提案としましては、
日々のデータが元になる訳ですから、データの抽出や分析などをしやすいように、1シートに纏めます。昨日のデータの下に今日のデータ、の下に、、の様にです。(添付図)

このシートは手動でフィルタをかけても日別などの集計やコピーして別シートに移して加工も比較的容易になります。
つまり、集計表などに項目別や時間帯別、曜日を設定していれば曜日別、天候を入力する項目を作れば天候別などなど出力できるようになります。
勿論、グラフを作成したり、予定在庫を推察するデータとして活用できるかも知れません。

VBAがハードルが高いようであれば、表組みを完成させ、数式(関数)で

VBAで作成するなら、入力シート、蓄積データシート、出力シート(フォーマットなど)を分けて、考えるのが整理し易いと思います。
一見、日別を確認するのが分かり難いと思うかも知れませんが、それもボタンをワンクリックですよね。

ごちゃごちゃ分かり難い事を長々と書きましたが、このままいかれるか、表組みをすべて作ってからVBAでやるか、数式でやるか、、はたまた再構築するか、、、何れに致しましてもタイミングがあれば、回答させていただきたいと思います。
大きなお世話でしたら、もう言いません。ごめんなさい。
「他のシートから値をコピーし、追加した行へ」の回答画像1
    • good
    • 1
この回答へのお礼

ありがとうございます。

お礼日時:2021/03/11 18:04

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