[[20180403173720]] 『2回目解除動作について』(kenji) ページの最後に飛ぶ

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

 

『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

コメント返信:

[ 一覧(最新更新順) ]


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