2014-01-15 34 views
0

我在一年中的每一天(即2013-01-01.txt,2013-01-02.txt)的表(線和選項卡)中組織了一個txt文件,等等。在Excel中訪問並從多個txt文件中獲取值

我要在裏面這個文件中得到的價格的產品價格。我的工作表看起來就像這樣:

+------------+------------+------------+------------+------------+ 
| Price | 2013-12-26 | 2013-12-27 | 2013-12-30 | 2013-12-31 | 
+------------+------------+------------+------------+------------+ 
| Watermelon | 1   | 1.5  | 1.35  | 1.85  | 
| Botato  | 0.55  | 0.65  | 0.55  | 0.8  | 
+------------+------------+------------+------------+------------+ 

我可以假設有兩個選項是:

  1. 打開它使用Workbooks.Open()得到我需要的,然後關閉文件中的值文件:

    Workbooks.Open (Path) 
    'Get values 
    Workbooks.Close 
    
  2. 打開更新文件

    With ActiveSheet.QueryTables.Add(Connection:= ...) 
        .name = path 
    End With 
    'Get values 
    ActiveWorkbook.Connections(Path).Delete 
    

有人想用另一種方式來實現它嗎?哪一個是更快更好理解?

+0

來自文本文件的數據應該在數據庫中嗎? – pnuts

+0

不是。問題是我已經有了txt文件。我不認爲將其導入數據庫比選擇其中一個選項更容易。 :-) – Makah

+0

那麼直接從文本文件中讀取數據而不用在Excel中打開文本文件呢?您可以使用例如TextStream對象,例如這裏:http://vba4all.wordpress.com/category/vba-macros/reading-txt-files-from-vba/ – dee

回答

1

如果你想在Excel中打開每個文件,而不是使用文本流,然後下面的代碼應該可以幫助您:

Sub OpenTxtFileInExcel() 

Dim basicWorkbook, actWorkbook As Workbook 
Dim basicSheet, actSheet As Worksheet 
Dim filePath As String 
Dim actDate As Date 
Dim searchedProduct As String 
Dim counterColumn, counterRow As Integer 
Dim products As Variant 
products = Array("Lemon", "Mango", "Durian") 

Set basicWorkbook = Application.ActiveWorkbook 
Set basicSheet = basicWorkbook.Worksheets(1) 

actDate = CDate("01-01-2013") 
counterColumn = 0 

Do While actDate < CDate("01-01-2014") 
    filePath = Format(actDate, "yyyy-MM-dd") & ".txt" 
    Workbooks.OpenText Filename:=filePath, Origin:= _ 
     xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote _ 
     , ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, Comma:= _ 
     True, Space:=False, Other:=True, OtherChar:=False 

    Set actWorkbook = Application.ActiveWorkbook 
    Set actSheet = basicWorkbook.Worksheets(1) 

    basicSheet.Range("B1").Offset(0, counterColumn).Value = Format(actDate, "yyyy-MM-dd") 
    For counterRow = 0 To UBound(products) 
     basicSheet.Range("A2").Offset(counterRow, 0).Value = products(counterRow) 
     basicSheet.Range("B2").Offset(counterRow, counterColumn).Value = _ 
      Application.WorksheetFunction.VLookup(products(counterRow), actSheet.Range("A:B"), 2, False) 
    Next counterRow 

    actWorkbook.Close 

    counterColumn = counterColumn + 1 
    actDate = DateAdd("d", 1, actDate) 
Loop 

End Sub 

命令Workbooks.OpenText是文本文件的結構非常dependend,你應該記錄此命令(在Excel 2007/2010中:視圖>宏>記錄Macor ...),只需通過Excel打開文本文件,就可以使vlookup工作。

+0

所以你選擇選項(1)'Workbooks.Open()'。謝謝你的回答。 – Makah

+0

我個人認爲我會選擇(1)或(2)來實現你想要的,但會在後臺打開textstream文本文件並運行所有數據。但是因爲你已經有了VLOOKUP這個想法,所以我只需要遵循這個選項(1)即可。 – Graffl

+0

該文件已經是表格格式,這就是爲什麼我認爲VLOOKUP更好,然後用正則表達式或其他東西解析文件。 – Makah