| 
    
     |  | ▼マスク さん: 
 >完成シートを見て、感動しました!
 
 では、CSVに見出しがないときの処理を追加です。
 Excelで開いたとき、[A1]セルが日付データだったら、一行挿入する
 という処理を入れました。●の部分以降です。
 
 Sub Filter_CSV2()
 Dim myDate As Long '抽出したい日付 (シリアル値)
 Dim myCSVs, f
 Dim newBook As Workbook
 Dim rCopy As Range  '抽出転記先先頭セル
 Dim myCol As Long
 Dim NoHeader As Boolean '見出しはあるか
 Dim i As Long
 
 '抽出したい日付をこのマクロブックのSheet1!A1セルに書いておく
 myDate = ThisWorkbook.Worksheets(1).Range("A1").Value2
 
 'OpenするCSVファイルを(複数)指定
 myCSVs = Application.GetOpenFilename("CSVファイル,*.csv", _
 MultiSelect:=True)
 If Not IsArray(myCSVs) Then Exit Sub
 
 '抽出転記先のBookを作成
 Set newBook = Workbooks.Add(xlWBATWorksheet) 'シート1枚
 Set rCopy = newBook.Sheets(1).Range("A1")  '最初の貼り付け先(セル)
 
 '指定のCSVファイルを順に開いてフィルタ抽出
 For Each f In myCSVs
 With Workbooks.Open(f).Worksheets(1)
 '表領域に対してA列の日付を抽出する
 With .Range("A1")
 myCol = .CurrentRegion.Columns.Count '表の列数
 NoHeader = IsDate(.Value) '●見出し行あり/なし
 End With
 If NoHeader Then '見出し行が無かったら
 '1行目に見出し行を挿入
 .Rows(1).Insert
 With .Rows(1).Cells
 For i = 1 To myCol
 .Item(i).Value = Chr$(&H40 + i) '仮の見出し
 Next
 End With
 End If
 '表領域に対してA列の日付を抽出する
 With .Range("A1").CurrentRegion
 .AutoFilter 1, ">=" & myDate, xlAnd, "<=" & myDate
 If .Columns(1).SpecialCells(xlVisible).Count > 1 Then
 .Offset(1).Copy rCopy   '1行目は除外してコピー
 Set rCopy = rCopy.Offset(, myCol) '次の貼り付け先
 End If
 .AutoFilter
 End With
 .Parent.Close False '保存しないで閉じる
 End With
 Next
 newBook.Close True     '保存して閉じる
 
 End Sub
 
 >まずオートフィルタで抽出すればいいということから理解できてない
 
 特定のアイテム行だけ抽出するために、フィルタを使うのですが、
 今回のように 「日付のAutoFilter」は(文字列ではないので)ちょっと
 気を付けないと抽出されません。
 
 >  myCri = InputBox("日付を入力して下さい")
 >
 >    With Sh2
 >      .Range("A1").AutoFilter Field:=1, Criteria1:=myCri
 
 こういうフィルタのかけ方をすると、まず抽出されません。理由は Inputbox
 関数の返り値が文字列だから、
 Criteria1:="8/31" という文字列の行を抽出しようとします。
 正しく動くようにするには、Criteriaが数値になるようにします。
 具体的には
 
 Criteria1:=">=" & 日付, xlAnd, Criteria2:="<=" & 日付
 
 のように、不等号で抽出したい日付を挟んでやります。
 そして、与える日付 は 2013/8/31 のような日付型でなく、
 41517 のような シリアル値にすれば「完璧」です。
 以上のようにすれば、A列の日付の表示形式がどのようなものであろうと、
 必ず抽出されるはずです。
 
 
 |  |