[[20221202144938]] 『オートフィルターのカウントが違うのは何故ですか』(師走) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『オートフィルターのカウントが違うのは何故ですか』(師走)

シート1のB列とC列からオートフィルターでシート2の値を参照して結果をシート2へ転記していますが、シート1の2条件で抽出された表示は「8」あるのですが、シート2のセルC3には「4」とカウントされます。どこが間違っているのかおしえてください。
 Sub オートフィルタ他シートに入力されているセル値参照()
Dim Sht1 As Worksheet
Dim Sht2 As Worksheet
Dim Buf1 As String
Dim Buf2 As String
Dim Count As Long

    Set Sht1 = Sheets("Sheet1")
    Set Sht2 = Sheets("Sheet2")
    Buf1 = Sht2.Cells(3, 2).Value
    Buf2 = Sht2.Cells(2, 3).Value
    'フィルターでデータ抽出
    Sht1.Range("B2").CurrentRegion.AutoFilter Field:=2, Criteria1:=Buf1
    Sht1.Range("B2").CurrentRegion.AutoFilter Field:=1, Criteria1:=Buf2
    Count = WorksheetFunction.Subtotal(3, Range("B2").CurrentRegion.Columns(1))
    Worksheets(2).Activate
    Range("C3").Value = Count - 1
End Sub

< 使用 Excel:Office365、使用 OS:Windows10 >


 > Count = WorksheetFunction.Subtotal(3, Range("B2").CurrentRegion.Columns(1))
                     ~~~~~↑~~~~~~
                     ここらが怪しい(どのシートのB2が不明瞭)

   Count = WorksheetFunction.Subtotal(3, Sht1.Range("B2").CurrentRegion.Columns(1)) ’ではどうか?

(半平太) 2022/12/02(金) 15:45:16


発想を変えて↓みたいな感じで対応してはどうでしょうか?
(抽出件数がわかればいいんですよね?)
    Sub 別案()
        With Sheets("Sheet1").Range("B2").CurrentRegion
            .AutoFilter Field:=2, Criteria1:=Sheets("Sheet2").Range("B3").Value
            .AutoFilter Field:=1, Criteria1:=Sheets("Sheet2").Range("C2").Value

            Sheets("Sheet2").Range("C3").Value = .Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
        End With
    End Sub

(もこな2) 2022/12/02(金) 16:40:59


ありがとうございます。
もこな2さんの別案で「.AutoFilter Field:=2, Criteria1:=Sheets("Sheet2").Range("B3").Value」は数値が正常にカウントされるのですが、「.AutoFilter Field:=1, Criteria1:=Sheets("Sheet2").Range("C2").Value」は、カウントできませんでした。セルC2の値は日付なのですが何か別の方法がありますでしょうか。教えていただけるとたすかります。
(師走) 2022/12/02(金) 17:14:12

>セルC2の値は日付なのですが〜
↓が参考になると思いますので読んでみてはいかがでしょうか。
http://officetanaka.net/excel/vba/tips/tips151.htm

(もこな2) 2022/12/02(金) 17:35:08


ありがとうございます。.textで解決しました。
(師走) 2022/12/03(土) 13:15:46

>.textで解決しました。
解決したということなので、興味が無いかもしれませんが、気になる点を何点か。

■1
[[20221202113059]]で学習されたかとおもいますが、CurrentRegionプロパティで取得できるのは、そのセルが【含まれている表範囲】です。
したがって↓で取得できるセル範囲の左上はB2セルとは限りません。

 Sheets("Sheet1").Range("B2").CurrentRegion

そして、大抵の場合↓は同じ結果になるとおもいます。

 Sheets("Sheet1").Range("B2").CurrentRegion.AutoFilter
 Sheets("Sheet1").Range("B2").AutoFilter

また、オートフィルタが設定されている場合は、↓のようにすればその範囲が取得できます。

  Worksheets("Sheet1").AutoFilter.Range

したがって、本件では、必ずしも「CurrentRegion」を使う必要は無いと思います。

■2
>カウントできませんでした。
リンク先を読んで理解できたとおもいますが、オートフィルタで「と等しい」で絞り込むには↓のようなルールがあるわけです、

 AutoFilterメソッドの引数Criteria1には「文字列型」を指定しなければいけない

ですが、【セルC2の値は日付】ならば「Range("C2").Value」で取り出されるのは"シリアル値"ですから、<<抽出に失敗>>してたわけですね。
よって、カウント自体は正しく"0"件になっていたとおもいます。

そのうえで「Range("C2").Value」が"シリアル値であって「Field:=1」が日付が入っている列ならば、↓のようにすれば、正しく抽出できたでしょう。

 .AutoFilter Field:=2, Criteria1:=Sheets("Sheet2").Range("B3").Value
 .AutoFilter Field:=1, Criteria1:=">=" & Sheets("Sheet2").Range("C2").Value, Operator:=xlAnd, Criteria2:="<" & Sheets("Sheet2").Range("C2").Value + 1

■3
ちなみに、いちいちオートフィルタで抽出しなくても、(Sheet2シートの)C3セルに↓の数式を設定すれば事足りそうな気がしますが、それではダメだったんですか?

 =COUNTIFS(Sheet1!C3:C33,B3,Sheet1!B3:B33,C2)
 ※セル範囲は適当

(もこな2) 2022/12/03(土) 14:27:42


↑誤りがありましたので修正しました。
(もこな2) 2022/12/03(土) 20:52:58

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.