将 CSV 文件的内容复制到现有工作簿,然后移动 CSV

Posted

技术标签:

【中文标题】将 CSV 文件的内容复制到现有工作簿,然后移动 CSV【英文标题】:Copy contents of CSV files to an exisiting workbook then move CSV 【发布时间】:2016-01-14 11:06:37 【问题描述】:

我正在尝试:

从特定文件夹打开每天生成的 CSV 文件(文件名更改),将内容粘贴到不同的 Excel 工作簿中,然后将 CSV 文件移动到原始文件夹中的子文件夹中。

对复制的数据进行过滤,将过滤后的数据提取到单独的工作表中,这将成为一个大数据表。

重复此过程,直到 CSV 文件所在的文件夹中没有任何文件。

我编写了一个宏来打开一个 CSV 文件,(如果您指定了确切的文件名)然后将内容复制到 Excel 工作簿。

我还编写了一个宏,可以将文件夹中的所有 CSV 文件移动到子文件夹中。

我遇到的问题是将两者结合起来。

Sub Master()

'Open File

Dim rDest As Range
Set rDest = ThisWorkbook.Sheets("Paste Here").Range("A1:Z300")
Dim MyFolder As String
Dim MyFile As String
MyFolder = "C:\Users\danielt\Desktop\CSV Files"
MyFile = Dir(MyFolder & "\*.csv")
Do While MyFile <> ""
Workbooks.Open filename:=MyFolder & "\" & MyFile

'Copy Contents

Sheets(1).Select
Sheets(1).Range("A1:Z300").Select
Selection.Copy

'Paste Contents into "Paste here" sheet

rDest.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.DisplayAlerts = False

'Close opened file

ActiveWorkbook.Close SaveChanges:=False

'Move to new folder named "harvested"

Dim FSO As Object
Dim FromPath As String
Dim ToPath As String
Dim FileExt As String
Dim FNames As String

FromPath = "C:\Users\danielt\Desktop\CSV Files"
ToPath = "C:\Users\danielt\Desktop\CSV Files\Harvested"
FileExt = "*.csv*"

If Right(FromPath, 1) <> "\" Then
    FromPath = FromPath & "\"
'End If

'FNames = Dir(FromPath & FileExt)
'If Len(FNames) = 0 Then
'MsgBox "No files in " & FromPath
'Exit Sub

End If
Set FSO = CreateObject("scripting.filesystemobject")
  'FSO.MoveFile Source:=FromPath & FileExt, Destination:=ToPath
FSO.MoveFile Source:=FromPath & FileExt, Destination:=ToPath

'Apply filter and copy & paste to report

'The filter is very long so I haven't included this. (But it runs fine)

'Transpose data from "report" to "raswcsvdata"

Sheets("Report").Select
Range("C3:C33").Select
Selection.Copy
Sheets("RawCSVdata").Select
Range("A" & Rows.Count).End(xlUp).Offset(1).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=True

'Clear report & paste here

Public Function GetValueFromDelimString(sPackedValue As String, nPos As Long, Optional sDelim As String)

Dim sElements() As String

sElements() = Split(sPackedValue, sDelim)
If UBound(sElements) < nPos Then
GetValueFromDelimString = ""
Else
GetValueFromDelimString = sElements(nPos)
End If

End Function


Function FindN(sFindWhat As String, sInputString As String, N As Integer) As Integer
Dim J As Integer
Application.Volatile
FindN = 0
For J = 1 To N
FindN = InStr(FindN + 1, sInputString, sFindWhat)
If FindN = 0 Then Exit For
Next
End Function

' Open next file

MyFile = Dir
Loop

End Sub

【问题讨论】:

在部分代码中使用Dir 而在另一部分中使用FileSystemObject 似乎有点奇怪。我会在整个过程中使用FSO,因为它还具有循环文件的能力。整个代码听起来像是一个大循环,您在其中循环浏览文件夹中的 csv 文件,处理它们,然后移动它们。它们部分的过程可以移动到一个 sub,它采用文件名或打开的文件本身,以及目标工作簿作为参数。这样可以防止整个程序的主循环变得过大。 感谢您的快速回复。我想我应该补充一点,我是 VBA 的新手,因为我以前从未使用过它。因此,大部分代码都是从各种论坛中提取的,以使其启动并运行。我可以简单地将 Dir 零件转为 FSO 吗?还是比这更复杂? 【参考方案1】:

这不是一个完整的答案,因为我对您的意图不够清楚。不过,我想我可以帮助您继续前进。

我认为 John Coleman 对 DirFile System Object 的评论是正确的,但没有得到充分解释。 Dir 是旧技术。我怀疑对于大多数编程语言,它会被“贬低”并计划从规范中删除。 MS 不会为 Excel VBA 做这种事情。它引入了具有更多功能的更新的File System Object。我将 FSO 归类为更难学习正确使用,但一旦完全理解,就会更方便。 FSO 会做Dir 会做的所有事情,但反之则不然。 John 建议,如果您要使用某些 FSO 功能,则不要同时使用它所替代的“过时”语句和方法。但是,不必删除Dir。我被教导:“让你的代码工作,然后让它变得更好更快、更优雅等等。”我认为你有比使用两种技术更重要的问题。

请缩进您的代码。在每个Sub … End SubIf … End IfFor … Next 等中,跨入几个空格。这使您的代码更易于阅读,并且更容易发现嵌套错误。

您的代码将不会执行。在Sub Master … End Sub 中,您有两个函数:GetValueFromDelimStringFindN。您不能以这种方式嵌套。将这些函数移到End Sub 下方,用于Sub Master

您的函数似乎旨在帮助解析 CSV 文件的行。它们看起来不够强大,无法实现这一目标。你将如何使用这些函数来解析这一行?

"Field1", "Field2A, Field2B", "Field3", "Field4A""FieldB"

请将变量类型Integer 替换为LongInteger 指定一个 16 位整数,需要在 32 位和 64 位计算机上进行特殊(即缓慢)处理。

请将以下内容移出循环,使其只执行一次:

Dim FSO As Object
Dim FromPath As String
Dim ToPath As String
Dim FileExt As String
Dim FNames As String

FromPath = "C:\Users\danielt\Desktop\CSV Files"
ToPath = "C:\Users\danielt\Desktop\CSV Files\Harvested"
FileExt = "*.csv*"

以上修复了一些错误。请尝试我建议的更正。这些更正是否解决了您的问题?如果没有,我会提出进一步的建议。

【讨论】:

以上是关于将 CSV 文件的内容复制到现有工作簿,然后移动 CSV的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件夹中的多个源工作簿中的数据复制到另一个工作簿,然后另存为新工作簿

尝试将桌面上的工作簿的工作表 2 保存为 CSV

如何创建csv文件

如何在同一个Excel工作簿中将两个不同的CSV文件转换为两个工作表?

将多个工作簿中的数据复制并自动化到现有的主工作簿中,而不会丢失使用 python 的格式

VBA 如何批量将单元格复制到另一个工作表中