Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


698 / 13645 ツリー ←次へ | 前へ→

【78887】ファイルを更新順に読み込む方法 もりC 17/2/20(月) 13:32 質問[未読]
【78888】Re:ファイルを更新順に読み込む方法 ウッシ 17/2/20(月) 14:57 回答[未読]
【78889】Re:ファイルを更新順に読み込む方法 もりC 17/2/20(月) 17:58 質問[未読]
【78890】Re:ファイルを更新順に読み込む方法 β 17/2/20(月) 21:22 発言[未読]
【78920】Re:ファイルを更新順に読み込む方法 もりC 17/2/23(木) 17:49 お礼[未読]

【78887】ファイルを更新順に読み込む方法
質問  もりC  - 17/2/20(月) 13:32 -

引用なし
パスワード
   特定のフォルダ内にある.csvファイルをファイルが更新した順に
読み込んでいく方法がわかりません。

ファイルを読むには
   pathname = ThisWorkbook.Path
   fname = Dir(pathname & "\*.csv", vbNormal)

などと記述していましたが、これでは名前順でしか対応できません。

どなたかよい方法をご存知でしたら、ご教授ください。

【78888】Re:ファイルを更新順に読み込む方法
回答  ウッシ  - 17/2/20(月) 14:57 -

引用なし
パスワード
   こんにちは

Sub test()
  Dim objF  As Object
  Dim objA  As Object
  Dim fPath As String
  Dim oFile As Object
  
  Set objF = CreateObject("Scripting.FileSystemObject")
  Set objA = CreateObject("ADODB.Recordset")
  objA.Fields.Append "FileName", 200, 300, 32 ', adVarChar, MaxCharacters, adFldIsNullable
  objA.Fields.Append "ModifiedDate", 200, 300, 32
  objA.Open
  fPath = ThisWorkbook.Path
  For Each oFile In objF.GetFolder(fPath).Files
    If oFile Like "*.csv" Then
      objA.AddNew
      objA.Fields(0) = oFile
      objA.Fields(1) = oFile.DateLastModified
      objA.Update
    End If
  Next
  objA.Sort = "ModifiedDate ASC" '昇順
  objA.MoveFirst
  Do Until objA.EOF
    '処理Start
    Debug.Print objA.Fields(1).Value & "----" & objA.Fields(0).Value
    '処理End
    objA.MoveNext
  Loop
  objA.Close
  Set objA = Nothing
  Set objF = Nothing
End Sub

一旦読み込ん並べて処理する感じです。


▼もりC さん:
>特定のフォルダ内にある.csvファイルをファイルが更新した順に
>読み込んでいく方法がわかりません。
>
>ファイルを読むには
>   pathname = ThisWorkbook.Path
>   fname = Dir(pathname & "\*.csv", vbNormal)
>
>などと記述していましたが、これでは名前順でしか対応できません。
>
>どなたかよい方法をご存知でしたら、ご教授ください。

【78889】Re:ファイルを更新順に読み込む方法
質問  もりC  - 17/2/20(月) 17:58 -

引用なし
パスワード
   ▼ウッシさん

ご回答ありがとうございます。
さっそく下記ソースを試しましたところ、
objA.MoveFirstのところでコンパイルエラーが発生します。
テストで準備したファイルに問題があるのでしょうか。
私自身知識不足なもので、見当違いな質問になっているかもしれません。
ご容赦くださいませ。

具体的に申しますと、処理の順としては、
a.csv
b.csv
c.csv



というファイルがあったとして、それぞれA列、B列にデータが入っています。
作られた日付の新しい順に、ファイル内A列から特定の文字を順に検索を掛け、
検索で引っかかった場所のB列を返すというマクロになります。


a.csv 読み込み
ファイル内検索
csv ファイルの1.列目(A列)検索 ヒットなし
a.csv ファイル閉じ

b.csv 読み込み
ファイル内検索
csv ファイルの1.列目(A列)検索 ヒットなし
b.csv ファイル閉じ

c.csv 読み込み
検索ヒット、2.列目(b列)情報取得
検索終わり

というようなプログラムを走らせたくて、
でも、日付順というのがわかりません。

一度に読み込み、別のシートにということも考えましたが、
ファイルの数が多くなると時間もかかると思われ、
何か良い方法はないものかと質問させていただきました。

またよい案がございましたら、ご教授お願いいたします。


▼ウッシ さん:
>こんにちは
>
>Sub test()
>  Dim objF  As Object
>  Dim objA  As Object
>  Dim fPath As String
>  Dim oFile As Object
>  
>  Set objF = CreateObject("Scripting.FileSystemObject")
>  Set objA = CreateObject("ADODB.Recordset")
>  objA.Fields.Append "FileName", 200, 300, 32 ', adVarChar, MaxCharacters, adFldIsNullable
>  objA.Fields.Append "ModifiedDate", 200, 300, 32
>  objA.Open
>  fPath = ThisWorkbook.Path
>  For Each oFile In objF.GetFolder(fPath).Files
>    If oFile Like "*.csv" Then
>      objA.AddNew
>      objA.Fields(0) = oFile
>      objA.Fields(1) = oFile.DateLastModified
>      objA.Update
>    End If
>  Next
>  objA.Sort = "ModifiedDate ASC" '昇順
>  objA.MoveFirst
>  Do Until objA.EOF
>    '処理Start
>    Debug.Print objA.Fields(1).Value & "----" & objA.Fields(0).Value
>    '処理End
>    objA.MoveNext
>  Loop
>  objA.Close
>  Set objA = Nothing
>  Set objF = Nothing
>End Sub
>
>一旦読み込ん並べて処理する感じです。

【78890】Re:ファイルを更新順に読み込む方法
発言  β  - 17/2/20(月) 21:22 -

引用なし
パスワード
   ▼もりC さん:

>objA.MoveFirstのところでコンパイルエラーが発生します。

こちらではコンパイルエラーはでませんが?
エクセルのバージョンは?

それはそれとして、別案。
フォルダ内のcsvファイルを最新更新日順に取り出すサンプルコードです。

Sub Test()
  Dim fPath As String
  Dim fName As String
  Dim sl As Object
  Dim k As String
  Dim i As Long
  
  Set sl = CreateObject("System.Collections.SortedList")
  fPath = ThisWorkbook.Path & "\"
  
  fName = Dir(fPath & "*.csv")
  
  Do While fName <> ""
    k = Format(FileDateTime(fPath & fName), "yyyymmddhhnnss") & " " & fName
    sl.Add k, fPath & fName
    fName = Dir()
  Loop
  
  For i = 0 To sl.Count - 1
    MsgBox sl.getbyindex(i)
  Next
  
End Sub

【78920】Re:ファイルを更新順に読み込む方法
お礼  もりC  - 17/2/23(木) 17:49 -

引用なし
パスワード
   ▼β さん:


これです!思惑通りです。
サンプルコードを分析し、活用させていただきます。
大量のデータを処理するので、助かりました。
こんなにすっきりしたコードでできるのですね。素晴らしすぎます。

EXCELのマクロですので、一旦ファイル名とタイムスタンプを適当なセルに
書き出し、タイムスタンプとファイル名にソートを掛け、
上から順番に実行するという恥ずかしいプログラムを書くところでした。

ちなみに、abjA.MoveFirst で止まったときに使用したEXCELバージョンは
2010です。

お礼が遅くなりもうしわけありません。
βさんありがとうございました。

ウッシさんもありがとうございました。
こんごともよろしくお願いします。


>▼もりC さん:
>
>>objA.MoveFirstのところでコンパイルエラーが発生します。
>
>こちらではコンパイルエラーはでませんが?
>エクセルのバージョンは?
>
>それはそれとして、別案。
>フォルダ内のcsvファイルを最新更新日順に取り出すサンプルコードです。
>
>Sub Test()
>  Dim fPath As String
>  Dim fName As String
>  Dim sl As Object
>  Dim k As String
>  Dim i As Long
>  
>  Set sl = CreateObject("System.Collections.SortedList")
>  fPath = ThisWorkbook.Path & "\"
>  
>  fName = Dir(fPath & "*.csv")
>  
>  Do While fName <> ""
>    k = Format(FileDateTime(fPath & fName), "yyyymmddhhnnss") & " " & fName
>    sl.Add k, fPath & fName
>    fName = Dir()
>  Loop
>  
>  For i = 0 To sl.Count - 1
>    MsgBox sl.getbyindex(i)
>  Next
>  
>End Sub

698 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free