如何在目录中找到所有.csv文件的长度?

时间:2015-06-12 13:03:52

标签: vba file csv

我有多个.csv文件,我需要找到我目录中的长度。 (包含数据的行数。)我正在同一目录中的.xlsx文件中运行以下代码。 (我打算最终将.csv文件中的数据复制到.xlsx文件中。)

i = 1
FilePath = Application.ActiveWorkbook.Path & "\"
file = Dir(FilePath & "*.csv")
Do While Len(file) > 0
    Open FilePath & file For Input As #1
        length(i) = Cells(Rows.Count, 1).End(xlUp).Row 
        i = i + 1
    Close #1
    file = Dir
Loop

长度数组的所有值最终都为1,即使.csv文件可能长达15-20行。

2 个答案:

答案 0 :(得分:1)

您实际上并没有在Excel中打开文件,因此无法计算有多少个单元格。尝试阅读多少行:

Open FilePath & file For Input As #1
    While Not EOF(1): Line Input #1, trashLine: Wend
    i = i + 1
Close #1

或者,在Excel中打开文件 - 测试 - 然后关闭:

Set tempWB = Workbooks.Open(FilePath & file)
    i = i + tempWB.Sheets(1).Cells(tempWB.Sheets(1).Rows.Count, 1).End(xlUp).Row
tempWB.Close False

或者更快的方法是使用Windows脚本:

 Dim i As Long

 For Each varFile In _
    Filter(Split(CreateObject("WScript.Shell").Exec("cmd /c find /v /c """" """ _
    & ThisWorkbook.Path & "\*.csv""").StdOut.ReadAll, vbCrLf), ":")

    i = i + CLng(Split(varFile, ":")(2))

 Next

 Debug.Print i

这样,如果你有10个文件,代码只能使用10个字符串,而不是打开/关闭文件或读取数千行...

答案 1 :(得分:0)

@SOofWXLS所述,您的代码不是在Excel中打开文件,而是为直接i / o打开它们。

这是一个完整的代码示例,它将使用您尝试的文件长度填充数组。

Dim fPath As String
Dim fName As String
Dim hFile As Long
Dim i As Long
Dim NumLines As Long
Dim length() As Long
Dim strLine As String

ReDim length(1 To 1)
fPath = Application.ActiveWorkbook.Path & "\"
fName = Dir(fPath & "*.csv")
Do While Len(fName) > 0
    i = i + 1
    NumLines = 0
    ReDim Preserve length(1 To i)
    hFile = FreeFile
    Open fPath & fName For Input As hFile
    Do While Not EOF(hFile)
        Line Input #hFile, strLine
        NumLines = NumLines + 1
    Loop
    Close hFile
    length(i) = NumLines
    fName = Dir
Loop

这也会动态扩展您的数组以容纳找到的文件。