对于这么多记录,您最好将 .csv 导入 Microsoft Access,为某些字段编制索引,编写仅包含所需内容的查询,然后从查询中导出到 Excel。
如果您确实需要仅 Excel 的解决方案,请执行以下操作:
打开 VBA 编辑器。导航到工具 -> 参考。选择最新的 ActiveX 数据对象库。 (简称 ADO)。在我运行 Excel 2003 的 XP 机器上,它是 2.8 版。
如果您还没有模块,请创建一个模块。或者创建一个以包含本文底部的代码。
在任何空白工作表中,从单元格 A1 开始粘贴以下值:
选择字段 1、字段 2
FROM C:\Path\To\file.csv
WHERE Field1 = 'foo'
按字段排序2
(此处的格式问题。select from 等应在 A 列中各自的行中以供参考。其他内容是重要的部分,应在 B 列中。)
根据您的文件名和查询要求修改输入字段,然后运行getCsv() 子例程。它会将结果放入从单元格 C6 开始的 QueryTable 对象中。
我个人讨厌 QueryTables,但我更喜欢与 ADO 一起使用的 .CopyFromRecordset 方法不会为您提供字段名称。我留下了该方法的代码,注释掉了,所以你可以用这种方式进行调查。如果你使用它,你可以摆脱对deleteQueryTables() 的调用,因为它是一个非常丑陋的黑客,它会删除你可能不喜欢的整列,等等。
编码愉快。
Option Explicit
Function ExtractFileName(filespec) As String
' Returns a filename from a filespec
Dim x As Variant
x = Split(filespec, Application.PathSeparator)
ExtractFileName = x(UBound(x))
End Function
Function ExtractPathName(filespec) As String
' Returns the path from a filespec
Dim x As Variant
x = Split(filespec, Application.PathSeparator)
ReDim Preserve x(0 To UBound(x) - 1)
ExtractPathName = Join(x, Application.PathSeparator) & Application.PathSeparator
End Function
Sub getCsv()
Dim cnCsv As New ADODB.Connection
Dim rsCsv As New ADODB.Recordset
Dim strFileName As String
Dim strSelect As String
Dim strWhere As String
Dim strOrderBy As String
Dim strSql As String
Dim qtData As QueryTable
strSelect = ActiveSheet.Range("B1").Value
strFileName = ActiveSheet.Range("B2").Value
strWhere = ActiveSheet.Range("B3").Value
strOrderBy = ActiveSheet.Range("B4").Value
strSql = "SELECT " & strSelect
strSql = strSql & vbCrLf & "FROM " & ExtractFileName(strFileName)
If strWhere <> "" Then strSql = strSql & vbCrLf & "WHERE " & strWhere
If strOrderBy <> "" Then strSql = strSql & vbCrLf & "ORDER BY " & strOrderBy
With cnCsv
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & ExtractPathName(strFileName) & ";" & _
"Extended Properties=""text;HDR=yes;FMT=Delimited(,)"";Persist Security Info=False"
.Open
End With
rsCsv.Open strSql, cnCsv, adOpenForwardOnly, adLockReadOnly, adCmdText
'ActiveSheet.Range("C6").CopyFromRecordset rsCsv
Call deleteQueryTables
Set qtData = ActiveSheet.QueryTables.Add(rsCsv, ActiveSheet.Range("C6"))
qtData.Refresh
rsCsv.Close
Set rsCsv = Nothing
cnCsv.Close
Set cnCsv = Nothing
End Sub
Sub deleteQueryTables()
On Error Resume Next
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
Dim qt As QueryTable
Dim qtName As String
Dim nName As Name
For Each qt In ActiveSheet.QueryTables
qtName = qt.Name
qt.Delete
For Each nName In Names
If InStr(1, nName.Name, qtName) > 0 Then
Range(nName.Name).EntireColumn.Delete
nName.Delete
End If
Next nName
Next qt
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
End With
End Sub