[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『(マクロ) オートフィルタで条件3+ワイルドカードで抽出方法』(マイン)
お世話になっております。
検索値が3つ以上ある場合では、配列を使用すれば抽出可能とのことで
以下のようにしてみました。
ただ、問題は、"東○○○"とすれば抽出出来るのですが、「○○○」の部分をワイルドカードにした場合エラーがでます。
皆様なにとぞ、アドバイスをお願いします。
Dim array1(2) As String array1(0) = "東*" array1(1) = "西*" array1(2) = "南*"
.Range("A1").AutoFilter Field:=25, Criteria1:=array1, Operator:=xlFilterValues
< 使用 Excel:Excel2010、使用 OS:Windows10 >
フィルタオプション(AdvancedFilter)でどうでしょう? Sub Macro4() Dim dt As Range Dim cri As Range ActiveSheet.ShowAllData Set dt = Range("A1").CurrentRegion Set cri = Cells(1, Columns.Count).End(xlToLeft).Offset(, 1).Resize(2) cri(2).Formula = "=OR(LEFT(A2)={""東"",""南"",""西"",""北""})" dt.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=cri, Unique:=False cri.ClearContents End Sub
(稲葉) 2019/04/08(月) 08:59
エラーメッセージを教えてください 省略しないで、実行可能で、エラーが再現するコードを載せてください (でれすけ) 2019/04/08(月) 09:08
失礼しました、以下が並び替えと抽出のコードです。
エラーと申しましたが
具体的には、格納された値はワイルドカードと認識されずに?、不一致として全てのデータが非表示になってしまいました。
arrayにそれぞれ、ワイルドカードを使用せずに全ての抽出条件を記載すれば正常に抽出されます。
arrayを使用すれば3つ以上の抽出が可能とありましたので、もしかしたらワイルドカードも使えるのでは?と思い書き込みしました。
Sub 集計処理()
Dim sh1 As Worksheet: Set sh1 = Worksheets("Source")
With sh1 If .FilterMode = True Then .ShowAllData End If If .AutoFilterMode = False Then .Range("A1:Y1").AutoFilter End If
Dim array1(2) As String array1(0) = "東*" array1(1) = "西*" array1(2) = "南*" '昇順で項目ごとひとかたまりにする .Range("A1").Sort key1:=.Range("Y1"), order1:=xlAscending, Header:=xlYes .Range("A1").AutoFilter Field:=25, Criteria1:=array1, Operator:=xlFilterValues
End With End Sub (マイン) 2019/04/08(月) 09:57
ありがとうございます。
フィルタオプション(AdvancedFilter)ですね。確かにネットでも多数掲載がありました。
作業Sheetがあるので、そこに抽出条件を記載し参照させる方法も検討したいと思います。
(マイン) 2019/04/08(月) 10:33
実行時エラーがでるのと、狙ったとおりの動作をしないのでは、意味が違いいます。
ワイルドカード使うと、配列で指定しても配列要素2つまでしか対応してないようです。 稲葉さんの提案のように、AutoFilterを使うのがいいと思います。 (でれすけ) 2019/04/08(月) 10:40
ご指摘ありがとうございました。
やはり、フィルタオプションで挑戦してみます。
(マイン) 2019/04/08(月) 10:58
抽出条件をマスタに配置することで幾つもの条件に対応できて有能でした。
以下コード。
Sub 集計処理()
Dim sh1 As Worksheet: Set sh1 = Worksheets("Source") Dim sh2 As Worksheet: Set sh2 = Worksheets("集計") Dim sh3 As Worksheet: Set sh3 = Worksheets("マスタ")
With sh1 If .FilterMode = True Then .ShowAllData End If If .AutoFilterMode = False Then .Range("A1:Y1").AutoFilter End If
'部署 .Range("A1").Sort key1:=.Range("Y1"), order1:=xlAscending, Header:=xlYes .Range("A1:Y" & .Cells(Rows.Count, 1).End(xlUp).Row).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ sh3.Range("H1:H" & sh3.Cells(Rows.Count, 8).End(xlUp).Row), Unique:=False '雇用 .Range("A1").Sort key1:=.Range("X1"), order1:=xlAscending, Header:=xlYes .Range("A1:Y" & r).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ sh3.Range("G1:G" & sh3.Cells(Rows.Count, 7).End(xlUp).Row), Unique:=False
'表示している行番号を取得 Dim t, e As Long t = 2 While .Rows(t).Hidden '先頭行 t = t + 1 Wend e = .Cells(.Rows.Count, "E").End(xlUp).Row '最終行 '転記(上下には非表示セルある) .Range(.Cells(t, 1), .Cells(e, 3)).Copy sh2.Cells(2, 1).PasteSpecial Paste:=xlPasteValues 'A社員番号 B社員名 C年月日 .Range(.Cells(t, 23), .Cells(e, 23)).Copy sh2.Cells(2, 4).PasteSpecial Paste:=xlPasteValues 'W勤務実績 .Range(.Cells(t, 7), .Cells(e, 7)).Copy sh2.Cells(2, 5).PasteSpecial Paste:=xlPasteValues 'G勤務区分 .Range(.Cells(t, 13), .Cells(e, 14)).Copy sh2.Cells(2, 6).PasteSpecial Paste:=xlPasteValues 'M所定内労働 N実働時間 .Range(.Cells(t, 21), .Cells(e, 21)).Copy sh2.Cells(2, 8).PasteSpecial Paste:=xlPasteValues 'Uメモ .Range(.Cells(t, 25), .Cells(e, 25)).Copy sh2.Cells(2, 9).PasteSpecial Paste:=xlPasteValues 'Y部署 End With
End Sub
(マイン) 2019/04/08(月) 13:13
'雇用
.Range("A1").Sort key1:=.Range("X1"), order1:=xlAscending, Header:=xlYes .Range("A1:Y" & .Cells(Rows.Count, 1).End(xlUp).Row).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ sh3.Range("G1:G" & sh3.Cells(Rows.Count, 7).End(xlUp).Row), Unique:=False (マイン) 2019/04/08(月) 13:30
(もこな2) 2019/04/09(火) 19:10
Sub 集計処理_乙() Dim MyRNG As Range Dim array1() As String '動的配列として宣言 Dim i As Long
With Worksheets("Source") .AutoFilterMode = False 'オートフィルタ強制解除 .Range("A1:Y1").AutoFilter '抽出せずにオートフィルタだけ設定
'▼ワイルドカードを含まない配列を作成 For Each MyRNG In Intersect(.AutoFilter.Range.Offset(1), .Range("Y:Y")) If MyRNG.Value Like "東*" Or MyRNG.Value Like "西*" Or MyRNG.Value Like "南*" Then ReDim Preserve array1(i) MyArr(i) = MyRNG.Value i = i + 1 End If Next MyRNG
'昇順で項目ごとひとかたまりにする(もとのまま) .Range("A1").Sort key1:=.Range("Y1"), order1:=xlAscending, Header:=xlYes .Range("A1").AutoFilter Field:=25, Criteria1:=array1, Operator:=xlFilterValues End With End Sub
でれすけさんの
>ワイルドカード使うと、配列で指定しても配列要素2つまでしか対応してないようです。
をヒントにして、ワイルドーカードを【含まない】配列ならOKと考えた場合、こんな感じでも処理できそうです。
ただ、
>抽出条件をマスタに配置することで幾つもの条件に対応できて有能でした。
とのことですから、オートフィルタでやる場合、そちらの対応も必要になりそうです。
(もこな2) 2019/04/10(水) 05:46
すみません見落としていました。
ありがとうございます。私もオートフィルタ好きです!!。
早速確認したいと思います。
(マイン) 2019/04/11(木) 22:28
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.