Board logo

標題: [發問] 8000多個 csv 檔的格式修改 [打印本頁]

作者: sasho    時間: 2015-3-7 18:32     標題: 8000多個 csv 檔的格式修改

我目前每天都有 8000 多個 csv 檔案需要修改格式
目前我的方法是寫一個程式,一個檔案一個檔案開啟修改然後儲存
但這樣的方法我發現有個問題,就是程式可能修改了五六個檔案後就會自己停下來頓一下,
過個幾秒鐘甚至一分鐘之後又繼續,導致整個程式跑完可能要花好幾個小時。
另外就是,不知道這樣的操作方式,是否會影響到整個作業系統,導致作業系統會有許多小問題
請版上各位高手是否可以建議比較有效及正確的方式,以下是我的程式碼請參考,謝謝!

Sub 資料轉檔()

Dim i As Integer
Dim mypath As String
Dim myfile As String
Dim LastRow As Integer
Dim CompanyName As String

Application.ScreenUpdating = False
date = Format(Date, "yyyymmdd")
'date = "20150112" '指定專屬日期
mypath = "D:\record\" & date & "\"
myfile = Dir(mypath & "*.csv")

Do While myfile <> ""
    '開啟檔案
    Workbooks.Open Filename:=mypath & myfile
   
    With ActiveWorkbook.Sheets(1)
         
        '調整資料格式
        CompanyName = CStr(.Cells(2, 2))
        .UsedRange.Rows("1:3").Delete
        .UsedRange.Columns("G:K").Cut
        .Range("A" & .Rows.Count).End(xlUp).Offset(1).Insert Shift:=xlDown
        
        With .UsedRange.Range("A:A")
            
            On Error Resume Next
            .SpecialCells(xlCellTypeBlanks).EntireRow.Delete

        End With
        
        .UsedRange.Sort key1:=.Range("A1"), Order1:=xlAscending, Header:=xlNo
        .UsedRange.Columns(1) = date
        .UsedRange.Columns("B:B").Insert Shift:=xlToRight
               
        For i = 1 To .UsedRange.Rows.Count
            .Cells(i, 3) = Left(.Cells(i, 3), 4)
            .Cells(i, 5) = .Cells(i, 5).Value / 1000
            .Cells(i, 6) = .Cells(i, 6).Value / 1000
        Next
        .UsedRange.NumberFormatLocal = "G/通用格式"
        .UsedRange.Columns("B:B").NumberFormatLocal = "@"
        .UsedRange.Columns(2) = CompanyName
        
        myfile = Dir()
    End With

    '檔案儲存後關閉
    ActiveWorkbook.Close True
    DoEvents

Loop

Application.ScreenUpdating = True

End Sub
作者: GBKEE    時間: 2015-3-8 06:04

回復 1# sasho
善用  On Error Resume Next 可能是導致,修改了五六個檔案後就會自己停下來頓一下,
過個幾秒鐘甚至一分鐘之後又繼續,導致整個程式跑完可能要花好幾個小時。的主因
  1. With .UsedRange.Range("A:A")            
  2.             On Error Resume Next
  3.             .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
  4.         End With
  5.         '***下面有排序的動作,上面的.Delete似乎是多餘的 ****
  6.         .UsedRange.Sort key1:=.Range("A1"), Order1:=xlAscending, Header:=xlNo
  7.         .UsedRange.Columns(1) = date
  8.         .UsedRange.Columns("B:B").Insert Shift:=xlToRight               
複製代碼

作者: stillfish00    時間: 2015-3-9 10:07

本帖最後由 stillfish00 於 2015-3-9 10:09 編輯

回復 1# sasho
  1. date = Format(Date, "yyyymmdd")
複製代碼
date 是保留字,不要拿來命名變數,這樣寫應該會出錯吧。
  1.         .UsedRange.Columns("G:K").Cut
  2.         .Range("A" & .Rows.Count).End(xlUp).Offset(1).Insert Shift:=xlDown
複製代碼
還是附檔吧,看不懂要幹嘛,G:K剪下後插入到???
基本上這樣寫會出錯
  1.             On Error Resume Next
  2.             .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
複製代碼
On Error Resume Next不要這樣用
  1.         For i = 1 To .UsedRange.Rows.Count
  2.             .Cells(i, 3) = Left(.Cells(i, 3), 4)
  3.             .Cells(i, 5) = .Cells(i, 5).Value / 1000
  4.             .Cells(i, 6) = .Cells(i, 6).Value / 1000
  5.         Next
複製代碼
列數很多的話,可以一次提到array處理完再一次寫回
作者: sasho    時間: 2015-3-10 00:41

感謝兩位高手指點,我後來有修改了一下程式
發現問題其實並不在修改格式的程式碼中
而是在每次開開關關檔案的過程

不斷的開開關關導致我在資料夾
C:\Users\XXXXX\AppData\Roaming\Microsoft\Office\recent
建立了幾萬個捷徑!

每次開啟一個 excel 檔案,系統就會自動留存一筆資料
下次要再開起的時候,就可以直接到檔案 -> 最近 的清單中點選
而這個資料夾中的捷徑就是這些檔案的連結

所以我想,如果是要開開關關 EXCEL 檔案的話,可能是沒解了
不曉得各位高手是否可以建議該如何將 .CSV 的資料讀取後修改原本的檔案呢?
目前 google 到的都只有寫入 或 輸出 分別的方法,
且大部分都是循序讀取,有辦法一次將整個文本讀到記憶體中做處理嗎?

先向各位高手致謝拉~~




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)