Page 650 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼AdvancedFilterについて 123 03/1/28(火) 16:49 ┗Re:AdvancedFilterについて ichinose 03/1/29(水) 17:59 ┗Re:AdvancedFilterについて 123 03/1/30(木) 15:07 ┗Re:AdvancedFilterについて ichinose 03/1/30(木) 19:27 ┗Re:AdvancedFilterについて 123 03/1/31(金) 9:58 ─────────────────────────────────────── ■題名 : AdvancedFilterについて ■名前 : 123 ■日付 : 03/1/28(火) 16:49 -------------------------------------------------------------------------
みなさんこんにちは 久々に質問させていただきます。 現在、大量のデータを管理しています(個人データ) 人の異動に関するデータなので、同じ人が何回も出てきます。 そこで、AdvancedFilterを使って検索したいと思っています。 検索結果はリストボックスに表示させます。 っと ここまではできたのですが、 リストボックスに表示させた同じ人のデータの中から ひとつを選んで(ダブルクリック)、そのデータのA列を Activeにしたいのですが、AdvancedFilterで抽出したものを 使って上記のことは可能でしょうか。 ちなみにコードは Private Sub B_検索_Click() Application.ScreenUpdating = False With Worksheets("Sheet1") .Range("A2").Value = "*" & 検索番号.Value & "*" .Range("B2").Value = "*" & 検索氏名.Value & "*" End With Worksheets("異動簿").Columns("B:C").AdvancedFilter _ CriteriaRange:=Worksheets("Sheet1").Range("A1:B2"), _ Action:=xlFilterCopy, _ CopyToRange:=Worksheets("Sheet1").Columns("F:G"), _ Unique:=False Show_リスト Application.ScreenUpdating = True End Sub --------------------------Module1 Sub Show_リスト() With ThisWorkbook.Worksheets("Sheet1") UserForm1.検索結果リスト.RowSource = "[異動簿.xls]Sheet1!F2:G" _ & CStr(.Range("G1").CurrentRegion.Rows.Count) End With End Sub やっぱり、データシート上で、オートフィルターを使うほうが いいのでしょうかねぇ |
▼123 さん: こんにちは。 > >久々に質問させていただきます。 > >現在、大量のデータを管理しています(個人データ) >人の異動に関するデータなので、同じ人が何回も出てきます。 >そこで、AdvancedFilterを使って検索したいと思っています。 >検索結果はリストボックスに表示させます。 >っと ここまではできたのですが、 >リストボックスに表示させた同じ人のデータの中から >ひとつを選んで(ダブルクリック)、そのデータのA列を >Activeにしたいのですが、AdvancedFilterで抽出したものを >使って上記のことは可能でしょうか。 マスターデータであるシート「異動簿」の各行にその行番号が入っていれば この処理できますよね。元々のマスターに可能なら追加してもいいでしょうね。 以下のコードは、シート「異動簿」の例ではB列、C列が使用されていますから、D列をワークとして使いました。 '============================================================ Private Sub B_検索_Click() Application.ScreenUpdating = False With Worksheets("Sheet2") .Range("A2").Value = "*" & 検索番号.Value & "*" .Range("B2").Value = "*" & 検索氏名.Value & "*" .Range("f:h").ClearContents 'コピーエリアをクリア End With With Worksheets("異動簿") .Range("d:d").Formula = "=row()" .Range("d:d") = .Range("d:d").Value .Range("d1").Value = "行" ' ワーク列D列に行を設定 .Range("b:d").AdvancedFilter _ CriteriaRange:=Worksheets("Sheet2").Range("A1:B2"), _ Action:=xlFilterCopy, _ CopyToRange:=Worksheets("Sheet2").Range("F1"), _ Unique:=False .Range("d:d").ClearContents End With Show_リスト Application.ScreenUpdating = True End Sub '=============================================================== Sub Show_リスト() Dim d_num As Long With ThisWorkbook.Worksheets("Sheet2") 検索結果リスト.RowSource = "" d_num = WorksheetFunction.CountA(.Range("f:f")) If d_num > 1 Then '検索データが存在したら 検索結果リスト.RowSource = "Sheet2!F2:G" & CStr(d_num) End If End With End Sub '================================================================== Private Sub 検索結果リスト_DblClick(ByVal Cancel As MSForms.ReturnBoolean) With 検索結果リスト aRow = Worksheets("sheet2").Cells(.ListIndex + 2, 8) Worksheets("異動簿").Activate Worksheets("異動簿").Cells(aRow, 2).Select End With End Sub リストボックスをダブルクリックで異動簿の当該セルを選択するようにしました。 確認してください。 |
▼ichinose さん: こんにちは。 いつもお世話になっております。 今回もありがとうございました。 実は、D列は使われていて、列の順番を変えることができないのです。 ichinoseさんのコードでDまたはA列を WORKに使って(対象Rangeを連続列にして)やると、完璧でした。 しかし、異動簿に予備行は「U列」以降なのです。 そこで、 > .Range("B:C,U").AdvancedFilter _ または > .Range("B:C","U").AdvancedFilter のように指定してみましたが、だめでした。 このような、飛んでる列を指定するにはどのようにしたらよいでしょうか。 ご存知でしたら教えてください。 |
▼123 さん: こんにちは。 >実は、D列は使われていて、列の順番を変えることができないのです。 列の順番は、変えなくてもいいんですが・・・。 >しかし、異動簿に予備行は「U列」以降なのです。 >そこで、 >> .Range("B:C,U").AdvancedFilter _ >または >> .Range("B:C","U").AdvancedFilter >のように指定してみましたが、だめでした。 > >このような、飛んでる列を指定するにはどのようにしたらよいでしょうか。 >ご存知でしたら教えてください。 私なら、シートSheet2にそっくり(B列からU列までの条件合致データ)コピーしてしまいますが(コードは簡単そうだから)・・・。 B列、C列、U列のみをSheet2にコピーするようしました。 '=========================================================== Private Sub B_検索_Click() Dim rng As Range Dim rng1 As Range Application.ScreenUpdating = False With Worksheets("Sheet2") .Range("A2").Value = "*" & 検索番号.Value & "*" .Range("B2").Value = "*" & 検索氏名.Value & "*" .Range("f:h").ClearContents End With With Worksheets("異動簿") .Range("u:u").Formula = "=row()" .Range("u:u") = .Range("u:u").Value .Range("u1").Value = "行" .Range("b:c").AdvancedFilter _ CriteriaRange:=Worksheets("Sheet2").Range("A1:B2"), _ Action:=xlFilterInPlace, _ Unique:=False Set rng = .Range("b:b").SpecialCells(xlCellTypeVisible) Set rng = Union(rng, rng.Offset(0, 1), rng.Offset(0, 19)) rng.Copy Worksheets("Sheet2").Range("F1") .ShowAllData DoEvents .Range("u:u").ClearContents .Range("b1").Select End With Show_リスト Application.ScreenUpdating = True End Sub フィルタ結果を別コードでSheet2にコピーしています。 |
▼ichinose さん: こんにちは。 ありがとうございました。 完璧でした。 Set rng = Union(rng, rng.Offset(0, 1), rng.Offset(0, 19)) Unionというのは初めて見ました。 それに、それぞれのデータに(列)番号を振るという発想は私には でてきませんでした。 また、Unionのほかにも Formula = "=row()" Action:=xlFilterInPlace SpecialCells(xlCellTypeVisible) DoEvents などなど、知らないコードが続出です。 ichinoseさんは、これらのものを どこから仕入れるのですか? (私の持っている数冊の参考資料では載っていません) よろしければ、ichinoseさんの知識の入手方法を教えて いただけますでしょうか。 なにはともあれ、毎度毎度、助かります。 本当にありがとうございました。 |