现在,这是一个非常粗略的示例,但它应该让您了解如何开始以及如何自定义此方法以满足您的需求。假设您在名为example.txt的文本文件中有以下数据:
Name|Age|DoB|Data1|Data2|Data3
David|25|1987-04-08|100|200|300
John|42|1960-06-21|400|500|600
Sarah|15|1997-02-01|700|800|900
此文件位于文件夹C:\Downloads中。要在 VBA 中使用 ADO 进行查询,您需要参考Microsoft ActiveX Data Objects 2.X Library,其中 X 是您安装的最新版本。我还参考了Microsoft 脚本库来创建我的Schema.ini运行时的文件,以确保我的数据被正确读取。如果没有 Schema.ini 文件,您将面临驱动程序无法读取数据的风险。文本中的数字有时会无缘无故地被读取为 null,日期也经常返回 null。Schema.ini 文件为文本驱动程序提供了数据的准确定义以及如何处理它。您不必像我所做的那样明确定义每一列,但至少您应该设置Format、ColNameHeader 和 DateTimeFormat值。
使用的示例 Schema.ini 文件:
[example.txt]
Format=Delimited(|)
ColNameHeader=True
DateTimeFormat=yyyy-mm-dd
Col1=Name Char
Col2=Age Integer
Col3=DoB Date
Col4=Data1 Integer
Col5=Data2 Integer
Col6=Data3 Integer
您会注意到文件名包含在第一行的括号中。这不是可选的,它还允许您为不同的文件定义不同的模式。如前所述,我在运行时在 VBA 中创建了我的 Schema.ini 文件,其内容如下:
Sub CreateSchema()
Dim fso As New FileSystemObject
Dim ts As TextStream
Set ts = fso.CreateTextFile(FILE_DIR & "Schema.ini", True)
ts.WriteLine "[example.txt]"
ts.WriteLine "Format=Delimited(|)"
ts.WriteLine "ColNameHeader=True"
ts.WriteLine "DateTimeFormat=yyyy-mm-dd"
ts.WriteLine "Col1=Name Char"
ts.WriteLine "Col2=Age Integer"
ts.WriteLine "Col3=DoB Date"
ts.WriteLine "Col4=Data1 Integer"
ts.WriteLine "Col5=Data2 Integer"
ts.WriteLine "Col6=Data3 Integer"
Set fso = Nothing
Set ts = Nothing
End Sub
您会注意到我使用了变量 FILE_DIR,它是我在模块顶部定义的常量。您的 Schema.ini 文件 - 必须 - 与您的数据文件位于同一位置。您查询的连接字符串也使用此目录,因此我定义了常量以确保它们引用相同的位置。这是我的模块的顶部,带有 FILE_DIR 常量以及连接字符串和 SQL 查询:
Option Explicit
Const FILE_DIR = "C:\Downloads\"
Const TXT_CONN = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" & FILE_DIR & ";Extensions=asc,csv,tab,txt;"
Const SQL = "SELECT Name, DoB, ((Data1 + Data2 + Data3)/3) AS [Avg_of_Data]" & _
"FROM example.txt "
注意TXT_CONN中称为Dbq的部分。这是存储数据文件的目录。实际上,您将在 SQL 字符串的 WHERE 子句中定义您使用的特定文件。SQL常量包含您的查询字符串。在这种情况下,我们只选择名称、DoB 和平均三个数据值。完成所有这些后,您就可以实际执行查询了:
Sub QueryText()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim i As Integer
'Define/open connection
With cn
.ConnectionString = TXT_CONN
.Open
'Query text file
With rs
.Open SQL, cn
.MoveFirst
'Loop through/print column names to Immediate Window
For i = 0 To .Fields.Count - 1
Debug.Print .Fields(i).Name
Next i
'Loop through recordset
While Not (.EOF Or .BOF)
'Loop through/print each column value to Immediate Window
For i = 0 To .Fields.Count - 1
Debug.Print .Fields(i)
Next i
.MoveNext
Wend
.Close 'Close recordset
End With
.Close 'Close connection to file
End With
Set rs = Nothing
Set cn = Nothing
End Sub
我知道我在上面的评论中说过这样做非常简单,而且这看起来需要做很多工作,但我向你保证不是。您可以只使用 QueryText() 方法并最终得到类似的结果。但是,我已经包含了所有其他内容,以尝试为您提供一些想法,让您了解可以将其用于您的项目的地方,并向您展示如果您没有得到预期的结果,如何解决您可能遇到的问题.
这是我最初学习的指南:http: //msdn.microsoft.com/en-us/library/ms974559.aspx
这是对实际 Excel 文件执行相同操作的指南:http: //support.microsoft.com/kb/257819
最后,这里有更多关于 Schema.ini 文件的信息:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms709353 (v=vs.85).aspx
希望您能够找到一种方法在您的工作中利用所有这些信息!学习所有这些的一个附带好处是您可以使用 ADO 来查询实际的数据库,例如 Access、SQL Server 和 Oracle。该代码与此处打印的代码几乎相同。只需换掉连接字符串、sql 字符串,然后忽略有关 Schema.ini 文件的全部内容。