Excel (VBA)

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

 
(Windows 10 Pro : Microsoft 365)
フィルターがかかっている名前を取得する条件について
投稿日時: 23/02/28 10:07:30
投稿者: takatada72

お疲れさまです。
 
下記のコードは、シートに使われているフィルターが、どのフィルターを使って
いるかを取得する内容になります。
取得したフィルター名によって、実行先を変えたいのですが、何故か素通りして
しまいます。何が悪いのでしょうか
※フィルターの「更新日」を使えばmsgは、「更新日」を表示しています。
※フィルターの「開催日」を使えばmsgは、「開催日」を表示しています。
 
お忙しいとは思いますが宜しくお願い致します。
 
    Dim i As Long, msg As String
    With ActiveSheet
        If .AutoFilterMode = True Then
            For i = 1 To .AutoFilter.Filters.Count
                If .AutoFilter.Filters(i).On = True Then
                    msg = msg & .AutoFilter.Range(i) & vbCrLf
                End If
            Next i
        End If
    End With
    Debug.Print msg
    If msg = "更新日" Then MsgBox "フィルターは、更新日になっています。": GoTo msg2
    If msg = "開催日" Then MsgBox "フィルターは、開催日になっています。": GoTo msg1
    End

回答
投稿日時: 23/02/28 10:33:50
投稿者: Suzu

引用:
If .AutoFilter.Filters(i).On = True Then
  msg = msg & .AutoFilter.Range(i) & vbCrLf
End If

 
上記の msg に代入する段階で、msg の中身として vbCrLf が含まれています。
 
対し、比較しているのは
引用:
If msg = "更新日" Then MsgBox "フィルターは、更新日になっています。": GoTo msg2
If msg = "開催日" Then MsgBox "フィルターは、開催日になっています。": GoTo msg1

 
vbCrLf が含まれていませんから、条件式が True とはならず、
GoTo先の、msg2 及び msg1 にはスキップしません。
 
InStr関数を使用するなり、Like演算子で比較する様にしましょう。
 
 
また、Filtersコレクション の全数に対し フィルター名
更新日・開催日 が 両方 設定されている場合には、msg1、msg2 は 共に実行されませんよ。
GoToでスキップするのであれば、msg2 実行後に、開催日の判定直前にスキップさせないといけません。
 
個人的には、
エラートラップ以外で、プロシージャ内を行ったり来たりになると、可読性が下がるので
・If 〜 Then 〜End if 内にそのまま実行内容を入れてしまうか
・サブプロシージャ化
のどちらかを採るでしょうか。

投稿日時: 23/02/28 16:42:59
投稿者: takatada72

返信が遅くなりすみませんでした。
 
msgの中身にvbCrLfが含まれていたのですね
気が付きませんでした。
 
無事、解決です。
 
ありがとうございました。