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

<追記>
正解

</追記>
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でぐるぐるさせる感じです。

どのくらい面白かった?

星を押して送信してね

平均 0 / 5. Vote count: 0

是非フォローしてください

最新の情報をお伝えします

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です