重要なお知らせ

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

【GOLF me!】初月無料お試し

日報のシートをマクロにて100枚コピーしています。それぞれのシート名は日報1日目、日報2日目、、、のように書いています。

①その100枚ごとの日報の日付を書く場所(C2)に入力があれば、別のシート名「日報チェック表」の日報提出チェック表の日報日の欄に自動で反映されるようにしたいです。曜日は関数で表示されるようにしているので大丈夫です。

②そして実際稼働日&日報未提出の日付欄には手打ちで日付を書いていくようにしているのですが、G列にはあってB列にはない日付の横には自動で「×」がつくようにしたいです。

現場ごとに日報シート100枚をマクロでコピーしてから書くので関数ではエラーになってしまいます。
マクロなどで出来る方法はないでしょうか?

「エクセル 100名のシートの自動反映 マ」の質問画像

A 回答 (4件)

以下のマクロを標準モジュールへ登録してください。


---------------------------------------------------------------
Option Explicit
Public Sub 日報チェック表集計()
Dim sh As Worksheet
Dim ws As Worksheet
Dim wday As Long
Dim row As Long
Dim sname As String
Dim pname As String
Set sh = Worksheets("日報チェック表")
sh.Range("B3:B103").Value = ""
row = 3
pname = ""
For wday = 1 To 100
sname = "日報" & wday & "日目"
Set ws = Worksheets(sname)
If ws.Cells(2, "C").Value = "" Then Exit For
sh.Cells(row, "B").Value = ws.Cells(2, "C").Value
row = row + 1
pname = sname
Next
MsgBox (pname & "迄集計完了")
End Sub
-----------------------------------------------
H列ですが、
H3へ
=IFERROR(IF(MATCH(G3,$B$3:$B$103,0),""),"×")
と記入し、オートフィルで下へコピーしてください。
    • good
    • 0
この回答へのお礼

お世話になっております!
長い間お世話になっているこの書類(ブック)もtatsu様のご教授で完成に近づいており、あとは私が元々入れていた計算式などをもっと簡潔にかつのちに追加入力があった時の対処などを考えて書き直すために調べているところです。
tatsu様の助けばかりで自分のふがいなさに濛々ですが、教えていただいたマクロややり方など別の書類作成時に必ず役に立たせるように頑張ります。ありがとうございました^^

お礼日時:2017/10/25 15:59

No3です。

一部訂正します。
H列は
H3へ
=IF(G3="","",IFERROR(IF(MATCH(G3,$B$3:$B$103,0),""),"×"))
としてください。
    • good
    • 0

こんにちは



直接の回答ではありません。

>日報シート100枚をマクロでコピーしてから書くので関数ではエラーになってしまいます。
シート名は決まっているようなので、例えば、集計用のシート内に作業用として各シートのC2だけ抜き出した表を作成しておいて、チェック表はそれを参照して作成するようにすれば、関数だけでも問題なく処理できるように思います。
(関数内でエラー処理を行う必要はあるかもしれませんが…)

ご提示の図だとチェック表を2種類作成しているようですが、同じ内容にしか見えませんね。
例えば右側の表にすべての日にちが並んでいるものとして、存在するものを〇しないものを×表示するだけでも事足りるように感じられます。
場合によっては提出(あるいは未提出)の表示色を変えるとか(条件付き書式等)すれば、さらに識別しやすくなるのかも知れません。

仮にご質問の通りマクロで処理するにしても、
>日報シート100枚をマクロでコピーして~~
とのことですので、そのマクロで同時に各シートのC3の値をチェックすれば済みそうに思いますが・・?
コピーの処理を、1シートずつ順に行っているのなら、そのループ内でC3セルを参照すればよいですし、まとめてコピーしているのなら、その後で
 For Each sht In Worksheets
  If sht.Name <> "日報チェック表" Then
    ~~~~~~
    ~~~~~~
のような処理を行えば、各シートを順にループすることができます。


※ 作成した表を、どのような使い方をするのかがわからないので、勝手な印象で書いていますが、的外れでしたらスルーしてください。
    • good
    • 0
この回答へのお礼

あなた様のおっしゃる通りですね^^:
エクセルがまだ若輩者の自分に重要な書類つくりを頼まれてあたふたしていまして、もっとわかりやすくかつ簡潔な表を早く作れるようになりたいです・・
ご意見してくださりありがとうございました!

お礼日時:2017/10/25 15:54

エラーが出るならエラー処理を関数で行えば良いだけ。


そこにマクロが出てくる意味が分からない。

Excel2007以降を使っているなら
 IFERROR関数
が使える。
これはとても便利で、
 IFERROR( 数式または数値 , 数式または数値がエラーの場合の値または数式 )
と2つ引数を指定するだけです。
VLOOKUP関数やMATCH関数を使って一致する値がない場合はエラーになるので
エラーになったときの処理を簡単に記述できる。

てことでマクロには、G列に入力をしたらその後マクロを実行したかが分かるような工夫をするだけで良い。
(G列入力中はH列のセルが薄い青色で塗りつぶされ、マクロを実行したら塗りつぶしが解除される…など)


・・・余談・・・
>曜日は関数で表示されるようにしているので大丈夫です。
関数不要なんだよなあ。
セルの表示形式のユーザー書式で"(aaa)"を指定するだけなんだよね。
だから曜日の列、たとえばC2セルなら
 =B2
とするだけでいい。
ただしB列は”年”を含めた「日付」である必要がある。
”年”を表示したくないときはB列に対してセルの表示形式のユーザー書式で”m月d日”を指定すれば良い。

日報云々という事なので”年”情報を含ませることを勧めます。
    • good
    • 0
この回答へのお礼

詳しく回答してくださってありがとうございました!
エクセルの集計や管理に対しての日付の書き方などとても勉強になりました。
まだまだ使い下手の私には教えてくださって感謝いたします。

お礼日時:2017/10/25 15:52

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