Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
オートフィルターに条件内容を取得したい
投稿日時: 23/03/01 09:47:39
投稿者: takatada72

お世話になります。
 
主記にあるように、フィルターをかけている条件を取得したいのですが、
「アプリケーション定義またはオブジェクト定義のエラーです。」と言
われていますが、自分の知識では、どのように改善してよいのかが見つ
かりませんでした。
※赤のコードだけを指定するとフィルターをかけている項目名は、表示さ
れることがわかっております。後半の「.AutoFilter.Filters(j).Criteria1 & vbCrLf」
でエラーになっているようです。
 
データは、製品名、担当者名、カテゴリ名、開催日、更新日で、フィルターをかけて
いるのは、開催日か更新日のみになります。
※やりたいことは、開催日をフィルターした場合、条件はいつになっているのかを取得
したいのです。更新日の方も同様です。2つ同時にフィルターすることはありません。
 
お忙しいとは思いますが宜しくお願い致します。
 
Dim myStr As String
With ActiveSheet
    If .AutoFilterMode = True Then 'オートフィルタされているか判定
      For j = 1 To .AutoFilter.Filters.Count 'オートフィルターの列数を取得
            If .AutoFilter.Filters(j).On = True Then '絞り込みされているか判定
            myStr = myStr & .AutoFilter.Range(j) ' & ":" & .AutoFilter.Filters(j).Criteria1 & vbCrLf
End If
        Next j
    End If
End With
MsgBox myStr

回答
投稿日時: 23/03/01 12:03:13
投稿者: Suzu

オートフィルター の 日付の抽出条件を取得するにあたり
 
Operatorプロパティに 引数xlFilterValues(7)を
指定されている場合、Criteria1、Criteria2 を参照できない場合があります。
 
 
Office TANAKA【オートフィルタの状況を判定する】
http://officetanaka.net/excel/vba/tips/tips129.htm
 
 
どうしても取得するのであれば
 
抽出条件は、セルに入力されている値から選ばれていますから
表示されているデータ自体を取得すれば 条件が得られる事になるので
フィルターの結果 から、2列目のデータを取得すれば 条件を得られる事になるでしょう。
 
フィルターの結果の取得は
【絞り込んだ結果をコピーする】
http://officetanaka.net/excel/vba/tips/tips155c.htm
 
が参考になるでしょう。

投稿日時: 23/03/01 14:35:37
投稿者: takatada72

Suzu さん
 
早速、ありがとうございました。
 
引数によって取得できない場合があるんですね
 
Office TANAKA【オートフィルタの状況を判定する】
http://officetanaka.net/excel/vba/tips/tips129.htm
 
【絞り込んだ結果をコピーする】
http://officetanaka.net/excel/vba/tips/tips155c.htm
 
こちらを見させて頂きたいと思います。

投稿日時: 23/03/01 15:07:57
投稿者: takatada72

suzu さん
 
お疲れさまです。
 
エクセルのオートフィターのかけかたですが、
 
一旦、Selection.AutoFilterを使って、オートフィルターをONに
しております。
 
その後、手動で、開催日か更新日のフィルターを指定するだけで
絞り込みを行っているのですが、引数xlFilterValues(7)に関係
していることになるのでしょうか
 
サイトを確認したのですが、理解力が低いため、上記のような
質問をさせて頂いております。
 
お忙しいとは思いますが宜しくお願い致します。

回答
投稿日時: 23/03/01 16:57:29
投稿者: Suzu

全てのパターンを試せてはいませんが、当方が確認した条件としては
 
フィルター の フィールド名(項目) の ▼ をクリック
 抽出したい 日付 のチェックを入れ「OK」としフィルターを適用し
 
VBE画面で VBAを実行していくと、
ローカルウィンドの 当該 Filterの Criteria1 には
日付の値が入るのではなく
【アプリケーション定義またはオブジェクト定義のエラーです。】と表示されます。
 
その時の Operator プロパティーは 【xlFilterValues】になっているという事です。
 
色々な抽出条件を設定し、VBE画面の ローカルウィンドで
 Creteria1/Creteria2 がどうなっているか確認しましょう。

投稿日時: 23/03/02 08:53:08
投稿者: takatada72

Suzuさん、ご丁寧にありがとうございます。
 
私の方でも色々と検索して、日付が扱えないことがわかりました。
こちらをどのようにして扱うことが可能か、他の方法からできないかを
確認して行きたいと思います。
 
引き続き宜しくお願い致します。

回答
投稿日時: 23/03/02 10:15:22
投稿者: Suzu

xlFilterValues の時の 抽出条件は
フィルターのリストから選択する訳ですから、
抽出済みの セルの値を取得すれば良いでしょう。
 
 

Sub TEST2()
Dim i As Long
Dim c As Range
Dim myStr As String

With ActiveSheet
  If .AutoFilterMode = True Then
    For i = 1 To .AutoFilter.Filters.Count
      If .AutoFilter.Filters(i).On = True Then
        If .AutoFilter.Filters(i).Operator = 7 Then
          myStr = myStr & .AutoFilter.Range(i) & " : "
            With .Range("A1").CurrentRegion.Offset(1, 0)
              For Each c In .Resize(.Rows.Count - 1).Columns(i).Cells
                If c.Height > 0 Then
                  myStr = myStr & c.Text & vbTab
                End If
              Next c
            End With
          myStr = myStr & vbCrLf
        Else
          myStr = myStr & .AutoFilter.Range(i) & ":" & .AutoFilter.Filters(i).Criteria1 & vbCrLf
        End If
      End If
    Next i
  End If
End With
MsgBox myStr
End Sub

 
でも、日付の場合これだけではなくて、
Operator が、xlFilterDynamic(11)の、動的フィルターの時 Creteria1 を拾い
「今週」とか「今年」とか に変換しないとダメでしょうね。
 
その辺りは、ご自身で試行錯誤してみてください。

投稿日時: 23/03/06 09:46:47
投稿者: takatada72

Suzuさん
 
お疲れさまです。
 
 
ご丁寧にサンプルを作って頂きましてありがとうございました。
実行させて頂いたところ、絞り込んだリスト分の日付がMSGに表示
されておりました。こちらのコードを理解させて頂き、改善がで
きればと思っております。
 
 
引き続き宜しくお願い致します。

回答
投稿日時: 23/03/06 10:49:04
投稿者: Suzu

求めるモノの【一部】は得られた様で何よりです。
 
 
先にも申し上げていますが、フィルターの リストから選択の場合は、
Operatorプロパティに 引数xlFilterValues(7)が指定されます。
 
今回は、それを

引用:
If .AutoFilter.Filters(i).Operator = 7 Then

として、判定しています。
 
しかしながら、実動においては Operatorプロパティには 引数xlFilterValues 以外の事もあり、
・xlFilterDynamic(11) の場合には、Creteria1 を参照し、「今週」とか「今年」等への変換
・それ以外の場合でも、Creteria1 のみではなく Creteria2 の値の取得
があるでしょう。
 
抽出条件に、各条件を設定した上で、ローカルウィンド等で、Operator/Creteria1/Creteria2 の値を確認し
それらの条件の際の動作を実装してゆけば良いでしょう。
 
試行錯誤は必要になるでしょうが、目的の動作に確実に近づいています。頑張ってください。

投稿日時: 23/03/13 13:39:55
投稿者: takatada72

Suzuさん
 
お疲れさまです。
 
報告が遅くなりすみませんでした。
Suzuさんのコードを使わせて頂きました。
フィルターの条件が1日の日付だけで良いことがわかりましたので、
フィルター実施後の最後の行の日付を取得することになりました。
 
ありがとうございました。 クローズさせて頂きます。
 
最終的なコードはこちらです。
Dim c As Range
Dim myStr As String
 
With ActiveSheet
  If .AutoFilterMode = True Then
    For i = 1 To .AutoFilter.Filters.Count
      If .AutoFilter.Filters(i).On = True Then
        If .AutoFilter.Filters(i).Operator = 7 Then
            With .Range("A1").CurrentRegion.Offset(1, 0)
              For Each c In .Resize(.Rows.Count - 1).Columns(i).Cells
                If c.Height > 0 Then
                  myStr = c.Text
             
                End If
              Next c
            End With
        Else
        End If
      End If
    Next i
  End If
End With