• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルのマクロについて困っています。2)

エクセルマクロで場所と日付を検索して表示する方法

このQ&Aのポイント
  • エクセルのマクロを使って、場所と日付を検索し、表示する方法について困っています。
  • 具体的には、指定した場所と日付のデータのみを抽出し、別のシートに表示したいです。
  • 自分なりにプログラムを組んでみましたが、うまくいきません。どこが間違っているのか教えていただきたいです。また、他のやり方があれば教えていただけますか?

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.5

初心者用コードということで。。。 '--------------------------------------------- ■データシート: Sheet1 見出し行__: 1行目 データ行__: 2行目以降 '--------------------------------------------- ■抽出用シート: Sheet2 ___A____B____C_____D___ 1_場_所__開始日__終了日________ 2_●●●__●●●__●●●________ 3 4 5_場_所__日_付__作業内容__工_数__ 6 7 ●●●に抽出条件を入れる '--------------------------------------------------- Sub test()  Dim R As Long  Dim Row2 As Long '●Sheet2書込み行  Sheets("Sheet2").Range("A5").CurrentRegion.Clear  Sheets("Sheet2").Range("A5:D5").Value = Array("場所", "日付", "作業内容", "工数(H)")  Row2 = 5 For R = 2 To Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row  If Sheets("Sheet1").Cells(R, "A") = Sheets("Sheet2").Range("A2") And _    Sheets("Sheet1").Cells(R, "B") >= Sheets("Sheet2").Range("B2") And _    Sheets("Sheet1").Cells(R, "B") <= Sheets("Sheet2").Range("C2") Then    Row2 = Row2 + 1    Sheets("Sheet2").Cells(Row2, "A").Value = Sheets("Sheet1").Cells(R, "A").Value    Sheets("Sheet2").Cells(Row2, "B").Value = Sheets("Sheet1").Cells(R, "B").Value    Sheets("Sheet2").Cells(Row2, "C").Value = Sheets("Sheet1").Cells(R, "D").Value    Sheets("Sheet2").Cells(Row2, "D").Value = Sheets("Sheet1").Cells(R, "E").Value  End If Next R '●結果の並べ替え  If Row2 = 5 Then    MsgBox "該当データなし!"  Else    Sheets("Sheet2").Range("A5:D" & Row2).Sort _      Key1:=Range("B6"), Order1:=xlAscending, _      Header:=xlYes, OrderCustom:=1, MatchCase:=False, _      Orientation:=xlTopToBottom, SortMethod:=xlPinYin  End If  Sheets("Sheet2").Select End Sub '---------------------------------------------------- 以上です。  

loveless-05410
質問者

お礼

回答有難うございます! コードを書いていただき有難うございます! 早速やってみます!

その他の回答 (6)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.7

「シート全体を選びコピーする」 「新しいシートへ貼り付け」 「C列、F列を削除する」 「1行目見出しをフィルタとする」 「E11にSUBTOTAL関数を定義する」 「A列フィルタオプションで、東京で始まるもの、となるよう条件チェックする」 「B列フィルタオプションで、2010/05で始まるもの、となるようチェックする」 EXCEL2007で実施しました。 コードを記載しなくても期待したものになる感じです。 ポイントは「SUBTOTAL関数」、 フィルタを考慮した合計を求めることができます。 フィルタでは「xxxから始まるものだけにする」、です。 ほか、いろいろ対応できる手段はありそうなので、 これを機にどれか1つでも理解して次回ほかでも使えるようにがんばりましょう。

loveless-05410
質問者

お礼

回答有難うございます。 いろいろな方法があるんですね! 試してみます!

  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.6

シンプルに作成してみました。 Sub 新シート作成()  Sheets("Sheet1").Copy After:=Sheets(Sheets.Count)  For 行 = Cells.SpecialCells(xlCellTypeLastCell).Row To 2 Step -1   If Cells(行, "A") <> "東京" Or Format(Cells(行, "B"), "YYYYMM") <> "201005" Then    Cells(行, "A").EntireRow.Delete   End If  Next 行  Range("C:C,F:F").Delete End Sub 【説明】 ・元のシート(Sheet1)をブックの最後に複写します。 ・全行をチェックし、東京、2001年05月 以外を削除します。 ・C列、F列を削除します。 注)結果のシート名変更はしていませんので、変更するように修正して下さい。

loveless-05410
質問者

お礼

回答有難うございます。 こんなやり方があったんですね! 早速試してみます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

前回のものを少し直せば済むと思います。 AutoFilter をフィルタオプション(AdvancedFilter) に切り替えただけです。 このマクロの基本路線のレベルは、日付のチェックなどの小技は別ですが、思いのほか、初級レベルです。 日付のチェックは、私のこだわりですが、ここのサイトで覚えたワザのひとつです。日付のエラーや誤作動はみっともないですからです。その代わり、場所の検索チェックはやめました。 #3のマクロは、Variant 型の宣言は、文字数制限のために省略しました。 また、エラーは出ていないはずですが、本来は、 With ActiveSheet .Range("AA2").Formula = "=A2=""" & sPlc & """" .Range("AB2").Formula = "=AND(" & CLng(sDate) & "<=B2," & CLng(eDate) & ">=B2)" End With と書かなくてはなりません。

loveless-05410
質問者

お礼

回答有難うございます。 こんな技があったんですね! 試してみます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

'//説明は次の書き込みで Sub SplitMcrR()   Dim sPlc   Dim sMon, sDate, eDate   Dim rng As Range   Dim ret   Dim NextSh As Worksheet   'データ範囲   Set rng = ActiveSheet.Range("A1").CurrentRegion   Set NextSh = Worksheets("Sheet2") '転送先   NextSh.UsedRange.Clear      If Application.CountA(rng) < 3 Then     MsgBox "シートが違うかもしれません。", 48     Exit Sub   End If   sPlc = Application.InputBox("場所は?", "検索", Type:=2)   If VarType(sPlc) = vbBoolean Or Trim(sPlc) = "" Then Exit Sub   sMon = Application.InputBox("月数は? 1-12 または yyyy/m", "検索", Type:=2)   If VarType(sMon) = vbBoolean Or Trim(sMon) = "" Then Exit Sub      If Len(sMon) - Len(Replace(sMon, "/", "", , , 1)) = 1 And Len(sMon) > 5 Then     If IsDate(sMon & "/1") > 1 Then MsgBox "日付式が違います。", 48: Exit Sub     sDate = CDate(sMon & "/1"): eDate = DateSerial(Year(sDate), Month(sDate) + 1, 0)   ElseIf IsDate(sMon) Then     sDate = DateSerial(Year(Date), Month(sMon), 1): eDate = DateSerial(Year(Date), Month(sDate) + 1, 0)   ElseIf IsNumeric(sMon) Then     If Not (CLng(sMon) >= 1 And CLng(sMon) <= 12) Then       MsgBox "月数が違います。", 48: Exit Sub     Else       sDate = DateSerial(Year(Date), sMon, 1): eDate = DateSerial(Year(Date), Month(sDate) + 1, 0)     End If   Else     Exit Sub   End If   Range("AA2").Formula = "=A2=""" & sPlc & """"   Range("AB2").Formula = "=AND(" & CLng(sDate) & "<=B2," & CLng(eDate) & ">=B2)"      Application.ScreenUpdating = False   With rng     .AdvancedFilter Action:=xlFilterInPlace, _     CriteriaRange:=Range("AA1:AB2"), _     Unique:=False   End With   With ActiveSheet     If Application.Subtotal(3, rng.Columns(1)) = 1 Then       MsgBox "該当データが見当たりません。", 48       .ShowAllData       .Range("AA1:AB2").ClearContents       Exit Sub     End If     .Columns(3).Hidden = True: .Columns(6).Hidden = True     rng.Copy NextSh.Range("A1") '転送     .Columns(3).Hidden = False: .Columns(6).Hidden = False     .ShowAllData     .Range("AA1:AB2").ClearContents   End With   Application.ScreenUpdating = True   NextSh.Activate End Sub

loveless-05410
質問者

お礼

コード有難うございます!

  • layy
  • ベストアンサー率23% (292/1222)
回答No.2

絞り込む日付は、月だけの指定、日付の開始終了範囲指定、日の指定、考えられますが、月指定ですね?。結果は並び変わっていますが日付順ででないとダメですか?。フィルタの操作は知っていますか?。情報の追加お願いします。

loveless-05410
質問者

お礼

回答有難うございます。 >絞り込む日付は、月だけの指定、日付の開始終了範囲指定、日の指定、考えられますが、月指定ですね? はい、そうです。 >結果は並び変わっていますが日付順ででないとダメですか?。 できれば、ですが、出来なければ順番は変わらなくても平気です。 >フィルタの操作は知っていますか?。 知っています。ですが、フィルタで日付の開始終了を指定し、検索はできないのでマクロが便利かとおもいました。 言葉不足、情報不足が直っていませんでした。申し訳ありません。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

>回答欄にコードを入れますので見てもらえるとうれしいです 質問欄に入れて下さい。何処が上手く行ってないのかソースが無いのに聞くんじゃ 前回の質問と変わらないです。

loveless-05410
質問者

お礼

回答有難うございます。 質問欄の文章が長くなったので違う欄のほうがいいかな?と思い別にしましたが、書き込めませんでした。 今度からはすべて一緒にしますね。 これが載せようと思ったものです。 Sub 検索() Dim Search1 As String Dim Search2 As String Dim S1() As String Dim S2() As String Dim SV1 As Variant Dim SV2 As Variant Dim HFlg As Boolean Dim ws1 As Worksheet, ws2 As Worksheet Dim rng As Range Dim myStr, ra, rr Search1 = InputBox("検索日(複数可)を入力" & vbNewLine & "(指定しない場合はキャンセル押下)", "条件入力") Search2 = InputBox("依頼部署(複数可)を入力" & vbNewLine & "(指定しない場合はキャンセル押下)", "条件入力") If myStr = "" Then MsgBox "検索はキャンセルされました。", vbInformation Cells.Select Selection.EntireRow.Hidden = False Range("A1").Select Exit Sub Set ws1 = Sheets("日報") '検索 シート Set ws2 = Sheets("集計表") '貼付先シート With ws1.Columns("Search1:A") '部分一致で検索(A列) With ws1.Columns("Search1:B") '部分一致で検索(B列) End With Set rng = .Find(What:=myStr, LookAt:=xlPart, After:=.Cells(.Cells.Count)) If rng Is Nothing Then 'なかったら MsgBox "ありません", vbCritical, myStr & "? ( ̄~ ̄;)う~ん  " Else 'あったら ra = rng.Address '最初に見つかったセルアドレス Do rr = rr + 1 'カウント rng.EntireRow.Copy Destination:=ws2.Cells(rr, 1) '行のコピペ Set rng = .FindNext(rng) '連続検索 Loop While rng.Address <> ra '繰り返し Set rng = Nothing End If End With

関連するQ&A