2016-08-29 34 views
0

我想做三件事:如果第2列和第3列中的值符合標準,則從一個CSV導入數據,根據映射鍵翻譯此數據並輸出此翻譯後的數據轉換爲新的CSV。從CSV複製數據並將其輸出到另一個

Sub in_out() 



dim file_path as string 
file_path = Worksheets("Sheet1").Range("A1").Value 
open file_path for input as #1 
row_count = 0 

sheets("Sheet1").UsedRange.ClearContents 
Range("A1").Select 

Do Until EOF(1) 
    Line Input #1, Line_FromFile 
    Line_Items = Split(Line_FromFile, ",") 

    If Line_Item(2) = Worksheets("sheet1").Range("B2").Value And Line_Item(3) = Worksheets("sheet1").Range("C2").Value Then 


    ActiveCell.Offset(row_count, 0).Value = Line_Items(1) 
    ActiveCell.Offset(row_count, 1).Value = Line_Items(2) 

    row_count = row_count +1 
    Loop 

    else 
    row_count = row_count +1 
    Loop 

    end if 

    row_count = row_count +1 
    Loop 




Close #1 

End sub 
+0

嘗試使用'選項Excplicit「在你的模塊的開頭。這有助於防止像使用row_num而不是row_count這樣的錯誤...不要依賴'activecell'。 – Jochen

回答

3

您可以考慮將SQL與ADODB連接而不是僅使用VBA。對於大的CSV,這應該比循環每一行快得多。

像這樣的SQL語句可以做到這一點。

SELECT * 
INTO [Text;DATABASE=L:\Out-Folder].tblOut.csv 
FROM [Text;DATABASE=L:\In-Folder].tblIn.csv 
WHERE column2 = criteria1 AND column2 = criteria2 

請注意,您需要描述CSV結構的schema.ini-File。這些設置相當簡單快捷。

然後,您既可以

一)運行表示,從直接的SQL查詢從MS Access作爲MS-Access查詢

b)運行在MS Access-VBA的SQL就像這樣:

Dim sql As String 
sql = "SELECT * INTO ... FROM ... WHERE ..." 
CurrentDb.Execute sql, dbFailOnError 

C)從Excel-VBA運行它,如果你要使用Excel。這需要你建立一個ADODB.Connection第一,大致是這樣的:

Dim MyConn As ADODB.Connection 
Dim MyCmd As ADODB.Command 

With MyConn 
    .Provider = "Microsoft.ACE.OLEDB.12.0" 
    .Open yourDB.accdb 
End With 

With MyCmd 
    Set .ActiveConnection = MyConn 
    .CommandText = strSQL 
    .CommandType = adCmdText 
    .Execute 
End With 

Set MyCmd = Nothing 
Set MyConn = Nothing 

一般說明:

  • 發展

  • 既然你在,一定要備份你原來的CSV對每一行使用相同的過濾器標準(單元格B2和C2),調整SQL非常直接,可以通過讀取Cell-Contents(在Excel中)或使用UserForm (在Access中)。

  • 請注意,在c)中,我首先連接到名爲yourDB.accdb的ACCDB,這在我的代碼中顯然沒有意義,因爲您可以直接使用the proper connection string連接到文本文件。但是,如果您計劃執行一些映射,則可以在所述Access數據庫中維護映射表並在SQL中使用它們(使用連接)。

  • 另外,我個人喜歡這樣一個事實,即在這種情況下,任何路徑信息都包含在SQL語句中,即使它的性能稍微慢一點。

編輯: 當然,如果你寧願將數據追加到輸出CSV(而不是取代它),你可以使用一個INSERT語句來是這樣的:

INSERT INTO [Text;DATABASE=L:\Out-Folder].tblOut.csv 
SELECT * 
FROM [Text;DATABASE=L:\In-Folder].tblIn.csv 
WHERE column2 = criteria1 AND column2 = criteria2 
+0

感謝您的反饋。我沒有考慮過使用SQL/VBA,因爲一些可訪問性問題使VBA成爲首選。 – DJohnson1990

相關問題