『2回目解除動作について』(kenji) 2度目押し部分が解りません。 ご指導、よろしくお願いします。 1回目押して抽出します。ココまではOKと思います。 2回目はAutoFilter解除 AutoFilterモードの解除共 Sub 抽出() Dim oList As ListObject Dim ixCol As Long Dim sFind As String Dim rngTarget As Range If TypeName(Selection) <> "Range" Then Exit Sub Set rngTarget = Selection If rngTarget.CountLarge > 1 Then Exit Sub Set oList = ActiveSheet.ListObjects(1) If Intersect(oList.DataBodyRange, rngTarget) Is Nothing Then Exit Sub ixCol = 3 With oList If .AutoFilter.Filters(ixCol).On Then .AutoFilter.ShowAllData Else sFind = InputBox("キーワードを入力してください。(検索【C列】)      【先頭5桁から検索します。】") If StrPtr(sFind) = 0 Then Exit Sub .Range.AutoFilter Field:=ixCol, Criteria1:="=*" & sFind & "*" End If End With End Sub < 使用 Excel:Excel2016、使用 OS:Windows10 > ---- >.AutoFilter.ShowAllData ↓ .Range.Worksheet.ShowAllData 2003しか、今インストールしてないので、試してないですが、 こうではないですかね? 2003ではShowAllDataメソッドはワークシートに対して命令するようです。 (まっつわん) 2018/04/03(火) 19:11 ---- (まっつわん)さん 連絡ありがとうございます。 投稿のマクロは、AutoFilterモードが起動していれば動いてくれました。 > >.AutoFilter.ShowAllData ↓ >.Range.Worksheet.ShowAllData こちらに関しては、どちらでも動作しています。(理解できていませんが?) 教えていただきたいのは、マクロで 1.ボタンを押しAutoFilterモードする。 2.InputBox入力し、抽出する。 3.確認作業終了後ボタンを押し抽出状態解除 AutoFilterモード解除 という動作をさせたいのです。お忙しいところすみませんが よろしくお願いします。 ActiveSheet.Range("A4:AG600").AutoFilter (kenji) 2018/04/03(火) 19:36 ---- autofiltermode=false スペルがあっていれば (SoulMan) 2018/04/03(火) 20:22 ---- (SoulMan)さん ありがとうございます。 以下にて1回目クリックでは、抽出できました。が 2回目クリックで★部分黄色反転 "オブジェクト変数またはWithブロック変数が設定されていません"とエラーに なります。対応方法よろしくお願いします。 Sub 抽出() Dim oList As ListObject Dim ixCol As Long Dim sFind As String Dim rngTarget As Range Range("A4:AG4").AutoFilter ’追加 If TypeName(Selection) <> "Range" Then Exit Sub Set rngTarget = Selection If rngTarget.CountLarge > 1 Then Exit Sub Set oList = ActiveSheet.ListObjects(1) If Intersect(oList.DataBodyRange, rngTarget) Is Nothing Then Exit Sub ixCol = 3 'rngTarget.Column With oList If .AutoFilter.Filters(ixCol).On Then '★ .Range.Worksheet.ShowAllData Else sFind = InputBox("キーワードを入力してください。(検索【C列】)      【先頭5桁から検索します。】") If StrPtr(sFind) = 0 Then Exit Sub .Range.AutoFilter Field:=ixCol, Criteria1:="=*" & sFind & "*" End If End With End Sub (kenji) 2018/04/04(水) 02:00 ---- え〜っと、、 どこかで、 if autofiltermode=true then とかで、判断されたらいい様に思います 夜中に目が覚めました 想像ですみません (SoulMan) 2018/04/04(水) 03:14 ---- 少しちがいますが、 昔、書いたコードがあったので載せておきます 参考になりませんでしょうか? [[20050831235213]] (SoulMan) 2018/04/04(水) 03:22 ---- (SoulMan)さん 深夜にありがとうございます。 >どこかで、 >if autofiltermode=true then いろいろWEB参考に試したのですが・・・ よい結果えられませんでした。 どこに if autofiltermode=true then は入れれば 可能になりますか。聞いてばかりですが よろしくお願いします。 (kenji) 2018/04/04(水) 04:20 ---- おはよございます With oList これの前でしょうか? あっ、シート.アートフィルターモード としてくださいね では、では、 (SoulMan) 2018/04/04(水) 05:53 ---- なんか中途半端なアドバイスをして かえって混乱させちゃいましたね すみません そのエラーはフィルターがかかっていないからだろうと 思うのですが 一回目は、上手く行くとの事なので フィルターモードでフィルターが掛かっているか 判断されてロジックを組まれてはどうでしょうか? と、提案したかったのです わかりますでしょうか? ピント外れでしたらすみません (SoulMan) 2018/04/04(水) 06:12 ---- 最初は、フィルターの解除という事だったので http://www.239-programing.com/excel-vba/basic/basic078.html かなと思ったのです いい結果が出ることを期待しています (SoulMan) 2018/04/04(水) 06:51 ---- オートフィルタ関係でお悩みのようなので、一度この辺を読んでみるとよいかもです。 http://officetanaka.net/excel/vba/tips/tips155.htm ちなみに、わたしがVBAでオートフィルタを操作するときは、抽出状態であるかどうかにかかわらず、オートフィルタが設定されていれば、解除してからオートフィルタを設定しなおすことで、抽出状態をいちどクリアにしていますので、そういうアプローチもアイデアの一つとして考えてみると良いかもです。 (もこな2) 2018/04/04(水) 12:53 ---- with sheets("sheets1") .range("a1").autofilter if .autofiltermode then msgbox "on" else msgbox"off" end if .autofiltermode =false end with (SoulMan) 2018/04/04(水) 13:04 ---- (もこな2)さん ありがとうございます。 参考Webも見てみたのですが応用が利かないようです。 いろいろ試しましたがgiveです。 ボタン2回目に押すと★部分でやはり止まります。 よろしくお願いします。 2回目で元の状態に戻したい。 Sub 抽出() Dim oList As ListObject Dim ixCol As Long Dim sFind As String Dim rngTarget As Range ' Selection.AutoFilter ' Else ' Range("A4:AG4").AutoFilter If TypeName(Selection) <> "Range" Then Exit Sub Set rngTarget = Selection If rngTarget.CountLarge > 1 Then Exit Sub Set oList = ActiveSheet.ListObjects(1) If Intersect(oList.DataBodyRange, rngTarget) Is Nothing Then Exit Sub ixCol = 3 'rngTarget.Column With Sheets("一覧") .Range("A4:AG4").AutoFilter If .AutoFilterMode Then .AutoFilterMode = True '.AutoFilterMode = False End If End With With oList If .AutoFilter.Filters(ixCol).On Then ★ .Range.Worksheet.ShowAllData Else sFind = InputBox("キーワードを入力してください。(検索【C列】)      【先頭5桁から検索します。】") If StrPtr(sFind) = 0 Then Exit Sub .Range.AutoFilter Field:=ixCol, Criteria1:="=*" & sFind & "*" End If End With End Sub (kenji) 2018/04/04(水) 13:50 ---- テーブルの.ShowAutoFilterプロパティの状態を見ることで意図した条件分岐が出来ると思います。 Sub 抽出() Dim oList As ListObject Dim sFind As String Dim rngTarget As Range Const cixCol As Long = 3 If TypeName(Selection) <> "Range" Then Exit Sub Set rngTarget = Selection If rngTarget.CountLarge > 1 Then Exit Sub Set oList = ActiveSheet.ListObjects(1) If Intersect(oList.DataBodyRange, rngTarget) Is Nothing Then Exit Sub With oList If .ShowAutoFilter Then .Range.AutoFilter Else sFind = InputBox("キーワードを入力してください。(検索【C列】)      【先頭5桁から検索します。】") If StrPtr(sFind) = 0 Then Exit Sub .Range.AutoFilter Field:=cixCol, Criteria1:="=*" & sFind & "*" End If End With End Sub >>.Range.Worksheet.ShowAllData >こちらに関しては、どちらでも動作しています。(理解できていませんが?) 難しい暗号を操ってるわけではないので、理解しましょう。 ShowAllDataメソッドはワークシートに対して行う命令なので、 「テーブルのセル範囲のあるワークシートのデータをすべて表示」と命令してやればいいだけです。 あ、リストオブジェクトにもありましたね。 でも、 「テーブルのオートフィルターのデータを全て表示」 とするのですからオートフィルターが存在しないと、 当然コケます。 シート対して命令するなら、それはいつでも存在している (シートが無ければその上のテーブルもないはず)ので、 エラーにならないという事だと思います。 こういうのは、「こういう時はこうする」というようなHowToを暗記する勉強法では、 いづれ頓挫します。 エクセルのオブジェクト構造を理解し必要に応じて自分で調べられるようになるのが肝要です。 折角、変数にちゃんとクラスをListObjectと宣言して、 ちゃんと代入されているので、 ブレークポイントを With oList の行辺りに設定して実行みてください。 そして、プログラムの実行が一時停止したままの状態で、 ローカルウィンドウの(非表示にしてたら表示してください。)oListの左の 「+」をクリックしてみてください。 そうすると、oListに代入されているテーブルを構成するプロパティがツリー状に表示されると思います。 この中でそれっぽい名前の(今回の場合はAutoFillterが付いた)プロパティを探します。 そうすると、 oListの直下にAutoFillterというのがありますね。 これを、手動でオートフィルターを解除したり設定したりしながら、 監視していると、 オートフィルターが掛かってないとNothingになっていて、 オートフィルターが掛かっていると左に「+」が出て下位のオートフィルターを構成するプロパティが 見れるようになります。 なので、 条件分岐の文章としては、 「もし、テーブルのオートフィルターオブジェクトが存在するなら」 VBA語に翻訳したら →If oList.AutoFillter Is Nothing Then という書き方もありそうです。 ですが、 もう一つ ShowAutoFilter というプロパティもありますね。 これはなんだろうと思ったらヘルプで検索します。 >Excel 開発者用リファレンス >ListObject.ShowAutoFilter プロパティ >オートフィルターを表示するかどうかを示します。ブール型 (Boolean) の値を使用します。値の取得および設定が可能です。 なので、このプロパティの値を見て「▼」が表示されているかどうかが取得できるので、 こちらを使ってもいいかなと思います。 また、 オブジェクトブラウザも使って AutoFilter を検索してみるのも有効でしょう。 どういうクラス(≒オブジェクト)にそういうプロパティが存在するか検索したりして、 エクセルのオブジェクト構造がどうなっているか調べることが可能になってます。 拙い説明ですが、解りますでしょうか。。。? 当然なかなか独りで最初からこういうことが出来ないとは思いますが、 ヘルプなどもとりあえずドンドン見るようにしてください。 なかなか難解な文章で理解しがたいですが、 読めるようになれば脱初心者、 独りで知りたい情報を調べられるようになれれば脱初心者と言えると思います。 あるときなんとなく意味が読み取れる時が来ると思います。 ヘルプは、初心者のために書かれてません。 プログラムを書く人(=書ける人)への参考資料です。 (まっつわん) 2018/04/04(水) 15:40 ---- (まっつわん)さん ありがとうございます。 If文も、違うんですね If .AutoFilter.Filters(ixCol).On Then ★ ↓ If .ShowAutoFilter Then マクロは難しいですね いつになってもなじめないです。(方法が何通りもあり・・) 指導文書、長文にていただき重ねてありがとうございます。 少しでも、頭に入れるようじっくり確認しながら実行してみます。 まだまだ、引っかかってしまうかもしれません その節は、よろしくお願いします ありがとうございました。 (kenji) 2018/04/04(水) 17:33 ---- >If文も、違うんですね 違うというか、オートフィルターが設定されてないと、 オートフィルターの抽出条件の設定なんて存在しないのですから、 それを見て条件分岐はまずいですね。 >マクロは難しいですね ん〜。難しく考えすぎかも? マクロって、ただの作業手順書を書くだけですよ? 他人に仕事をしてもらうために、文章で指示するだけです。 まぁ、慣れないと、慣れて意識してない部分の作業の流れとか、 上手く文章で説明できないですけど。 >方法が何通りもあり・・ まぁ、人それぞれですね。とりあえず自分が解りやすいやり方でいいと思います。 逆に自分の経験を生かしてベテランの思付かないような方法論を用いてギャフンと言わせても、 いいですよ♪ (まっつわん) 2018/04/04(水) 18:22 ---- >違うというか、オートフィルターが設定されてないと、 >オートフィルターの抽出条件の設定なんて存在しないのですから、 >それを見て条件分岐はまずいですね。 ははぁー発想が×ですか?(^^;) >ん〜。難しく考えすぎかも? 記録を取りながら、実行してますがマクロにすると 全然変わってしまいますものね >逆に自分の経験を生かしてベテランの思付かないような方法論を用いてギャフンと言わせて この域に、達するのはいつの日やら・・・ (まっつわん)さん 丁寧な回答ありがとうございました。 失礼致します。 (kenji) 2018/04/04(水) 19:03 ---- >違うというか、オートフィルターが設定されてないと、 >オートフィルターの抽出条件の設定なんて存在しないのですから、 >それを見て条件分岐はまずいですね。 ははぁー発想が×ですか?(^^;) >ん〜。難しく考えすぎかも? 記録を取りながら、実行してますがマクロにすると 全然変わってしまいますものね >逆に自分の経験を生かしてベテランの思付かないような方法論を用いてギャフンと言わせて この域に、達するのはいつの日やら・・・ (まっつわん)さん 丁寧な回答ありがとうございました。 失礼致します。 (kenji) 2018/04/04(水) 19:04 ---- オートフィルタ解除の部分だけ。 Sub test() With ActiveSheet If .AutoFilterMode Then .AutoFilterMode = False End With End Sub (もこな2) 2018/04/04(水) 19:53