我有多个.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 行。
您实际上并没有在 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 个字符串,而不是打开/关闭文件或读取数千行......
如@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
这还将动态扩展阵列,以容纳找到的任意数量的文件。