OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

EXCELで日報作成

  • 困ってます
  • 質問No.119404
  • 閲覧数1306
  • ありがとう数7
  • 気になる数0
  • 回答数6
  • コメント数0

お礼率 97% (43/44)

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

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

  • 回答No.6
レベル13

ベストアンサー率 68% (791/1163)

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

お礼率 97% (43/44)

こちらこそ、長い間色々とご迷惑をおかけしました。
無事に出来ました。
感謝してもしきれません。
本当にありがとうございました!!!!
投稿日時 - 2001-08-21 11:58:38
-PR-
-PR-

その他の回答 (全5件)

  • 回答No.1
レベル12

ベストアンサー率 52% (206/389)

要するにSheet2に、作業名・日付・時間を入力した時点で、Sheet1の作業名(行)と日付(列)をクロスで検索して一致したセルに時間が自動入力されるようにしたいと察しました。VBAを使った方法です。 Sheet2のコードモジュールに貼り付けて試行してください。 '---ここから Dim myRecord As Long Dim myColmun As Integer Priv ...続きを読む
要するに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

お礼率 97% (43/44)

ありがとうございます!
とりあえずできました!!

実はsheet2で、同じ日に同じ作業名が複数入ることもあるんです。
例:2行目に、8/1 あ 1:00
  3行目に、8/1 あ 2:00
そういう場合、sheet1の8/1の「あ」のところに「3:00」と
表示されるようにしたいんですが、これはどうしたらいいんでしょう?
今のままだと最後に入れた「2:00」だけの表示になってしまいます。
よろしければまた教えてください・・・。
投稿日時 - 2001-08-17 11:05:17
  • 回答No.2
レベル13

ベストアンサー率 68% (791/1163)

質問と似た処理を行ったことがありますので書いてみました。 シートの作り方ですが、入力や以下のマクロを簡単にするために次のように設定して下さい。  (1)Sheet1のA2から下に向かって作業名を入力しておきます。     入力した範囲に範囲名『mySagyo』を付けます。  (2)B1から右に向かって日付(1,2,3・・・31)を入れます。     日付でも数値でもかまいません。。  (3)時 ...続きを読む
質問と似た処理を行ったことがありますので書いてみました。
シートの作り方ですが、入力や以下のマクロを簡単にするために次のように設定して下さい。
 (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

お礼率 97% (43/44)

ありがとうございます!
VBAはまったくわからないのでこれを機会に勉強したいと思います。

それと、sheet2の作業名は私も入力規則のリストを使ってました。
でも違うシートからの参照ができないと思ってたので、わざわざ
sheet1からコピーしてsheet2に貼り付けてリストを作ってました。
名前つければよかったんですね。目からウロコでした!
投稿日時 - 2001-08-17 11:09:18
  • 回答No.3
レベル12

ベストアンサー率 52% (206/389)

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

お礼率 97% (43/44)

早速の回答ありがとうございます!
無事に出来ました!!
投稿日時 - 2001-08-17 13:34:03
  • 回答No.4
レベル13

ベストアンサー率 68% (791/1163)

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

 Range("myData").Cells(myRow, myColumn) = Range("myData").Cells(myRow, myColumn) + rg2.Offset(0, 2) '時刻

とします。24時間を越える可能性があれば、書式を[h]:mmにしておきます。
お礼コメント
usajun

お礼率 97% (43/44)

ありがとうございました!
時間を足すのは出来ました!

何度も申し訳ないんですが、sheet1に表示される時間が全て
1列ずれてしまいます。
sheet2で2日と入れたとしてもsheet1の1日のところに入ってしまいます。
どこを直していいのかわかりません。
すみませんがまた教えてください。
投稿日時 - 2001-08-17 13:36:29
  • 回答No.5
レベル13

ベストアンサー率 68% (791/1163)

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

行を操作しているところは、
 myColumn = Day(rg2.Value) '出力列
ですが、これがずれるとしたら・・・

(3)時間を入れる範囲を時刻の表示形式にして、全体に『myData』の範囲名を付けます。
とお願いした『myData』の範囲の確認をして下さい。
この範囲の最初(左上セル)は日付の1日のセルの1つ下にします。1つ左にずれているような気がします。
補足コメント
usajun

お礼率 97% (43/44)

すみません、出来ました!
sheet2のA列に「1」とか「2」とか入れていたので
ずれるなーと思ってましたが、「8/1」という風に
入れたら正しくsheet1に入りました。

ただ、また別の問題が・・・。
「8/1 う 4:00」とsheet2に入れるとsheet1の正しい箇所に
表示はされるんですが、それと同時に「30」日の「う」の欄に
「0」が入ってしまいます。
何日を指定したとしても、かならず「30」日の該当行に「0」が
入るのです。sheet2で「30」日を指定すると今まで入っていた
「0」は消えるんですが。
また私のやり方が悪いのでしょうか?
投稿日時 - 2001-08-18 09:16:43
お礼コメント
usajun

お礼率 97% (43/44)

何度も何度も済みません。

こういう表だったとして、
  1  2  3
あ /  /  /
い /  /  /
う /  /  /
この「/」の部分が「myData」でいいんですよね?
間違ってます??
やはり1列ずれてしまいます。
sheet2で「1」日に入れるとsheet1の「31」日の列に入ってしまうんです。
範囲名が違うんでしょうか?
投稿日時 - 2001-08-17 22:42:59
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ