アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (6件)

要するに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
'---ここまで
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2001/08/17 11:05

質問と似た処理を行ったことがありますので書いてみました。


シートの作り方ですが、入力や以下のマクロを簡単にするために次のように設定して下さい。
 (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
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2001/08/17 11:09

> 実は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)

とします。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/08/17 13:34

時間を加算するには、最後の計算式を、



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

とします。24時間を越える可能性があれば、書式を[h]:mmにしておきます。
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2001/08/17 13:36

>sheet2で2日と入れたとしてもsheet1の1日のところに入ってしまいます。



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

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

この回答への補足

すみません、出来ました!
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
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2001/08/17 22:42

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

色々とご迷惑をかけました。試してみて下さい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/08/21 11:58

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