スナックelve 本店

バツイチ40代女の日記です

オートフィルターかけた後のデータ数(行数)を数えようとするとハマるよね

<追記>
正解

</追記>
vba オートフィルター 有無」辺りで検索するとわんさか出てくるんですが、方法として滅茶苦茶下から上にデータあるセルを見つけてその行がヘッダ行かどうかで判定しろ、とかWorksheetFunctionのSUBTOTAL使えとかが出てきますでしょ?
何でかしらー。フィルターかけたら可視の行数数えればいいのに、と思うわけです。
で、なんでかできないんだねって話です。

f:id:elve:20200604233812p:plain

まぁこんな感じのデータがあって「担当者100のIDリストをCSVでくれ」とか言われたら、まぁとりあえず担当者のIDでフィルターかけるじゃないですか・・・。データ4行、ヘッダ行あり・・・。
f:id:elve:20200604234430p:plain

( ´゚д゚`)エー

ヘッダ行の次の行がとれちゃってるのかな? とか思ったんですが、コード101にしたら

$A$1:$D$1,$A$3:$D$3,$A$9:$D$9,$A$11:$D$12
$A$1:$D$1,$A$3:$D$3,$A$9:$D$9,$A$11:$D$12
$A$1:$D$1,$A$3:$D$3,$A$9:$D$9,$A$11:$D$13
1
1
1
12
5

1はまずいっしょー。ヘッダ行だけの場合と区別つかんじゃないですかぁ(´;ω;`)ウゥゥ

今回もちゅんちゅん氏(@KotorinChunChun)に聞きましたが僕の力ではどうにもならないです(´・ω・`)
Option Explicitは(楽だからw)つけない主義でしたが、ちゅんちゅん氏の主張に感化されてつけるようになりました(*^▽^*)

ちなみにいつも私はこんな感じです

Sub Macro1()
    
    If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False
    
    Dim r As Long: r = Range("A1").End(xlDown).Row
    Dim c As Long: c = Range("A1").End(xlToRight).Column
    ActiveSheet.Range("$A$1").AutoFilter Field:=1, Criteria1:="101"
    Dim r2 As Long: r2 = Range("A1").End(xlDown).Row 
    
    If r2 > r  Then
        'データなしの処理
    Else
        Range(Range("B1"), Cells(r, 2)).Copy
        
        Workbooks.Add
        ActiveSheet.Paste
        Application.CutCopyMode = False
        
        ActiveWorkbook.SaveAs Filename:="C:\test\101_test.csv" _
            , FileFormat:=xlCSV, CreateBackup:=False
        ActiveWindow.Close (False)
    End If
        
    
End Sub

これで101のところを担当者コードの配列にしてfor each nextかdo loopでぐるぐるさせる感じです。