[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『オートフィルターで指定月の件数をカウントしたい』(リオ)
ダイアログで指定した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"
なので、↓のように修正してみては如何でしょうか。
〜Criteria1:=">=" & Buf, Criteria2:="<=" & Buf 〜
(もこな2) 2023/01/26(木) 12:27:34
↓だと、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
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
お邪魔しますさん ありがとうございます。お示し頂いたコードを実行したところ、
下記箇所で「実行時エラー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
■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.