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

No.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セルの値を使うかシート名を使うかの判断は、運用を考慮して検討されてくださいね。
ご不明な点は、補足をしてください。
No.3
- 回答日時:
おはようございます
#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
タイムリミットなので取り敢えず。
No.1
- 回答日時:
こんばんは、
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でやるか、数式でやるか、、はたまた再構築するか、、、何れに致しましてもタイミングがあれば、回答させていただきたいと思います。
大きなお世話でしたら、もう言いません。ごめんなさい。

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) 【困っています2】VBA 追加処理の記述を教えてください。 2 2022/08/26 11:42
- Visual Basic(VBA) VBAを使いシート間で貼り付け 3 2023/03/14 20:53
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 集計シートA列のコードと一致する右に並んだシート名(コード)の3行目から10行目をコピーして貼り付け 4 2022/08/18 15:24
- Excel(エクセル) Excelの複数ファイルの複数行を別ファイル1つのシートにVBA、マクロで集約する方法 5 2022/09/13 06:30
- Visual Basic(VBA) 【部分一致した行を含む8行をシートにコピーする方法】 以下のような作業を行いたいのですが、どなたがコ 1 2022/08/30 16:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelマクロのエラーを解決した...
-
他のシートから値をコピーし、...
-
VBA 計算式で10%未満だったら...
-
VB:アクティブなシート以外で...
-
ユーザーフォームに入力したデ...
-
シート毎に別々のファイルに保...
-
実行時エラー'1004': WorkSheet...
-
エクセルで通し番号を入れてチ...
-
ExcelのVBAでのグラフ操作について
-
【ExcelVBA】全シートのセルの...
-
VBA 最終行まで数式をコピーする
-
XL:BeforeDoubleClickが動かない
-
特定の文字を含むシートだけマ...
-
VBA 存在しないシートを選...
-
ACCESS VBAで、エクセルファイ...
-
VBAで複数のシート名を置換する...
-
ExcelVBA シート名を複数セルか...
-
ACCESS VBAで作成済のExcelのコ...
-
シート名の一部を変更する方法...
-
エクセルVBA 別シート間の列の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
ユーザーフォームに入力したデ...
-
実行時エラー'1004': WorkSheet...
-
XL:BeforeDoubleClickが動かない
-
エクセルVBA Ifでシート名が合...
-
実行時エラー1004「Select メソ...
-
エクセルのシート名変更で重複...
-
【ExcelVBA】全シートのセルの...
-
VBA 存在しないシートを選...
-
ブック名、シート名を他のモジ...
-
Excel チェックボックスにチェ...
-
VBA 検索して一致したセル...
-
エクセルで通し番号を入れてチ...
-
シートが保護されている状態で...
-
【VBA】特定の文字で改行(次の...
-
ExcelのVBAのマクロで他のシー...
-
Worksheet_Changeの内容を標準...
-
EXCELVBAを使ってシートを一定...
おすすめ情報
ありがとうございます。
コピー元のシート名「項目0303」を西暦「項目02210303」に変えた場合、記述上何処を変更すればよいでしょうか?
お時間のある時、ご教授いただけませんでしょうか。
よろしくお願いいたします。