標題:
[發問]
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 可能是導致,修改了五六個檔案後就會自己停下來頓一下,
過個幾秒鐘甚至一分鐘之後又繼續,導致整個程式跑完可能要花好幾個小時。的主因
With .UsedRange.Range("A:A")
On Error Resume Next
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End With
'***下面有排序的動作,上面的.Delete似乎是多餘的 ****
.UsedRange.Sort key1:=.Range("A1"), Order1:=xlAscending, Header:=xlNo
.UsedRange.Columns(1) = date
.UsedRange.Columns("B:B").Insert Shift:=xlToRight
複製代碼
作者:
stillfish00
時間:
2015-3-9 10:07
本帖最後由 stillfish00 於 2015-3-9 10:09 編輯
回復
1#
sasho
date = Format(Date, "yyyymmdd")
複製代碼
date 是保留字,不要拿來命名變數,這樣寫應該會出錯吧。
.UsedRange.Columns("G:K").Cut
.Range("A" & .Rows.Count).End(xlUp).Offset(1).Insert Shift:=xlDown
複製代碼
還是附檔吧,看不懂要幹嘛,G:K剪下後插入到???
基本上這樣寫會出錯
On Error Resume Next
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
複製代碼
On Error Resume Next不要這樣用
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
複製代碼
列數很多的話,可以一次提到array處理完再一次寫回
作者:
sasho
時間:
2015-3-10 00:41
感謝兩位高手指點,我後來有修改了一下程式
發現問題其實並不在修改格式的程式碼中
而是在每次開開關關檔案的過程
不斷的開開關關導致我在資料夾
C:\Users\XXXXX\AppData\Roaming\Microsoft\Office\recent
建立了幾萬個捷徑!
每次開啟一個 excel 檔案,系統就會自動留存一筆資料
下次要再開起的時候,就可以直接到檔案 -> 最近 的清單中點選
而這個資料夾中的捷徑就是這些檔案的連結
所以我想,如果是要開開關關 EXCEL 檔案的話,可能是沒解了
不曉得各位高手是否可以建議該如何將 .CSV 的資料讀取後修改原本的檔案呢?
目前 google 到的都只有寫入 或 輸出 分別的方法,
且大部分都是循序讀取,有辦法一次將整個文本讀到記憶體中做處理嗎?
先向各位高手致謝拉~~
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)