オートフィルタを操作するマクロの作成方法について

このQ&Aのポイント
  • オートフィルタを操作するマクロを作成する際に、複数の条件で検索し、特定の文字を含むデータを取得する方法を教えてください。
  • 問題のあるマクロを紹介し、その問題点について詳しく説明しました。
  • 改善されたマクロの作成方法やオートフィルタを使用して別のシートのデータを操作する方法について、アドバイスをいただけると助かります。
回答を見る
  • ベストアンサー

オートフィルタを操作するマクロについて

いつもお世話になっております。 現在オートフィルタを操作するマクロを作成中ですが、うまく動作してくれず、悩んでおります。 「検索画面」シートのA1から文字で検索条件を入力し、その答えを「元データ」のシートでオートフィルタを使って導き出すことをしています。 私が作ったマクロは以下の通りです。 Sub フィルタオプション設定() Dim LastRow As Long, LastColumn As Long Dim myData As Range Dim myCriteria As Range Set myCriteria = Worksheets("検索画面").Range("A1").CurrentRegion Sheets("元データ").Select Selection.AutoFilter Field:=26, Criteria1:=myCriteria, Operator:=xlOr End Sub これですと、「~を含む」という答えがでないのと、複数設定しても最後に入力した文字しか検索をかけないのです。 結局のところ、 (1)複数に加え、 (2)「~を含む」という条件で、 (3)別シートにあるデータをオートフィルタによって操作する マクロをご教示ください! よろしくお願いいたします。

  • acmr
  • お礼率87% (84/96)

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >A2の空白まで検出しちゃいました。 こちらで試してみましたが、たぶん、検索値に空白文字が入っているのではないかと思っていますが、いかがでしょうか?それとも、データの範囲に空白文字が入っているとなると、結構ややこしいような気がします。 検索条件側は、 myCriteria1 = Trim(.Range("A1").Value) myCriteria2 = Trim(.Range("A2").Value) こんな風にすると、空白文字が除去できますが、空白文字自体の除去は、最初に作っていたけれども、ややこしくなるので途中で、そこまでは必要はないとしてアップロードしなかったのです。要するに、xlOr と xlAnd の使い分けですね。 ただ、次のコードがありますから、それは、後回しにして、次を試してください。 >3つ以上の条件で検出したいのですが、できますようでしょうか? こんな内容になります。 条件を増やしたいなら、以下の5の部分を増やしてください。   arData(5) As String  (5 + 1) が、検索条件の数になります。システム的には、確か、Excel 2003 までですと、30個程度だったと思います。 なお、フィルタオプションですから、ドロップダウン・ボタンは出てきません。 クライテリアの場所を、"AZ1:AZ2" を使っていますが、もうデータの範囲のMyData に隣り合わせにならなければ、どこでもよいです。 この種のものは非常に簡単なのですが、少しテクニックが必要なのと、セルのそれぞれの場所の特定が、慣れないとややこしいものです。 --------------------------------------------------- Sub フィルタオプション設定2()   Dim myData As Range   Dim arData(5) As String '検索の入れ物は6個   Dim i As Integer   Dim j As Integer   Dim v As Variant   Dim a As String, f As String      Dim KenSakuRetu As Variant      KenSakuRetu = 26 '検索の対象列      Set myData = Worksheets("元データ").Range("A1").CurrentRegion      With Worksheets("検索画面")    For Each v In .Range("A1").CurrentRegion.Columns(1).Cells      arData(i) = Trim(v.Value)      i = i + 1    Next v   End With   '相対参照にするのがコツ   KenSakuRetu = myData.Cells(2, KenSakuRetu - 1).Address(0, 0)   For j = 0 To UBound(arData())    If arData(j) <> "" Then     a = a & "CountIf(" & KenSakuRetu & ",""*" & arData(j) & "*""),"    End If   Next j   f = "= OR(" & Mid$(a, 1, Len(a) - 1) & ")"   With myData    .Range("AZ1:AZ2").ClearContents    .Range("AZ1:AZ2").Cells(2).FormulaLocal = f    .Range("A1").CurrentRegion.AdvancedFilter _         Action:=xlFilterInPlace, _         CriteriaRange:=.Range("AZ1:AZ2"), _         Unique:=False   End With   Set myData = Nothing End Sub

acmr
質問者

お礼

すごい。。。。 こんなの自力では到底無理です。 一文一文をみて、確認しながらやってみます! ご教示、誠にありがとうございました!

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 >Set myCriteria = Worksheets("検索画面").Range("A1").CurrentRegion このようにして、Criteria の領域を取っている場合は、フィルタオプションがよいですが、ただ、Criteria 自体の検索式が書くのが分からないと、出来ませんね。 今回は、オートフィルタでやってみました。この場合は、InputBox でもよさそうです。 Sub オートフィルタオプション設定()      'Dim LastRow As Long, LastColumn As Long   'Dim myData As Range   Dim myCriteria1 As String   Dim myCriteria2 As String   With Worksheets("検索画面")     myCriteria1 = .Range("A1").Value     myCriteria2 = .Range("A2").Value   End With   If myCriteria1 = "" And myCriteria2 = "" Then     MsgBox "検索値が入っていません", 48     Exit Sub   End If   '含むの設定   If myCriteria1 <> "" And Not myCriteria1 Like "~**~*" Then     myCriteria1 = "*" & myCriteria1 & "*"   End If      If myCriteria2 <> "" And Not myCriteria2 Like "~**~*" Then     myCriteria2 = "*" & myCriteria2 & "*"   End If      With Worksheets("元データ")     .Range("A1").CurrentRegion.AutoFilter 26, myCriteria1, xlOr, myCriteria2   End With End Sub

acmr
質問者

補足

Wendy02様、ありがとうございます! 含むの設定ができました! ただA1にしか条件をいれない場合、A2の空白まで検出しちゃいました。 また、複数条件は2つまでですか? 3つ以上の条件で検出したいのですが、できますようでしょうか? 重ねてご教示頂ければ幸いです。

関連するQ&A

  • Excelマクロ オートフィルター条件設定で不等号を使いたい

    Excelマクロ オートフィルター条件設定で不等号を使いたい 請求シートより抽出条件シートに条件を設定し、抽出シートにコピーするマクロ を作成しています。 抽出条件に比較演算子の不等号<>を使った場合、条件が無視されてしまいます。 どのようにしたら良いでしょうか? 請求シートのA列には会社番号が数字4桁で入力されています。 抽出条件シートA5セルに下記の条件を設定した場合、 1と2の場合は上手くフィルターが機能しますが、3の不等号を 使った場合は機能しません。どなたか宜しくお願いします。 1:1000 2:>1000 3:<>1000 Sub テスト() Dim LastRow As Long, LastColumn As Long Dim myData As Range Dim myCriteria As Range With Worksheets("請求") LastColumn = .Cells(5, Application.Columns.Count).End(xlToLeft).Column LastRow = .Cells(Application.Rows.Count, "A").End(xlUp).Row Set myData = .Range("A5", .Cells(LastRow, LastColumn)) End With Set myCriteria = Worksheets("抽出条件").Range("A5").CurrentRegion Worksheets("抽出").Range("A6:R1000").ClearContents myData.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=myCriteria, _ CopyToRange:=Worksheets("抽出").Range("A5:R5"), Unique:=False Set myData = Nothing Set myCriteria = Nothing End Sub

  • オートフィルタのマクロについて

    オートフィルタのマクロを組もうとしているのですが、フィルタ条件に別シートのセルの値を入れたいのですが、そこがどうもうまくいきません。 作成したマクロは以下の通りです。 Sub 累計計算マクロ() Dim aRange As Range, bRange As Range, i As Date Set aRange = Sheets("累計").Range("B1") Set bRange = Sheets("累計").Range("B2") i = aRange.Value Sheets("クイーンエステート").Activate Range("A13:L13").Select Selection.AutoFilter Selection.AutoFilter Field:=2, Criteria1:="<=i", Operator:=xlAnd End Sub どなたか助けてください! 宜しくお願い致します。

  • マクロ オートフィルタで困っています。

    マクロ オートフィルタで困っています。 1列目と2列目からそれぞれ条件をフィルタで抽出し、抽出された行を削除するマクロを組んだのですが(下記)、Bの条件が表にない場合に2行目から下が全て削除されてしまいます。 元の表は毎週変わるため、抽出する条件があるかないかはその時次第です。 オートフィルタにこだわってはいませんが、その他の抽出方法もいまいち分からず……。 どのようにすればよいのか、教えていただけますでしょうか。 宜しくお願い致します。 <マクロ> Sub Macro() Selection.AutoFilter Field:=1, Criteria1:="A" Selection.AutoFilter Field:=2, Criteria1:="B", Operator:=xlAnd Dim gyou(1) As Long gyou(0) = 2 gyou(1) = Range("A1").CurrentRegion.Rows.Count Rows(gyou(0) & ":" & gyou(1)).Select Selection.Delete Shift:=xlUp End Sub

  • EXCEL2000で作成したマクロが2007で動作しない

    EXCEL2000で作成したマクロがEXCEL2007上で動作しません。 2つのシートに入ったデータを,「抽出」シートにコピー後, 抽出条件に合わせて抽出するというものなのですが, 「Sheet1」で最終行を取得するところで,正しい範囲を 選択しません。どこが間違えているのか,ご指南頂けないでしょうか? お願いいたします。 下には,正しい結果が出ない所までを貼りつけました。 Sub フィルタオプション() Dim LastRow As Long, LastColumn As Long Dim myData As Range Dim myCriteria As Range Sheets("Sheet1").Select Rows("1:1").Select Selection.Copy Sheets("抽出").Select Rows("3:3").Select ActiveSheet.Paste If Worksheets("Sheet1").FilterMode = True Then   Worksheets("Sheet1").ShowAllData End If With Worksheets("Sheet1") LastRow = .Cells(Application.Rows.Count, "A").End(xlUp).Row End With Sheets("Sheet1").Select Range(Rows(2), Rows(LastRow)).Select Selection.Copy Range("A1").Select Sheets("抽出").Select Range(Rows(4), Rows(4)).Select Selection.Insert Shift:=xlDown

  • オートフィルタ 検索

    オートフィルタで三つの条件でデータを抽出するマクロを作っています 以下のような記述は誤りでしょうか? ActiveSheet.Range("$B$2:$D$114").AutoFilter Field:=1, Criteria1:="=02722*" _ , Operator:=xlOr, Criteria2:="=02729*" _ , Operator:=xlOr, Criteria3:="=02737*" 表はこのようなものです ↓キー 番号      名前      値 027**     **     * 027**     **     * 027**     **     * ・ ・ ・

  • EXCELのオートフィルターマクロについて

    初歩的な質問で恐縮です。 sheet1にデータ一覧を作成(仮にシート名を「データシート」とします)し、 sheet2へ検索条件を入力するセルとコマンドボタンを配置し、sheet1のデータを「オートフィルタで検索」するマクロを作成しました。 マクロの検証も行い動作の確認も行いマクロの実行してみると、ちゃんとフィルタ処理されており全て完璧!となりました。 ところが、他人への配布も予定していたので、データの改ざんを防止するため、データシートをシート保護して実行したところ、「ロックされているため実行できません」旨のエラーになってしまいました。 やはり、シートの保護を行なってしまうと、マクロであってもオートフィルタ機能は使用できないのでしょうか? 何か解決(保護状態でもオートフィルタ機能が使用可能)方法はありませんでしょうか? ご教授お願いいたします。

  • オートフィルタ適用後のマクロ実行

    過去の「Excel グラフのプロットからデータを見つける」という質問に回答されていたプロットされたマーカーをひとつだけ選択してマクロを実行は出来たのですが、オートフィルター適用後のグラフに対してはうまくいきません。どのように修正したら良いのかご教授ください。 Sub Test1() Dim myPoint As Point Dim myFormula As String Dim myPDLname As String Dim myWsName As String Dim x As String Dim y As String Dim n As Integer If TypeName(Selection) <> "Point" Then Exit Sub If TypeName(Selection) = "Point" Then Set myPoint = Selection myFormula = myPoint.Parent.Formula With myPoint .HasDataLabel = True myPDLname = myPoint.DataLabel.Name .HasDataLabel = False End With n = Split(myPDLname, "P")(1) x = Split(myFormula, ",")(1) y = Split(myFormula, ",")(2) myWsName = Split(x, "!")(0) End If MsgBox myWsName & "!" & Range(x)(n).Address & ":" & Range(y)(n).Address Sheets(myWsName).Select Sheets(myWsName).Range(Range(x)(n), Range(y)(n)).Select End Sub

  • オートフィルタをマクロで書いたのですが、一部うまくいかなくて困っていま

    オートフィルタをマクロで書いたのですが、一部うまくいかなくて困っています。 わかる方がいらしたらぜひご教授ください。 商品情報というブックがあり、抽出シート(1枚目)と2枚目のシートにデータが入っています。 2枚目のシートのフィールド名を抽出シートのA1を基準に貼り付けています。 条件をA1:I2に入力し、2枚目のシートの条件に合うものを抽出シートのA5以降に取り出すマクロを書いています。次回マクロを起動させたときにA5以降にデータがあれば削除させます。 そこで問題なのですが、A1:I2の条件だとA列からI列までのフィールド名に対する条件を 1行入力することができますが、同じ行になるのでAND条件になってしまいます。 本当は条件列をI3までにして、条件を2行にわたって書いて または条件も検索したいのです。 ただ、または条件は入力する場合と入力がない場合があります。 条件をA1:I3(3行目)に変更してマクロを実行すると、または 条件がある場合はちゃんとでるのですが、条件がない場合はすべてでてきてしまいます。 どのようにすればA1:I3に変更して、2行目と3行目に条件があった場合はその条件で該当するものを 抽出し、特に3行目に条件がない場合は2行目だけの条件で抽出できるのでしょうか? (2行目のAnd条件検索と3行目のまたは条件検索ができますでしょうか?) Dim myRow1 As Long, myRow2 As Long myRow1 = Sheets(2).Range("A" & Rows.Count).End(xlUp).Row myRow2 = Sheets("抽出").Range("A" & Rows.Count).End(xlUp).Row If myRow2 >= 5 Then Sheets("抽出").Range("A5:I" & myRow2).ClearContents Sheets("抽出").Range("A5:I" & myRow2).ClearFormats End If Sheets(2).Range("A1:I" & myRow1).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Worksheets("抽出").Range("A1:I2"), CopyToRange:=Sheets("抽出").Range("A5"), Unique:=False End Sub

  • VBでエクセルを操作(オートフィルタ)

    CSVファイルをエクセルで開き、A列にオートフィルタをかけます。TextBox1に入力した項目と一致させるために、下のようなものをつくってみました。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim app As Object Dim book As Object Dim sheet As Object app = CreateObject("Excel.Application") app.application.visible = True book = app.Workbooks.Open("C:\XXXX.csv") sheet = book.Worksheets(1) With sheet.Range("A1") If .AutoFilter Then .AutoFilter(field:=1, Criteria1:="TextBox1.text") End With End Sub Textbox1に入力して実行してもヒットしません。 "TextBox1.Text"の代わりに、A列にある項目を入れると、正常にオートフィルタが実行されます。 皆様教えて下さい。よろしくお願い致します。

  • オートフィルタ抽出データをコピーするマクロについて

    マクロについて勉強中の者です。 "Sheet1"にあるデータをオートフィルタで抽出し、 "Sheet2"に抽出データのみをコピーをしたいと思っています。 Range("A10:G59").Select Selection.ClearContents With Worksheets("Sheet1").Range("A1") .AutoFilter .AutoFilter Field:=1, Criteria1:="○" .CurrentRegion.SpecialCells(xlCellTypeVisible).Copy Worksheets("Sheet2").Range("A9") End With End Sub としてみたのですが、 これを実行すると、オートフィルタが1行目(A1)ではなく、 2行目で設定されてしまい、抽出データがずれてしまいます。    A    B    C 1 品 名  仕入先  発注数 ←タイトル行に設定したい 2 りんご  ヤマト   10  ← この行に▼が設定される 色々調べた結果のマクロなので、どこが悪いのか見当がつきません。 解りやすく教えていただける方がおられましたら、よろしくお願い致します m(__)m

専門家に質問してみよう