• ベストアンサー

EXCELで日報作成

今日は何の仕事をしたかという表をEXCEL2000で作っています。 シートが2枚がありまして、sheet1の、A列に作業名(20個ほど)、 1行目に日付(1日~31日)があります。 sheet2のA列に日付(例:8月16日)、B列に作業名(例:あ)、 C列に時間(例:3:00)と入れたら、sheet1の該当箇所に時間が 自動的に入るようにしたいのですが、どうやっていいかわからず 途方にくれています。 質問の仕方が悪いかもしれませんが、どうかご協力お願いします!

質問者が選んだベストアンサー

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.6

Sheet2の日付は日付形式と決めて作っていました。今回は数値としています。(入力を考えて) 30日に0:00が表示されるのは、日付形式と決めていたことと、別のデータを入力して消去した場合、C列が時刻形式のため、UsedRangeがクリアされないためのようです。作った時には行を削除していたので気が付きませんでした。(UsedRangeを使ったのは、連続して入力していない場合の対応です) 下記マクロは、日付を数値入力にして未入力セルは読み飛ばしています。 Private Sub Worksheet_Activate()   Dim rg2 As Range 'Sheet2のセル(日付)   Dim rg1 As Range 'Sheet1のセル(作業名)   Dim myRow As Integer '出力セルの行   Dim myColumn As Integer '出力セルの列   Range("myData").ClearContents '出力範囲をクリア   With Worksheets("Sheet2")     'Sheet2のA列の入力値を順に調べる     For Each rg2 In .Range("A2:A" & .UsedRange.Rows.Count)       If rg2 <> "" Then '入力されている場合(***追加***)         myColumn = rg2.Value '出力列(***訂正*** 日付は数値入力)         For Each rg1 In Range("mySagyo")           If rg2.Offset(0, 1) = rg1 Then             myRow = rg1.Row - 1 - 0: Exit For '出力行           End If         Next         Range("myData").Cells(myRow, myColumn) = Range("myData").Cells(myRow, myColumn) + rg2.Offset(0, 2) '時刻       End If '(***追加***)     Next   End With End Sub 色々とご迷惑をかけました。試してみて下さい。

usajun
質問者

お礼

こちらこそ、長い間色々とご迷惑をおかけしました。 無事に出来ました。 感謝してもしきれません。 本当にありがとうございました!!!!

その他の回答 (5)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.5

>sheet2で2日と入れたとしてもsheet1の1日のところに入ってしまいます。 行を操作しているところは、  myColumn = Day(rg2.Value) '出力列 ですが、これがずれるとしたら・・・ (3)時間を入れる範囲を時刻の表示形式にして、全体に『myData』の範囲名を付けます。 とお願いした『myData』の範囲の確認をして下さい。 この範囲の最初(左上セル)は日付の1日のセルの1つ下にします。1つ左にずれているような気がします。

usajun
質問者

お礼

何度も何度も済みません。 こういう表だったとして、   1  2  3 あ /  /  / い /  /  / う /  /  / この「/」の部分が「myData」でいいんですよね? 間違ってます?? やはり1列ずれてしまいます。 sheet2で「1」日に入れるとsheet1の「31」日の列に入ってしまうんです。 範囲名が違うんでしょうか?

usajun
質問者

補足

すみません、出来ました! sheet2のA列に「1」とか「2」とか入れていたので ずれるなーと思ってましたが、「8/1」という風に 入れたら正しくsheet1に入りました。 ただ、また別の問題が・・・。 「8/1 う 4:00」とsheet2に入れるとsheet1の正しい箇所に 表示はされるんですが、それと同時に「30」日の「う」の欄に 「0」が入ってしまいます。 何日を指定したとしても、かならず「30」日の該当行に「0」が 入るのです。sheet2で「30」日を指定すると今まで入っていた 「0」は消えるんですが。 また私のやり方が悪いのでしょうか?

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.4

時間を加算するには、最後の計算式を、  Range("myData").Cells(myRow, myColumn) = Range("myData").Cells(myRow, myColumn) + rg2.Offset(0, 2) '時刻 とします。24時間を越える可能性があれば、書式を[h]:mmにしておきます。

usajun
質問者

お礼

ありがとうございました! 時間を足すのは出来ました! 何度も申し訳ないんですが、sheet1に表示される時間が全て 1列ずれてしまいます。 sheet2で2日と入れたとしてもsheet1の1日のところに入ってしまいます。 どこを直していいのかわかりません。 すみませんがまた教えてください。

  • TTak
  • ベストアンサー率52% (206/389)
回答No.3

> 実はsheet2で、同じ日に同じ作業名が複数入ることもあるんです。 元あった時間に積算するということですね。 最初の回答の '一致するセルに書き込む Sheets("Sheet1").Cells(I, J).Value = Cells(myRecord, myColmun) の部分を '一致するセルに積算して書き込む Sheets("Sheet1").Cells(I, J).Value = _ Sheets("Sheet1").Cells(I, J).Value + Cells(myRecord, myColmun) とします。

usajun
質問者

お礼

早速の回答ありがとうございます! 無事に出来ました!!

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

質問と似た処理を行ったことがありますので書いてみました。 シートの作り方ですが、入力や以下のマクロを簡単にするために次のように設定して下さい。  (1)Sheet1のA2から下に向かって作業名を入力しておきます。     入力した範囲に範囲名『mySagyo』を付けます。  (2)B1から右に向かって日付(1,2,3・・・31)を入れます。     日付でも数値でもかまいません。。  (3)時間を入れる範囲を時刻の表示形式にして、全体に『myData』の範囲名を付けます。     myDataの範囲は、B2:AF?? になると思われます。  (4)Sheet2のA1から表題として日付、作業名、時間を入れます。  (5)B列(作業名)を選んで、メニューからデータ→入力規制の設定タブで     入力値の種類を『リスト』、元の値を『=mySagyo』とします。     これで作業名は事前に登録したものから選択できます。ミスも減ります。 次にマクロ部分ですが、C列に入力したらSheet1に反映するようにとの要望ですが、いつも正確に入力できるとは限りませんし、入力処理では訂正・挿入・削除・消去やコピーを行ったりします。特に、消去やコピーに対応するのが難しかった記憶があります。 その処理に対応するために下記のマクロでは、Sheet1をActiveにしたら(見に行ったら)入力値から計算に行くことにしています。Excelは速い?! シートの左上から詰めて作成しない場合は、日付を設定した行の数-1をmyRow = rg1.Row - 1 - 0の『0』の部分に入れてください。4行目に日付があると3をセットします。表の左に列を挿入しても影響はありません。 シート1のコードウインドウに貼り付けます。 Private Sub Worksheet_Activate()   Dim rg2 As Range 'Sheet2のセル(日付)   Dim rg1 As Range 'Sheet1のセル(作業名)   Dim myRow As Integer '出力セルの行   Dim myColumn As Integer '出力セルの列   Range("myData").ClearContents '出力範囲をクリア   With Worksheets("Sheet2")     'Sheet2のA列の入力値を順に調べる     For Each rg2 In .Range("A2:A" & .UsedRange.Rows.Count)       myColumn = Day(rg2.Value) '出力列       For Each rg1 In Range("mySagyo")         If rg2.Offset(0, 1) = rg1 Then           myRow = rg1.Row - 1 - 0: Exit For '出力行         End If       Next       Range("myData").Cells(myRow, myColumn) = rg2.Offset(0, 2) '時刻     Next   End With End Sub

usajun
質問者

お礼

ありがとうございます! VBAはまったくわからないのでこれを機会に勉強したいと思います。 それと、sheet2の作業名は私も入力規則のリストを使ってました。 でも違うシートからの参照ができないと思ってたので、わざわざ sheet1からコピーしてsheet2に貼り付けてリストを作ってました。 名前つければよかったんですね。目からウロコでした!

  • TTak
  • ベストアンサー率52% (206/389)
回答No.1

要するにSheet2に、作業名・日付・時間を入力した時点で、Sheet1の作業名(行)と日付(列)をクロスで検索して一致したセルに時間が自動入力されるようにしたいと察しました。VBAを使った方法です。 Sheet2のコードモジュールに貼り付けて試行してください。 '---ここから Dim myRecord As Long Dim myColmun As Integer Private Sub Worksheet_Change(ByVal Target As Range) 'C列セルに変更があった場合のイベントマクロ If Left(Target.Address, 2) = "$C" Then '変更のあった行数の取得 myRecord = Range(Target.Address).Row '変更のあった列数の取得 myColmun = Range(Target.Address).Column 'サブルーチン(データ転送) Call Dat_Input End If End Sub Sub Dat_Input() 'データ転送 Dim I As Integer Dim J As Integer '作業名が一致するまで検索 For I = 1 To Range(Sheets("Sheet1").Cells(Rows.Count, 1) _ .End(xlUp).Address).Row If Cells(myRecord, 2).Value = Sheets("Sheet1") _ .Cells(I, 1).Value Then Exit For Next I '日付が一致するまで検索 For J = 1 To Range(Sheets("Sheet1").Cells(1, Columns.Count) _ .End(xlToLeft).Address).Column If Cells(myRecord, 1).Value = Sheets("Sheet1") _ .Cells(1, J).Value Then Exit For Next J '一致するセルに書き込む Sheets("Sheet1").Cells(I, J).Value = Cells(myRecord, myColmun) End Sub '---ここまで

usajun
質問者

お礼

ありがとうございます! とりあえずできました!! 実はsheet2で、同じ日に同じ作業名が複数入ることもあるんです。 例:2行目に、8/1 あ 1:00   3行目に、8/1 あ 2:00 そういう場合、sheet1の8/1の「あ」のところに「3:00」と 表示されるようにしたいんですが、これはどうしたらいいんでしょう? 今のままだと最後に入れた「2:00」だけの表示になってしまいます。 よろしければまた教えてください・・・。

関連するQ&A

  • エクセル2007:シート内のデータの自動転記

    Excle2007を使用しています。 シート1のデータをシート2に自動で転記したいと思っています。 シート1 作業件名ごとにその内容、作業者名が書いてある表。 1行ににつき作業1件 A列:日付 B列:作業件名 C列:内容 D列:作業者名 シート2 作業者ごとに従事した作業をまとめた一覧表で、ひとりにつき1ページ。 表の形式(見た目)はシート1とはまったく別のもの。 作業者ごとに空欄の表が既に作られており、 1ページ目:Aさん 2ページ目:Bさん という風に、1シートに改ページしながら全ての作業者について1ページずつ一覧表になっている。 1ページは25行を使用しており、 Aさん(1ページ目)は1~25行(Bさん(2ページ目)は26~50行)となる。 1ページ目の表のうち、シート1のデータを入れられる行は11~21行。 3件あれば3行使って残り8行は空欄ということになります 日付欄はシート2のA11~A21 件名欄はシート2のB11~B21 内容欄はシート2のD11~D21 シート2には、作業者の住所や生年月日など、シート1にない項目があらかじめ入力されている。 いつもはシート1を入力後に作業者基準で並べ替えをして印刷し、 シート2の該当する作業者のページに手打ちでデータ入力しています。 シート1のデータをシート2の該当箇所に転記するだけなので、シート1が完成した段階で シート2を自動で作れたら作業時間の短縮になると思い、考え始めました。 が、VBAに詳しくないため、どこからどう手をつけたらいいものかわかりません。 お詳しい方、お知恵をいただけましたらと思います。 不足情報等ございましたらご指摘いただけましたら補足をさせていただきますので どうぞよろしくお願いいたします。

  • エクセルのシート名を、シート1に作成した新旧一覧表に対応させる形で、複数シート一括で変更するには?

    エクセルのシート名の変更について教えてください。 シート1のA列に、現在のブックのシート名が、 シート1のB列には、変更したいシート名が 対応するように入力されています。 シート数は50~200程度で、つど変わります。 例     A列    B列 1行目:りんご   赤色  2行目:ばなな   黄色 3行目:メロン   緑色     ・     ・     ・     ・     ・     ・ ※この場合、「りんご」は「赤色」に、「ばなな」は「黄色」に、 「メロン」は「緑色」に、それぞれシート名を変換したい。 今は、手作業でひとつずつシート名を変換しており、 かなりの手間で困っています。 一覧表を作成するまでは手作業でいいのですが、 何とかして、シート名の変更を、この一覧表を参照して できないでしょうか? 過去の質問をいろいろと見たのですが、 該当するものが見つけられず、VBAも初心者のため、 途方にくれています。 ぜひともご教授ください。

  • EXCEL VBAで日報作成したい

    お世話になります。 EXCEL VBAの勉強をかねて日報を作成しようと思っています。 添付図にあるような簡単な日報ですが、VBAでやりたいことは2つあります。 1.行追加 各行の隣にある「行追加」ボタンを押したらその行を下に追加したいのです。 2.カレンダー作成 「カレンダー作成」というボタンを押したらA5に入っている月を参照して、添付図のようなA列が月、B列が日、C列が曜日、D列が開始時間、E列が終了時間、F列が作業、G列に行追加ボタンが自動で該当月のカレンダーに自動作成できれば最高です。 上記1.2を実現するためのロジックについてどなたかお知恵をお借りできませんでしょうか? よろしくお願い致します。 EXCEL2013

  • Excel 集計表の作成

    Excelの集計表の作成について教えてください。 Accessから出力したデータ(日別、作業別、その件数)の一覧表を作りたいと思っています。 今のところ、このような状態になっています ↓↓      A    B    C     1   日付  作業名  件数 2  1日   作業A     100 3  1日   作業B    100 4   2日  作業A   100      コレをこのような状態に変えたいんです ↓↓     A      B       C      D 1  日付   作業A  作業B  作業D 2 1日    100   100    50   3 2日    100   100    50 (行→日にち  列→作業名) ボタン1つで出来るようにしたいのでマクロ、VBAを使用したいです。 どなたかお知恵を貸していただけないでしょうか。

  • Excelでの日別ガントチャート作成方法作成

    Excel2007を使用してシート1では以下のような月次勤務表を作成しております。このシート1の月次の勤務表は縦軸に30人ほどの氏名、横軸に日にちを展開しております。この表をもとに、8/1に勤務するものをピックアップして、シート2でガントチャートを作成したいのですが どなたかご教授いただけないでしょうか? なお、月次勤務表の横軸の日付と曜日は、月が変われば、自動で変わるように作成しております。 月次勤務表例(シート1)      A列   B列  C列      D列   E列    F列    G列・・・・・・・・・AG列 1行目 2012年8月 3行目 No 氏名 種別 1 2 3 4・・・・・・・・・・・・31 4行目           水 木 金 土 5行目 1  A氏   出勤    9:00          11:00 6行目          退社 17:00       16:00 7行目         休憩 0.5 0.25 8行目         実働 7.5 0.00 4.75 0.00 9行目 2       B氏   出勤    9:00    10:00       ・              退社 17:00 15:00       ・            休憩 1.0 0.25 ・            実働 7.00 4.75 0.00 0.00 この月次シートから、別シートに例えば、8/1に勤務するものと、その時間帯をガントチャート形式 で表示するための関数をご教授いただければ幸いです。

  • エクセル関数

    エクセル関数を教えてください。 下記のシフト表のようなものを作成しているのですが、 【Sheet1】    A列    B列  C列   D列 ・・・・  1 氏名    4/8   4/9   4/10・・・・ 2 勤務者名  ●   △    ■ B列以降は連続した日付で 2行目は出勤日に記号を入力します。 記号は仕事種類によって違うので、種類はいろいろあります。 ちなみに、【Sheet1】のひな形は変更不可です。 この表を元に【Sheet2】に勤務者名を入力すると、 最初に出勤した日と、最後に出勤した日を表示させたいのです。 IFやVLOOK関数を使うのかな?と思いいろいろやってみたのですが、 うまくできませんでした。。。 ご協力よろしくお願いします。  

  • エクセルで、2つのセル値(2つの条件)から、別シートの表から該当する値を参照する方法

    シート(1)のA列とB列のセルに入力されている値を元に、 シート(2)の表を参照し、該当する値をシート(1)のC列に 表示させる方法があれば 教えて頂けると助かります。 なおシート(1)のA列は、参照するシート(2)の表の列タイトルに対応し、 シート(1)のB列は、シート(2)の行タイトルに対応するマトリックス表に なっております。 また、この列行タイトルの表記は「1から」または「1から9まで」 という範囲での表示になっています。 (例:シート(1)元データ) No| A列 | B列 | C列 | --------------------------------- 1 | 07  |  22  |  20 | ←C列は、シート(2)表を参照  2 | 18  |  15  |  30 |        3 | 01  |  09  |  05 |       4 | 21  |  03  |  30 |  5 | 30  |  28  |  35 |  (例:シート(2)参照する表) A列\B列 | 1~9| 10~19 | 20~29 | -----------------------------------   01~  | 05  |  10  |  20  |         05~  | 15  |  15  |  20  |           10~  | 20  |  25  |  30  |        15~  | 25  |  30  |  30  |    20~  | 30  |  35  |  35  |  現在、手作業でC列への入力を行っております。 何とか、作業効率を上げたいと思っておりますので、 ご指導下さいます様 宜しくお願い致します。

  • EXCEL VBAで売上日報作成

    下記のような場合どのようなマクロを組めばいいか教えてください。 表(1) 日付 店舗名 売上 仕入値 客数   -------------------------------- 3/1   A   100   10   20 このような表を 表(2)(別のシート) 日付 売上  3/1  10 3/2  12 3/3 100  のように置き換えるのは出来るのですが、 例えば表(1)に3/11のデータをコピペし、シート上に マクロ実行ボタンを作り、そのボタンを押すと 表(2)に必要な部分だけを抽出かつ、日付順に並ばせる 方法を教えてください。 表(1)にデータをコピペし、ボタンを押すだけで表(2)に その日の売上が表示され、月末には一ヶ月の売上の推移を見れるような形をつくりたいのです。LOOK UP関数 などでは、表(1)に3/1の分をコピペするとその日はちゃんと表示されますが、翌日表(1)に3/2分をコピペすると3/1の上に上書きされますよね。なので、3/1の下のセルに3/2分を表示するようなマクロを教えてください。

  • エクセルで作成したいのですが

    エクセルで、 A列に「日付」、 B列に「機械種類」、 C列に「作業数」を手入力して D列に「当日の総作業数」を自動入力するような、 作業工数表を作成したいと思っています。 (具体例) 2/1 A機  1000 2/1 B機   300   2/1 A機  1200 2200 2/2 A機  1200 2/2 B機  3500 2/2 B機 12000  15500 2/2 A機  2000  3200 2/1 B機 1000 1300         以上のような状態にしたいのですが、 D列の「総作業数」を、 自動で集計されるようにするには、どうすればよいでしょうか…。 具体的には、 「A列が同日の日付の場合、B列の機械毎にその「作業数(C列)」を合計し、 同日日付の最後の日の、D列に合計値を記入する。 という形と考えているのですが、 日付は作業を指示する者が追記していくので必ずしも日付順に並んではいない場合での計算が理想ですが、ソート?で並べ替えをして数式が自動になればそれで構いませんが。 アドバイスを頂けると助かります。 よろしくお願いいたします。m(_ _)m

  • エクセル2007で作成したいのですが・・

    作業予定表を作成しています シート1に左から 予定日 機械名 数量 終了日 得意先 色 ・・・等の項目があり 1/1  A機  500   1/3   AAA  黒 1/3  B機  1000  1/5   CCC  青 1/2  A機  300   1/3   ABC  黒 1/1  A機  200   1/2  BBBB  赤 1/2  B機  100   1/4   ABCD 青 という感じで行下にどんどん追記していく予定表データから別シートに 作業予定日と機械名を入力すると数量や・終了日等該当する行の項目データが表示されるようにしたいのですが・・・。 シート2のイメージは以下の感じです 予定日   機械名 1月1日    A機  ↑↑↑  ↑↑↑ ここに抽出したい日時と機械名を入れてエンターを押すと下のように表示されるのがベストです 数量  終了日 得意先  色・・・ 500   1/3    AAA  黒 200   1/2    BBBB 赤 サーバにアップして、各社員が予定表に入力して、状況を閲覧できるようにしたいのです。 シート1では数式でいろんな集計?がしてあるのでフィルタや並び替えは避けたいです。 多くの人間が作業するのでフィルタや並び替え等の操作をすると誤って削除する方が多く困っているのでこの方法が良いかと考えました。 すみませんが御助力ください。他になにか良い案があればご教示頂ければ幸いです。

専門家に質問してみよう