- ベストアンサー
エクセルマクロで場所と日付を検索して表示する方法
- エクセルのマクロを使って、場所と日付を検索し、表示する方法について困っています。
- 具体的には、指定した場所と日付のデータのみを抽出し、別のシートに表示したいです。
- 自分なりにプログラムを組んでみましたが、うまくいきません。どこが間違っているのか教えていただきたいです。また、他のやり方があれば教えていただけますか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
初心者用コードということで。。。 '--------------------------------------------- ■データシート: 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 '---------------------------------------------------- 以上です。
その他の回答 (6)
- layy
- ベストアンサー率23% (292/1222)
「シート全体を選びコピーする」 「新しいシートへ貼り付け」 「C列、F列を削除する」 「1行目見出しをフィルタとする」 「E11にSUBTOTAL関数を定義する」 「A列フィルタオプションで、東京で始まるもの、となるよう条件チェックする」 「B列フィルタオプションで、2010/05で始まるもの、となるようチェックする」 EXCEL2007で実施しました。 コードを記載しなくても期待したものになる感じです。 ポイントは「SUBTOTAL関数」、 フィルタを考慮した合計を求めることができます。 フィルタでは「xxxから始まるものだけにする」、です。 ほか、いろいろ対応できる手段はありそうなので、 これを機にどれか1つでも理解して次回ほかでも使えるようにがんばりましょう。
お礼
回答有難うございます。 いろいろな方法があるんですね! 試してみます!
- jcctaira
- ベストアンサー率58% (119/204)
シンプルに作成してみました。 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列を削除します。 注)結果のシート名変更はしていませんので、変更するように修正して下さい。
お礼
回答有難うございます。 こんなやり方があったんですね! 早速試してみます。
- Wendy02
- ベストアンサー率57% (3570/6232)
前回のものを少し直せば済むと思います。 AutoFilter をフィルタオプション(AdvancedFilter) に切り替えただけです。 このマクロの基本路線のレベルは、日付のチェックなどの小技は別ですが、思いのほか、初級レベルです。 日付のチェックは、私のこだわりですが、ここのサイトで覚えたワザのひとつです。日付のエラーや誤作動はみっともないですからです。その代わり、場所の検索チェックはやめました。 #3のマクロは、Variant 型の宣言は、文字数制限のために省略しました。 また、エラーは出ていないはずですが、本来は、 With ActiveSheet .Range("AA2").Formula = "=A2=""" & sPlc & """" .Range("AB2").Formula = "=AND(" & CLng(sDate) & "<=B2," & CLng(eDate) & ">=B2)" End With と書かなくてはなりません。
お礼
回答有難うございます。 こんな技があったんですね! 試してみます。
- Wendy02
- ベストアンサー率57% (3570/6232)
'//説明は次の書き込みで 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
お礼
コード有難うございます!
- layy
- ベストアンサー率23% (292/1222)
絞り込む日付は、月だけの指定、日付の開始終了範囲指定、日の指定、考えられますが、月指定ですね?。結果は並び変わっていますが日付順ででないとダメですか?。フィルタの操作は知っていますか?。情報の追加お願いします。
お礼
回答有難うございます。 >絞り込む日付は、月だけの指定、日付の開始終了範囲指定、日の指定、考えられますが、月指定ですね? はい、そうです。 >結果は並び変わっていますが日付順ででないとダメですか?。 できれば、ですが、出来なければ順番は変わらなくても平気です。 >フィルタの操作は知っていますか?。 知っています。ですが、フィルタで日付の開始終了を指定し、検索はできないのでマクロが便利かとおもいました。 言葉不足、情報不足が直っていませんでした。申し訳ありません。
- t_nojiri
- ベストアンサー率28% (595/2071)
>回答欄にコードを入れますので見てもらえるとうれしいです 質問欄に入れて下さい。何処が上手く行ってないのかソースが無いのに聞くんじゃ 前回の質問と変わらないです。
お礼
回答有難うございます。 質問欄の文章が長くなったので違う欄のほうがいいかな?と思い別にしましたが、書き込めませんでした。 今度からはすべて一緒にしますね。 これが載せようと思ったものです。 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
お礼
回答有難うございます! コードを書いていただき有難うございます! 早速やってみます!