[[20230126121422]] 『オートフィルターで指定月の件数をカウントしたい』(リオ) ページの最後に飛ぶ

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

 

『オートフィルターで指定月の件数をカウントしたい』(リオ)

ダイアログで指定したcsvファイルから特定付きの件数をカウントする下記マクロを実行してみましたが特定月を抽出できません。
特定付きはActhiveBook.Sheet(1).Range(A3)にある「2022/12/31」を指定しています。どのような変更をしたら良いか教えてください。
Sub test1()

    Dim FileName As Variant
    FileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.csv")
        If FileName = False Then
            Exit Sub
        End If
    Workbooks.Open FileName
    Dim count As Long
    Dim Sht1 As Worksheet
    Dim Sht2 As Worksheet
    Dim Buf As String
    Set Sht1 = ActiveSheet
    Set Sht2 = ThisWorkbook.Sheets(1)
    Buf = Sht2.Range("A3").Value
    'フィルターでデータ抽出
    Sht1.Range("A1").AutoFilter 1, Criteria1:=">=Buf", Criteria2:="<=Buf", Operator:=xlAnd
    count = WorksheetFunction.Subtotal(3, Range("A1").CurrentRegion.Columns(1))
End Sub

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


↓だと、"Buf"という文字列以上という意味になってます。
 ">=Buf"

なので、↓のように修正してみては如何でしょうか。

 〜Criteria1:=">=" & Buf, Criteria2:="<=" & Buf 〜

(もこな2) 2023/01/26(木) 12:27:34


あと↓とのことですが、
特定付きはActhiveBook.Sheet(1).Range(A3)にある「2022/12/31」を指定しています。

↓だと、2022/12/31(の0:00)しか抽出されないのでは?

 Dim Buf As String
 Buf = Sht2.Range("A3").Value
 Sht1.Range("A1").AutoFilter 1, Criteria1:=">=" & Buf, Criteria2:="<=" & Buf, Operator:=xlAnd

(もこな2) 2023/01/26(木) 12:37:36


 AutoFilter使わなくても、COUNTIFS関数でできるような気がしますが
 AutoFilterを使いたいんでしょうか
https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.autofilter
 Criteria2の配列指定でレベルを1にするのがいいのでは
(´・ω・`) 2023/01/26(木) 13:48:07

質問の回答ではない荒らしみたいな書き込みでごめんなさい。
OpenTextFileでCSVを読み込んで集計するコードを書いてみたくなりました。

    Dim FileName As Variant
    FileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.csv")
    If FileName = False Then
        Exit Sub
    End If

    Dim FSO As Object
    Dim csvData As Object
    Dim buf, LineData
    Dim iYear As Long
    Dim iMonth As Long
    Dim cnt As Long

    With ThisWorkbook.Sheets(1).Range("A3")
        iYear = Year(.Value)
        iMonth = Month(.Value)
    End With

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set csvData = FSO.OpenTextfile(FileName)

    Do Until csvData.AtEndOfStream
        LineData = Split(csvData.ReadLine, ",")(0)
        buf = Split(LineData, "/")
        If buf(0) = iYear And buf(1) = iMonth Then
            cnt = cnt + 1
        End If
    Loop
    MsgBox cYear & "年" & cMonth & "月は" & cnt & "件"

(お邪魔します) 2023/01/26(木) 14:01:58


もこな2さんありがとうございます。下記へ変更しましたがオートフィルターの「12月」には☑がはいりませんでした。
Sht1.Range("A1").AutoFilter 1, Criteria1:=">=" & Buf, Criteria2:="<=" & Buf, Operator:=xlAnd

お邪魔しますさん ありがとうございます。お示し頂いたコードを実行したところ、
下記箇所で「実行時エラー9」インデックスが有効範囲にありません。となってしまいました。
お手数ですが修正箇所をお示しいただけると助かります。
If buf(0) = iYear And buf(1) = iMonth Then

(リオ) 2023/01/26(木) 14:35:41


 おもっきり無視されましたが、こうしたいのではないの?

 Dim d As Date
 d = sht2.Range("A3").Value
 Sht1.Range("A1").AutoFilter Field:=1, Operator:=xlFilterValues, Criteria2:=Array(1, d)
(´・ω・`) 2023/01/26(木) 15:06:06

もう少し遊んでみます。
該当行をこうしてみるとどうでしょうか

 If Year(CDate(LineData)) = iYear And Month(CDate(LineData)) = iMonth Then
(お邪魔します) 2023/01/26(木) 15:14:09

(´・ω・`)さん おもっきり無視してすいません。お示しいただいたコードで12月が抽出できました。
みなさん ありがとうございます。たすかりました。
(リオ) 2023/01/26(木) 18:14:46

書き溜めている間に解決したようですがコメントしておきます。

■1
>下記へ変更しましたがオートフィルターの「12月」には☑がはいりませんでした。
いや、既にコメントつけたと思いますけど、↓になるのだから、[2022/12/31]以上、[2022/12/31]以下を満たすのは、[2022/12/31(の0:00)]しかないですよね?
Sht1.Range("A1").AutoFilter 1, _

            Criteria1:=">=2022/12/31", _
            Criteria2:="<=2022/12/31", _
            Operator:=xlAnd

したがって2022年の12月を抽出したいという話であれば、[2022/12/1]以上、[2023/1/1]未満でないとダメです。
([2022/12/31]以下にすると、[2022/12/31 0:01]とかが拾えません。)

なので、↓のように直したらどうかという話でした。

    Sub test1_整理()
        Dim FileName As Variant
        Dim count As Long
        Dim Buf As Date '←変更

        '↓文字列ではなく日付として取得する
        Buf = ThisWorkbook.Sheets(1).Range("A3").Value

        '↓細かい話ですがcsvファイルはエクセルブックではありません。
        FileName = Application.GetOpenFilename(FileFilter:="CSVファイル,*.csv")
        If FileName = False Then
            Exit Sub
        End If

        Stop 'ブレークポイントの代わり
        Buf = ThisWorkbook.Sheets(1).Range("A3").Value

        With Workbooks.Open(FileName).Worksheets(1)
            Stop 'ブレークポイントの代わり
            .Range("A1").AutoFilter 1, Criteria1:=">=" & DateSerial(Year(Buf), Month(Buf), 1), Criteria2:="<" & Buf + 1, Operator:=xlAnd
            count = WorksheetFunction.Subtotal(3, .Range("A1").CurrentRegion.Columns(1))
            MsgBox "項目行を含めた抽出行は" & count & "行です"
        End With
    End Sub

■2
既にコメントがありますが、オートフィルタで特定の月を絞り込むならば、始まりと終わりを指定する以外の方法もあります。

 http://officetanaka.net/excel/vba/tips/tips151.htm

■3
こちらも提案がありますが、2022年12月の件数を数えるということならば、例えば↓のようにすればオートフィルタを使わなくてもよいですね。

    Sub 別案()
        Dim FileName As Variant
        Dim count As Long

        FileName = Application.GetOpenFilename(FileFilter:="CSVファイル,*.csv")
        If FileName = False Then
            Exit Sub
        End If

        With Workbooks.Open(FileName).Worksheets(1)
            count = WorksheetFunction.CountIfs( _
                .Range("A:A"), ">" & WorksheetFunction.EoMonth(ThisWorkbook.Sheets(1).Range("A3").Value, -1), _
                .Range("A:A"), "<" & WorksheetFunction.EoMonth(ThisWorkbook.Sheets(1).Range("A3").Value, 0) + 1)
        End With

        MsgBox "該当する行は" & count & "行です"
    End Sub

(もこな2) 2023/01/26(木) 20:00:24


コメント返信:

[ 一覧(最新更新順) ]


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