2014-01-15 35 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