Excel (VBA)

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

 
(Windows 10 Pro : その他)
ステータスバーに***レコード中 **個見つかりました
投稿日時: 21/11/10 16:47:23
投稿者: George

Excelバージョン:Microsoft 365 for Excel
 
こんにちは。Georgeです。
 
件名に書いたメッセージがステータスバーに出てきます。

Application.StatusBar = False

としても元に戻りません。
 
何か方法はありますでしょうか?

回答
投稿日時: 21/11/10 17:30:25
投稿者: simple

オートフィルタやフィルタオプションなどのフィルター系の処理をされたわけですよね。
その効果を示すためにExcelが出しているメッセージです。
確かに マクロでStatusbarを操作しても消えませんが、
理由がわかれば、それを解消するまでのあいだ我慢できませんか?
どうしても消したいなら、フィルタをクリアーしてください。

投稿日時: 21/11/11 08:33:01
投稿者: George

simpleさん
 

引用:
どうしても消したいなら、フィルタをクリアーしてください。

ここでいうフィルタをクリアとはフィルタを解除とは違うのでしょうか?
オートフィルタを使って処理しているところのソースを下に示します。
Public Sub deleteRowData(ByVal wkbTarget As Workbook, ByVal intKindNo As Integer)

    wkbTarget.Activate
        
    ' オートフィルタを設定(指定した品種番号以外)
    Range("A4").CurrentRegion.AutoFilter _
                   Field:=(MeasurementData.KindNumber - MeasurementData.DateTime + 1), _
                   Criteria1:="<>" & intKindNo

    Application.DisplayAlerts = False

    ' 見出しを除いてフィルタ結果を削除
    With Range("A4").CurrentRegion
        .Resize(.Rows.Count - 1).Offset(1, 0).Delete
    End With
    
    Application.DisplayAlerts = True
    
    'オートフィルタを解除
    Range("A4").CurrentRegion.AutoFilter
        
End Sub

マクロでは処理をしてWorkbookを新たに作ってデータを書き出していますが、
メッセージが出るのはマクロファイル側だけで、処理をしたファイル側には出ていません。

投稿日時: 21/11/11 11:36:33
投稿者: George

コメント追記です。
 
なお、Excelファイルの左下にメッセージっ出ている状態で
マクロファイルを最小化したのちに再度表示するとメッセージは出なくなります。

回答
投稿日時: 21/11/11 16:44:57
投稿者: simple

引用:
ここでいうフィルタをクリアとはフィルタを解除とは違うのでしょうか?

違いますね。
・Autofilterのボタンの横にあるクリアボタンを押すことは、
・もう一度、Autofilterのボタンを押す
こととは違いますよね。
 
もっとも、一例としてあげただけで、
これ以外の手段(解除)がダメと言ったつもりもありません。
クリアしても、その表示が消えないというなら問題コメントでしょうが、
きちんと消えるでしょう?
食いつかれる趣旨がわかりませんでした。
 
私は以上とします。

投稿日時: 21/11/15 08:52:05
投稿者: George

引用:
もっとも、一例としてあげただけで、
これ以外の手段(解除)がダメと言ったつもりもありません。
クリアしても、その表示が消えないというなら問題コメントでしょうが、
きちんと消えるでしょう?

クリアボタンが押せない状態になります。なので、消えない以前の状態です。

回答
投稿日時: 21/11/15 17:34:05
投稿者: QooApp

クリアボタンが押せないということはオートフィルタがかかっていないか、
範囲に対してオートフィルタは設置されているが、何も絞り込んでいないという状態ではないでしょうか。
絞り込みONの状態でクリアできないんでしょうか。
 
あと、どうしてもステータスバーにテキストを表示したくないという目的が不明確なのですが
どのような目的がございますでしょうか。後学のためににお伺いいたします。
 
なお、どうしても表示したくない場合は
Application.StatusBar = " "
 
で半角スペース1文字とか挿入しておけば”見た目は非表示”になりますがダメですか。

回答
投稿日時: 21/11/15 21:29:38
投稿者: simple

オートフィルタの結果は、
 (1)一部が該当
 (2)全件が該当
 (3)該当レコードなし
の3つがありえるが、各ケースで検討する必要があります。
 

(1)のケースでは、そういう事象(抽出件数表示が残る事象)は起きないと思われる。

(2)のケースでは、
  ・範囲を削除してから、フィルタを解除すると、くだんのメッセージが残るようだ。
  ・これは、フィルタを解除してから、範囲を削除する順序にすることで、回避できる。

(3)のケースでは、
  ・(1)と同様の操作をしてしまうと、該当データが無いにも関わらず、
    すべてのデータが削除されてしまうことが知られている。(結構頻出する質問事項です)
  ・そして、StatusBarにも例の警告が残る。
  ・この場合は、単にフィルタを解除するだけでいい。

質問者がどういうデータで、上記のどれに該当するケースを実行したのか説明がないので、
論点が不明確だった。
(1)を実行したあとに(3)を実行したとかではないかと想像する。
それか(2)のケースなのかもしれない。
 
なお、
通常の操作では、フィルタの解除は手で実行することが多いので、
そうした事象に気づきにくいのではないか。
手で再度、フィルタを掛けたりすれば、そうした警告はクリアーされるので、
気づくこともないのではないか。
 
いづれにしても、エッジケースでどういうことが起きているかをよく観察することが大切です。
提示したコードをもとに検討してください。
 
# 今度こそ、私はこれで終了です。
 
【参考コード】
Sub test()
    Dim rng As Range
    Dim cnt As Long

    Call dataset  'テストデータの作成

    Set rng = Range("A4").CurrentRegion

    'オートフィルタの実行(いくつかのケースでそれぞれ確認されたい)
    rng.AutoFilter Field:=1, Criteria1:="=" & "a"    '(1)一部該当ケース
    'rng.AutoFilter Field:=1, Criteria1:="<>" & "d"  '(2)全件該当ケース
    'rng.AutoFilter Field:=1, Criteria1:="=" & "d"    '(3)該当なしケース

    ' 見出しを除いてフィルタ結果を削除
    With rng
        cnt = .Columns(1).SpecialCells(xlCellTypeVisible).Count
        If cnt > 1 Then     '該当レコードが1件以上ある
            If cnt < rng.Rows.Count Then            '(1)一部が該当
                Application.DisplayAlerts = False
                .Resize(.Rows.Count - 1).Offset(1, 0).Delete
                Application.DisplayAlerts = True
                rng.AutoFilter
            Else                                    '(2)全件が該当
                rng.AutoFilter                      '先に解除するのがよい。
                Application.DisplayAlerts = False
                .Resize(.Rows.Count - 1).Offset(1, 0).Delete
                Application.DisplayAlerts = True
            End If
        Else                                        '(3)該当レコードなし
            rng.AutoFilter
            '仮に上記(1)と同様のロジックを通してしまうと、
            'すべてのデータが削除されてしまい(頻出質問事項)、件数表示も残る。
        End If
    End With
End Sub

Sub dataset()
    [A4] = "test"
    [A5:A7] = Application.Transpose(Array("a", "b", "c"))
    [A8:A10] = Application.Transpose(Array("a", "b", "c"))
End Sub

投稿日時: 21/11/29 11:21:47
投稿者: George

返答が大変遅れました。
 
simpleさんが提示してくださった方法を試してみたいと思います。
ありがとうございました。