|
分かりやすい説明を何度も何度もありがとうございます。
Inputbox関数の返り値が文字列という説明には驚きました。
まだまだ知識不足を実感するばかりです。
本当にありがとうございました!!
▼kanabun さん:
>▼マスク さん:
>
>>完成シートを見て、感動しました!
>
>では、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列の日付の表示形式がどのようなものであろうと、
>必ず抽出されるはずです。
|
|