• 締切済み

マクロを使って抽出する

マクロを使った抽出について教えてください。 A列  B列  C列  D列 番号  区分  氏名  年齢  *区分はA~Pが入ります。  *リスト範囲:A1:D200 セル[F1]に区分(A~P)を入力して実行すると35歳以上を抽出する。 オートフィルタの設定を使わずマクロで実行したいのですが、どのようなマクロを書けばよいのかわかりません。 マクロ初心者で申し訳ありませんが、よろしくご教授ください。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

マクロも (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)
回答No.3

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

参考URL:
http://home.att.ne.jp/zeta/gen/excel/c04p14.htm
回答No.2

区分が何なのか分かりませんが、例えば地区だとすると、 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

noname#77845
noname#77845
回答No.1

補足してください。 「セル[F1]に区分(A~P)を入力して実行すると35歳以上を抽出する。」 意味不明です。 区分に何を入力しても必ず35歳以上のデータを抽出するの? それとも、F1と同じ区分の中で35歳以上を抽出するの? 因みに、「新しいマクロの記録」でオートフィルタを使用すれば、どういうマクロか判ると思いますよ。 戻すマクロも作った方がいいかも…。