- 締切済み
マクロを使って抽出する
マクロを使った抽出について教えてください。 A列 B列 C列 D列 番号 区分 氏名 年齢 *区分はA~Pが入ります。 *リスト範囲:A1:D200 セル[F1]に区分(A~P)を入力して実行すると35歳以上を抽出する。 オートフィルタの設定を使わずマクロで実行したいのですが、どのようなマクロを書けばよいのかわかりません。 マクロ初心者で申し訳ありませんが、よろしくご教授ください。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
マクロも (1)VBAのメソッドプロパティをどれを使ったらよいかの勉強 (2)処理ロジックの勉強 があって、(2)は時間がかかる。解説者やWEB情報でも取り立てて区分しては書いてなくて、場を積むよりほか無い。 本件は基本的な「検索」の問題です (1)全データ行を総なめ比較・判別して該当を抜き出す 判別は、区分=P AND 年齢>=35 全データのための最下行は d = Range("A65536").End(xlUp).Row かセルの初出空白行で捉えられる。 (2)データをコピーし、「区分」列でソートし、区分=Pの行から pの行全てで年齢>=35を判別し、該当するものを探す 最初行はMatch関数やFindメソッドで出来る。 (3)Find,Findメソッドで順次、区分=Pを探し、年齢>=35 以外は捨てる。 (3)はVBA初心者には難しい。 (1)(2)は1000行ぐらいなら樹幹的に大丈夫でしょう コードは既回答も有るので省略。 練習にやってみてはどうかな。
- mitarashi
- ベストアンサー率59% (574/965)
on memoryのrecordset操作にチャレンジしてみました。興味を持たれたら、参考URLで勉強してください。XL2007で動くかどうかは疑問です。 Sub test() Dim i As Long Dim targetRange As Range Dim targetRow As Range Dim rs As Object Set rs = CreateObject("ADODB.Recordset") With rs .Fields.Append "番号", 8, 20 'adBSTR .Fields.Append "区分", 8, 50 'adBSTR .Fields.Append "氏名", 8, 150 'adBSTR .Fields.Append "年齢", 3 'adInteger .CursorType = 3 ' adOpenStatic .LockType = 3 ' adLockOptimistic .Open End With Set targetRange = ActiveSheet.Range("a1").CurrentRegion Set targetRange = targetRange.Offset(1, 0).Resize(targetRange.Rows.Count - 1, targetRange.Columns.Count) With rs For Each targetRow In targetRange.Rows .AddNew For i = 1 To targetRow.Columns.Count .Fields(i - 1).Value = targetRow.Cells(i).Value Next i Next End With rs.Filter = "(区分='" & ActiveSheet.Range("f1").Value & "') And (年齢>=35)" ActiveSheet.Range("f2").CopyFromRecordset rs rs.Filter = 0 'adFilterNone Set rs = Nothing End Sub
- tinu 2000(@tinu2000)
- ベストアンサー率40% (147/366)
区分が何なのか分かりませんが、例えば地区だとすると、 P地区で35歳以上の顧客リストを表示したい。 そんなところかな??? そんな訳で、 F1に抽出地区、G1に年齢を入れて、 H1をクリックすると抽出を開始。 I1をクリックすると全件表示(元に戻す) の条件で作って見ました。 200件だったらこんなもんでどうかな? これが20,000件だったらスピードを考慮しないといけないと思う。 リストがあるシートに貼り付けて下さい。 Option Explicit Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim I As Integer If Target.Address = "$H$1" Then Rows("2:200").EntireRow.Hidden = False For I = 2 To 200 If Range("F1") <> Range("B" & I) Or _ Range("G1") > Range("D" & I) Then Rows(I).EntireRow.Hidden = True End If Next I End If If Target.Address = "$I$1" Then Rows("2:200").EntireRow.Hidden = False End If End Sub
補足してください。 「セル[F1]に区分(A~P)を入力して実行すると35歳以上を抽出する。」 意味不明です。 区分に何を入力しても必ず35歳以上のデータを抽出するの? それとも、F1と同じ区分の中で35歳以上を抽出するの? 因みに、「新しいマクロの記録」でオートフィルタを使用すれば、どういうマクロか判ると思いますよ。 戻すマクロも作った方がいいかも…。