• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:時間が一致するデータの抽出)

時間が一致するデータの抽出方法とは?

このQ&Aのポイント
  • Excel2010を使用して時間が一致するデータを抽出する方法を教えてください。大量のデータがあり、困っています。
  • Sheet2の特定の時間範囲にSheet1の特定の時間が含まれる場合、該当する会員をSheet2の特定の列にカンマ区切りで入力したいです。
  • VBAや関数の知識が浅いため、自分では解決できません。お力をお貸しいただけると助かります。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! Sheet1・Sheet2とも日付(時刻)セルはシリアル値だとします。 VBAでの一例です。 標準モジュールに↓のコードをコピー&ペーストしてマクロを実行してみてください。 Sub Sample1() 'この行から Dim i As Long, k As Long, endRow As Long, str As String, wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") endRow = wS2.Cells(Rows.Count, "B").End(xlUp).Row If endRow > 1 Then Range(wS2.Cells(2, "D"), wS2.Cells(endRow, "D")).ClearContents End If For k = 2 To wS2.Cells(Rows.Count, "B").End(xlUp).Row For i = 2 To wS1.Cells(Rows.Count, "B").End(xlUp).Row If wS1.Cells(i, "B") >= wS2.Cells(k, "B") And wS1.Cells(i, "B") <= wS2.Cells(k, "C") Then str = str & wS1.Cells(i, "A") & "," End If Next i If Len(str) > 1 Then wS2.Cells(k, "D") = Left(str, Len(str) - 1) End If str = "" Next k End Sub 'この行まで こんな感じではどうでしょうか?m(_ _)m

Penny0520
質問者

お礼

お教えいただき、ありがとうございます。 データ数を増やして試しましたところ、全部の会員名が入場者列に入りました。 本当に助かります。ありがとうございましたm(_ _)m。

その他の回答 (3)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

 関数を使った方法です。  こちらは、カンマ区切りになってはいないという点では回答No.3様の方法と同様ですが、配列式ではなく、通常の関数ですので、元データの値を入力するだけで結果が表示されます。  まず、Sheet2のD2セルに次の関数を入力して下さい。 =IF(ISNUMBER(1/DAY($B2)/DAY($C2)),IF(COLUMNS($D:D)>COUNTIFS(Sheet1!$B:$B,">="&$B2,Sheet1!$B:$B,"<="&$C2),"",INDEX(Sheet1!$A:$A,MATCH(SMALL(Sheet1!$B:$B,COUNTIF(Sheet1!$B:$B,"<"&$B2)+COLUMNS($D:D)),Sheet1!$B:$B,0))),"")  次に、Sheet2のD2セルをコピーして、Sheet2のD3以下に貼り付けて下さい。  次に、Sheet2のD列全体をコピーして、Sheet2のE列以降の列に貼り付けて下さい。  尚、この方法は、あくまで >Sheet1の会員の入時間は、Sheet1内でかぶることはありません。 という条件が守られている場合にのみ有効な方法で、もしも、入り時間がかぶっている様な事がある場合には、正しい結果を得られなくなりますので注意して下さい。

Penny0520
質問者

お礼

お礼が遅くなりまして申し訳ありません。 教えていただきました式をSheet2のD2セルに入力したのですが、#Name?エラーが出てしまいました。 勉強不足のため自分で直せなくて、申し訳ありません。 たくさんの方に教えていただき、なんとか作業を進められそうです。この場をお借りして、回答者の皆様にお礼を申し上げます。 今回は、同一セル内に入場者名を…というリクエストに応えてくださったtom04さんをベストアンサーとさせていただきます。 今後ともよろしくお願い致します。 ありがとうございましたm(_ _ )m。

noname#204879
noname#204879
回答No.3

D列以右の複数列に入場者名(赤字部分)を入れたので、別解です。 Sheet2!D2: {=INDEX(Sheet1!$A$1:$A$10,SMALL(IF((Sheet1!$B$1:$B$10>=$B2)*(Sheet1!$B$1:$B$10<=$C2),ROW(A$1:A$10),""),COLUMN(A1)))} (配列数式) ただし、セル D2 に次の[条件付き書式]を施しています。 数式が   =ISERROR(D2) フォント色 白

Penny0520
質問者

お礼

お教えいただき、ありがとうございます。 データ数を増やして試しましたところ、複数列ではありますが、全部の会員名が入りました。 今回は一つのセルにまとめて入れるという作業なのですが、今後方針が変わってセルを分ける作業になるかもしれませんので、その際に使わせていただきます。 ありがとうございましたm(_ _)m。

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.1

あんまり効率的じゃありませんが、手抜きせず丁寧に逐一見てった方が判りやすいと思います。 sub macro1()  dim w1 as worksheet, w2 as worksheet  dim r1 as long, r2 as long  dim LastRow1 as long, LastRow2 as long  set w1 = worksheets("Sheet1")  set w2 = worksheets("Sheet2")  lastrow1 = w1.range("A65536").end(xlup).row  lastrow2 = w2.range("A65536").end(xlup).row  for r2 = 2 to lastrow2   for r1 = 2 to lastrow1    if w2.cells(r2, "B") <= w1.cells(r1, "B") and w1.cells(r1, "B") <= w2.cells(r2, "C") then     w2.cells(r2, "D") = w2.cells(r2, "D") & "," & w1.cells(r1, "A")    end if   next r1   w2.cells(r2, "D") = mid(w2.cells(r2, "D"), 2)  next r2 end sub

Penny0520
質問者

お礼

お教えいただき、ありがとうございます。 データを増やして試しましたところ、5行目まではうまく行きましたが、6行め以降は結果が表示されませんでした。 自分で直せれば…と思い"A65536"を"A105536"に変えて実行してみましたが、エラーになってしまいました。 お時間がありましたら、もう少し教えていただけると助かります。 どうぞよろしくお願い致します。

関連するQ&A