[[20190131181747]] 『ソートにワイルドカードを使いたい』(Takato) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ソートにワイルドカードを使いたい』(Takato)

VBAで以下を実行した場合
keyWord1 = "50*" が有効になりますが

Sub Macro1()
keyWord1 = "50*"
keyWord2 = "55"
'keyWord3 = "60"

ActiveSheet.Range("A1").AutoFilter Field:=1, _

    Criteria1:=Array(keyWord1, keyWord2, keyWord3), Operator:=xlFilterValues
End Sub

keyWord3 = "60"を有効にすると
keyWord1 = "50*" が無効になります

解決法を教えていただけないでしょうか?
よろしくお願いいたします

< 使用 Excel:Excel2010、使用 OS:Windows7 >


いろいろ探してみたところ2つまではOKで3つ以上は部分一致は検索できないようです
何か回避の方法をご存知の方は折られませんか?
よろしくお願いいたします
(Takato) 2019/01/31(木) 18:39

 どういうデータが入力されているか教えていただければ、何かお役に立てるかもしれません。
(稲葉) 2019/01/31(木) 18:41

稲葉さん
メッセージありがとうございます
A列に入っているデータの中から複数の条件で検索させたいのです
50* は50A とか 50B とか複数存在するものを
ワイルドカードでソート対象にしたいのです
[*]を使わなければ3つ以上でもソートできますが
(実コードは30項目以上の「keyWord」を指定しています)
50 の後ろに何がつくかは毎回違うため[*]を使いたいのです
つまり、30項目以上の完全一致と、50* という1項目の不完全一致を一緒にソートしたいのです
よろしくお願いいたします
(Takato) 2019/01/31(木) 19:07

ソート?

オートフィルタでなく、フィルタオプションではだめでしょうか

(マナ) 2019/01/31(木) 19:10


 なるほど。
 では、フィルターオプション(AdvancedFilter)はいかがですか?
 以下のようなデータがあって、C列が抽出条件とします。

 実行前
     |[A]   |[B]|[C]   
 [1] |データ|   |データ
 [2] |    60|   |50*   
 [3] |    46|   |    60
 [4] |50C   |   |    55
 [5] |    50|   |      
 [6] |    44|   |      
 [7] |    55|   |      
 [8] |50A   |   |      
 [9] |    61|   |      
 [10]|50B   |   |      
 [11]|    64|   |      

 結果
     |[A]   |[B]|[C]   
 [1] |データ|   |データ
 [2] |    60|   |50*   
 [4] |50C   |   |    55
 [5] |    50|   |      
 [7] |    55|   |      
 [8] |50A   |   |      
 [10]|50B   |   |      

https://kosapi.com/post-4956/

 を参考にマクロの記録を取ると
Sub Macro1()
    Range("A1:A11").Select
    Range("A1:A11").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
        Range("C1:C4"), Unique:=False
End Sub
 という結果が得られました。

 参考になりますか?
(稲葉) 2019/01/31(木) 19:16

稲葉さん
コメントありがとうございます
すみません、説明の簡略のため
A列と書きましたが
実はこのシート、A〜CCまでみっちりデータが記載されており
オートフィルターでBB列にあるなかでのみ調べたいのです
検索対象もこのシートに書き込みはできないことになっています

不完全な情報を書き込み申し訳ございませんでした
(Takato) 2019/01/31(木) 19:31


 いや、別シートに抽出条件かけますよ?
Sub Macro8()
    Sheets("Sheet1").Select
    Range("A1:A11").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
        Sheets("Sheet2").Range("A1:A4"), Unique:=False
End Sub

 Sheet1にデータ、Sheet2に抽出条件
 Sheet1を選択してマクロの記録開始
 データ範囲を選択、抽出範囲をSheet2に移動して選択
 実行

 で上記の記録が取れます。

 やってみてくだせい
(稲葉) 2019/01/31(木) 19:36

作業BOOKは毎回配布されてきて
つど使用するBookが違いますので
マクロはアドインで対応するつもりでした

別シートを自動作成して
フィルタ適用後削除で
対応できるように考えてみます

ありがとうございました
(Takato) 2019/01/31(木) 20:03


 抽出条件は別ブックでも行けた気がするので、専用のブックに
 コードと条件かいておけばいいんじゃないですかね?
 今試せないので、明日チャレンジしてみますわ
(稲葉) 2019/01/31(木) 20:18

 別ブックに抽出条件とプログラム書いて実験したら、うまくいったので紹介しておきます。
    Sub 別ブックのフィルタオプション()
        Dim wb As Workbook
        Dim fn As String
        ChDrive "C"
        ChDir "C:\" '★ここに、いつも保存しているフォルダのパスを入れておく
        fn = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")

        If Not fn = "False" Then
            'データブックが開かれているかチェックし、開かれていなければ開く
            On Error Resume Next
            Set wb = Workbooks(Dir(fn))
            On Error GoTo 0
            If wb Is Nothing Then Set wb = Workbooks.Open(fn)

            'フィルタオプションの実行
            'CurrentRegion は指定したセルでCtrl+*を押したセル範囲 コード上では、A1を選択してCtrl+*を押した状態
            'データブックの項目名より上に何かしら入力があると、正しく項目名が取れないのでエラーになります。
            wb.Sheets("●").Range("A1").CurrentRegion.AdvancedFilter _
                Action:=xlFilterInPlace, _
                CriteriaRange:=ThisWorkbook.Sheets("Sheet1").Range("A1").CurrentRegion, _
                Unique:=False
        End If
    End Sub
(稲葉) 2019/02/01(金) 08:54

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.