[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『オートフィルターで指定月の件数をカウントしたい』(リオ)
ダイアログで指定した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.