在Excel VBA中快速从CSV文件中提取行

时间:2016-09-16 00:38:37

标签: excel excel-vba vba

我有大约5000个.csv文件,我想在每个文件中搜索一行并将其解压缩。我已经粘贴了下面代码的关键部分,但是由于我必须打开和关闭每个.csv文件,因此5000个文件的进程很慢。有没有办法在不打开它的情况下读取csv文件?我曾考虑过编写一个小脚本来首先将每个csv文件转换为Excel? THX。

SP_File_Name = Dir(DN_Path & "*.*")
Count = 1

Set START_CELL_RANGE = TARGET_SP_SHEET.Range("B3")
Set TICKER_CODE_RANGE = TARGET_SP_SHEET.Range("B1")


   While (SP_File_Name <> "")
    SP_Full_Path = DN_Path & SP_File_Name
    Workbooks.OpenText Filename:=SP_Full_Path, DataType:=xlDelimited, comma:=True, Local:=True

    Set INPUT_WORKBOOK = ActiveWorkbook
    Set INPUT_SHEET = INPUT_WORKBOOK.Worksheets(1)
    INPUT_SHEET.Range("$A$1").Select
    Set INPUT_RANGE = ActiveCell.CurrentRegion

    Set INPUT_FIRST_MATCH_RANGE = INPUT_RANGE.Find(TICKER_CODE_RANGE)

    If INPUT_FIRST_MATCH_RANGE Is Nothing Then
    GoTo NOT_FOUND
    End If


    START_CELL = START_CELL_RANGE.Address

    TARGET_SP_SHEET.Range(START_CELL_RANGE.Address, START_CELL_RANGE.Offset(0, 6).Address).Value = INPUT_SHEET.Range(INPUT_FIRST_MATCH_RANGE.Address, INPUT_FIRST_MATCH_RANGE.Offset(0, 7).Address).Value

    ' write diagnostics
    Sheet5.Range("K" & Count + 4).Value = START_CELL
    Sheet5.Range("L" & Count + 4).Value = "$A$1"
    Sheet5.Range("M" & Count + 4).Value = INPUT_FIRST_MATCH_RANGE.Address
    Sheet5.Range("N" & Count + 4).Value = INPUT_FIRST_MATCH_RANGE.Offset(0, 7).Address

NOT_FOUND:
    Set START_CELL_RANGE = START_CELL_RANGE.Offset(1, 0)

    Workbooks(SP_File_Name).Close SaveChanges:=False
    SP_File_Name = Dir
    Count = Count + 1

  Wend

2 个答案:

答案 0 :(得分:0)

要从VBA调用cmd命令,我使用了WshShell。对于早期绑定,我设置了对Windows脚本宿主对象模型的引用

Shell函数的一个问题是它以异步方式运行。通过使用WshShell Run方法,您可以等到完成后再执行后续命令。

示例代码可能如下所示:

Option Explicit
Sub foo()
 Dim WSH As WshShell
 Dim lErrCode As Long

Set WSH = New WshShell
lErrCode = WSH.Run("cmd /c findstr /C:""Power"" ""C:\Users\Ron\filelist.txt"" > ""C:\Users\Ron\Results2.txt""", 1, True)
    If lErrCode <> 0 Then
        MsgBox "Error Code: " & lErrCode
        Stop
    End If
Set WSH = Nothing

Call Shell
End Sub

关于您在评论中显示的命令,我将确保VBA正确地为cmd提示解释字符串。看看你的代码行,我想知道你是否错过了搜索字符串和文件路径之间的空格。

答案 1 :(得分:0)

我不认为你可以在不打开文件的情况下阅读文件的内容。为什么不将所有5000个文件合并为1个单独的文件并将其读入Excel。当然会更快。使用命令窗口,将其指向包含所有5000个文件的文件夹,然后输入:

复制* .csv merge.csv

请参阅以下链接以获取示例。

http://analystcave.com/merge-csv-files-or-txt-files-in-a-folder/