• ベストアンサー

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