| 
    
     |  | 同様の質問が過去にありませんでしたのでお願いします。 
 下記マクロでC:\system にあるCSVファイルを読み込もうと思います。
 
 しかしダイアログを開いてファイルを選択するのではなく
 C:\system にCSVファイルが追加されたら自動的に読み込む
 或いは一定時間ごとにC:\systemに新しく追加されたファイルを読みに行く
 などの動作にしたく思います。
 
 どのようにすればよいかご指導をお願いします。
 
 補足
 ・CSVファイルは毎日不定期にC:\systemフォルダに追加されます。
 ファイル名は050903~1.txt、050903~2.txt、・・・ という具合で
 
 ・エクセルは常時稼動させておきます。
 
 何卒よろしくお願いいたします。
 
 
 Option Explicit
 
 Public Sub データ収集()
 
 '日付の先頭位置の前の列
 Const clngTop As Long = 11
 
 Dim strPath As String
 Dim vntFileName As Variant
 Dim dfn As Integer
 Dim vntField As Variant
 Dim strBuff As String
 Dim lngCol As Long
 Dim lngRow As Long
 Dim rngScope As Range
 Dim rngResult As Range
 Dim rngDate As Range
 Dim strProm As String
 Dim strNoMatch As String
 
 'Textファイルの有るフォルダを指定
 strPath = "C:\system"
 
 '「ファイルを開く」ダイアログを表示
 If Not GetReadFile(vntFileName, strPath, False) Then
 strProm = "マクロがキャンセルされました"
 GoTo WayOut
 End If
 Application.ScreenUpdating = False
 
 'ActiveSheetのA1セルを基準とする(Listの左上隅)
 Set rngResult = ActiveSheet.Cells(7, "A")
 With rngResult
 '日付の書かれている列数を取得
 lngCol = .Offset(, 256 - .Column).End(xlToLeft).Column _
 - .Offset(, clngTop).Column
 '日付列の範囲を取得
 If lngCol > 0 Then
 Set rngDate = .Offset(, clngTop + 1).Resize(, lngCol)
 
 End If
 'No.が有る行数を取得
 lngRow = .Offset(65536 - .Row).End(xlUp).Row - .Row
 'No.が有る範囲を取得
 If lngRow > 0 Then
 Set rngScope = .Offset(1).Resize(lngRow)
 End If
 End With
 
 '指定されたファイルをOpen
 dfn = FreeFile
 Open vntFileName For Input As dfn
 
 'ファイルから日付を取得
 Do Until EOF(dfn)
 'ファイルから1行読み込み
 Line Input #dfn, strBuff
 'フィールドに分割
 vntField = Split(strBuff, ",", , vbBinaryCompare)
 '「20050731」形式の日付をシリアル値に変換
 vntField(0) = CLng(DateValue(Left(vntField(0), 4) _
 & "/" & Mid(vntField(0), 5, 2) _
 & "/" & Right(vntField(0), 2)))
 '日付を探索
 lngCol = GetDateColumn(vntField(0), rngDate, _
 rngResult.Offset(, clngTop)) + clngTop
 If lngCol = 0 + clngTop Then
 
 '該当日付が無い場合、メセージを出し直ちに終了する
 strProm = Format(vntField(0), "m/d") & " の日付が有りません。"
 GoTo WayOut
 Else
 'No.を探索
 lngRow = GetTagNoRow(vntField(5), rngScope, rngResult)
 '日付、Noの交差するセルに値を書き込み
 With rngResult.Offset(lngRow, lngCol)
 .NumberFormatLocal = "G/標準"
 .Value = vntField(6)
 End With
 End If
 Loop
 
 If strNoMatch = "" Then
 strProm = "処理が完了しました"
 Else
 strProm = "以下の該当しない日付がファイルに存在します" & vbCrLf & strNoMatch
 End If
 
 WayOut:
 
 Close #dfn
 
 Application.ScreenUpdating = True
 
 Set rngScope = Nothing
 Set rngDate = Nothing
 Set rngResult = Nothing
 
 Beep
 MsgBox strProm
 
 End Sub
 
 
 Private Function GetDateColumn(vntDate As Variant, _
 rngScope As Range, _
 rngDateTop As Range) As Long
 
 Dim lngFound As Long
 Dim lngOver As Long
 Dim lngCount As Long
 
 '日付範囲に日付が無いなら
 If rngScope Is Nothing Then
 lngFound = 0
 lngCount = 0
 lngOver = 1
 Else
 '日付の探索
 'セル値が数値として入力されている場合
 lngFound = DataSearch(CLng(vntDate), rngScope, lngOver)
 'セル値が文字列として入力されている場合
 '    lngFound = DataSearch(vntDate, rngScope, lngOver)
 lngCount = rngScope.Columns.Count
 End If
 
 '日付が見つかった場合
 If lngFound > 0 Then
 '位置を返す
 GetDateColumn = lngFound
 Else
 With rngDateTop
 '日付が最終列の以内の場合
 If lngOver <= lngCount Then
 '指定位置に列を挿入
 .Offset(, lngOver).EntireColumn.Insert
 End If
 '日付を書き込み
 With .Offset(, lngOver)
 .NumberFormatLocal = "m/d"
 .Value = vntDate
 End With
 '挿入位置を返す
 GetDateColumn = lngOver
 '日付列の範囲を更新
 Set rngScope _
 = .Offset(, 1).Resize(, lngCount + 1)
 End With
 End If
 
 End Function
 
 Private Function GetTagNoRow(vntTagNo As Variant, _
 rngScope As Range, _
 rngListTop As Range) As Long
 
 Dim lngFound As Long
 Dim lngCount As Long
 
 'No範囲にNoが無いなら
 If rngScope Is Nothing Then
 lngFound = 0
 lngCount = 0
 Else
 'Noを探索
 lngFound = DataSearch(vntTagNo, rngScope, , 0)
 lngCount = rngScope.Rows.Count
 End If
 
 '探索成功(Noが有るなら)
 If lngFound > 0 Then
 '位置を返す
 GetTagNoRow = lngFound
 Else
 With rngListTop
 '行末位置を更新
 lngCount = lngCount + 1
 '行末にNoを書き込み
 .Offset(lngCount).Value = vntTagNo
 '挿入位置を返す
 GetTagNoRow = lngCount
 '探索範囲の更新
 Set rngScope _
 = .Offset(1).Resize(lngCount)
 End With
 End If
 
 End Function
 
 Private Function DataSearch(vntKey As Variant, _
 rngScope As Range, _
 Optional lngOver As Long, _
 Optional lngMode As Long = 1) As Long
 
 Dim vntFind As Variant
 
 'Matchによる二分探索
 vntFind = Application.Match(vntKey, rngScope, lngMode)
 lngOver = 1
 'もし、エラーで無いなら
 If Not IsError(vntFind) Then
 'もし、Key値と探索位置の値が等しいなら
 If vntKey = rngScope(vntFind).Value Then
 '戻り値として、行位置を代入
 DataSearch = vntFind
 End If
 'Key値を超える最小値のある行
 lngOver = vntFind + 1
 End If
 
 End Function
 
 Private Function GetReadFile(vntFileNames As Variant, _
 Optional strFilePath As String, _
 Optional blnMultiSel As Boolean _
 = False) As Boolean
 
 Dim strFilter As String
 
 'フィルタ文字列を作成
 strFilter = "Text File (*.txt),*.txt,"
 
 '読み込むファイルの有るフォルダを指定
 If strFilePath <> "" Then
 'ファイルを開くダイアログ表示ホルダに移動
 ChDrive Left(strFilePath, 1)
 ChDir strFilePath
 End If
 'もし、ディフォルトのファイル名が有る場合
 If vntFileNames <> "" Then
 SendKeys vntFileNames & "{TAB}", False
 End If
 '「ファイルを開く」ダイアログを表示
 vntFileNames _
 = Application.GetOpenFilename(strFilter, 2, , , blnMultiSel)
 If VarType(vntFileNames) = vbBoolean Then
 Exit Function
 End If
 
 GetReadFile = True
 
 End Function
 
 |  |