excel - VBA遍历目录中的文件,在另一个目录中另存为csv,如果文件存在则跳过
问题描述
我有一些代码循环遍历文件夹中的一堆文件,在每个文件上运行一个宏,然后将它们保存为不同文件夹中的 .csv 文件。如果目标 csv 文件夹为空,则该过程运行良好。如果 .csv 文件已经存在,我想要做的是跳过该过程。下面代码的问题是 Filename = Dir() 返回一个空值,如果 .csv 文件存在,则循环结束。那么如何继续遍历第一个文件夹中的其他文件呢?
Sub ProcessFiles()
Dim Filename, Pathname, strFileExists As String
Dim wb As Workbook
Application.ScreenUpdating = False
Pathname = ActiveWorkbook.Path & "\Files\"
Filename = Dir(Pathname & "*.xlsx")
Do While Filename <> ""
Set wb = Workbooks.Open(Pathname & Filename)
length = Len(ActiveWorkbook.Name)
Name = Left(ActiveWorkbook.Name, length - 5)
CSVName = ActiveWorkbook.Path & "\CSV Files\" & Name & ".csv"
strFileExists = Dir(CSVName)
If strFileExists = "" Then
Transform wb 'Run Transform function
wb.SaveAs Filename:=CSVName, FileFormat:=xlCSVMSDOS, CreateBackup:=False
wb.Close SaveChanges:=False
Filename = Dir()
Else
wb.Close SaveChanges:=False
Filename = Dir()
End If
Loop
End Sub
解决方案
我认为 braX 是对的:问题是您使用 Dir 两次。这似乎对我有用:
Sub ProcessFiles()
Dim Filename, Pathname, strFileExists As String
Dim wb As Workbook
Dim IntFileNumber As Integer
Dim IntCounter01 As Integer
Dim Length As Byte
Dim Name As String
Dim CSVName As String
Application.ScreenUpdating = False
Pathname = ActiveWorkbook.Path & "\Files\"
Filename = Dir(Pathname & "*.xlsx")
Do While Filename <> ""
Set wb = Workbooks.Open(Pathname & Filename)
Length = Len(ActiveWorkbook.Name)
Name = Left(ActiveWorkbook.Name, Length - 5)
CSVName = ActiveWorkbook.Path & "\CSV Files\" & Name & ".csv"
strFileExists = Dir(CSVName)
If strFileExists = "" Then
Transform wb 'Run Transform function
wb.SaveAs Filename:=CSVName, FileFormat:=xlCSVMSDOS, CreateBackup:=False
wb.Close SaveChanges:=False
Filename = Dir(Pathname & "*.xlsx")
IntFileNumber = IntFileNumber + 1
For IntCounter01 = 1 To IntFileNumber
Filename = Dir()
Next
Else
wb.Close SaveChanges:=False
Filename = Dir(Pathname & "*.xlsx")
IntFileNumber = IntFileNumber + 1
For IntCounter01 = 1 To IntFileNumber
Filename = Dir()
Next
End If
Loop
End Sub
基本上我重置文件名并根据需要多次重新播放目录以到达想要的文件。
我也添加了一些声明。您可能还希望在子例程结束时将 ScreenUpdating 设为 true,但这取决于您。
推荐阅读
- json - 使用 azure logic app 编辑 json 内容
- javascript - 如果 Postman 中的测试失败(CollectionVariable?),则触发新请求
- vue.js - v-for 中的 V-model 正在填充所有输入
- javascript - 如何通过JS调用在Django模板标签中使用js变量来更新html内容?
- python-3.x - 多类分类机器学习
- macos - 无法在 Mac 上执行 FastX Toolkit
- request - 测试已完成的链链接 oracle 请求以太/安全帽的最佳实践是什么?
- javascript - Android WebViewCLient:如果连接未处于“已连接”状态,则无法发送数据
- matplotlib - 无法使用 matplotlib 生成绘图
- node.js - 扩展错误类的附加属性