vba 特定文件夹中的特定文件类型
specific file types in specific folders with vba
我有几个文件夹,我希望这段代码在开始和结束之间进行编辑。当 Folder2 将 Folder1 替换为 SubFolder 时,在不同文件夹中循环搜索的代码部分看不到任何 *.csv,但是如果 SubFolder 在开始时的初始条件被我手动从 "Folder1" 更改为"Folder2" 它现在将检测该文件夹中的 *.csv 文件。它还检测 "Folder1" 和 "Folder3" 中的 *.csv,当它们是子文件夹的初始条件时。我确实按照其他问题中的建议进行了检查,但在此代码中找不到任何缺失的“\”
Global Myfile, MyFolder, NewFile, SubFolder As String
Sub SpecificFileTypeInSpecificFolders()
'
SubFolder = "Folder1"
MyFolder = "C:\xxxxxx\" & SubFolder
Myfile = Dir(MyFolder & "\*.csv")
MsgBox SubFolder
MsgBox Myfile
Do While Myfile <> ""
MsgBox SubFolder
MsgBox Myfile
Myfile = Dir
If Myfile = "" Then
If SubFolder = "Folder2" Then 'several more folders like this
SubFolder = "Folder3"
End If
If SubFolder = "Folder1" Then
SubFolder = "Folder2"
End If
End If
MsgBox SubFolder
MsgBox Myfile
Loop
End Sub
在代码行 MyFolder = "C:\xxxxxx\" & SubFolder
之后更改 SubFolder
变量的值对 MyFolder
变量没有影响。当您使用 &
运算符连接字符串变量时,您正在获取 SubFolder
变量的值并将其附加到 C:\xxxxxx\
文本并将结果放入 [=15= 的值中]变量。
如果要搜索已知的文件夹列表,请创建一个文件夹数组,然后遍历该数组。
避免使用 Globals
- 最佳做法是声明具有所需最小范围的变量。在 VBA 中,当您在同一行声明多个变量时,您必须指定每个变量的类型,否则它们将被定义为 Variant
。所以在你的代码行中只有 SubFolder
被定义为一个字符串:
Global Myfile, MyFolder, NewFile, SubFolder As String
改为使用:
Dim Myfile As String, MyFolder As String, NewFile As String, SubFolder As String
就个人而言,我更喜欢将每个变量声明放在单独的行中。
这段代码应该运行没问题:
Sub SpecificFileTypeInSpecificFolders()
'
Dim myFile As String
Dim subFolder As Variant ' Must be variant to enable looping through the array
Dim folderNames As Variant
Dim mainFolder As String
folderNames = Array("Folder1", "Folder2", "Folder3")
mainFolder = "C:\xxxxxx\"
For Each subFolder In folderNames
MsgBox subFolder
myFile = Dir(mainFolder & subFolder & "\*.csv")
Do While myFile <> ""
MsgBox myFile
myFile = Dir
Loop
Next subFolder
End Sub
我有几个文件夹,我希望这段代码在开始和结束之间进行编辑。当 Folder2 将 Folder1 替换为 SubFolder 时,在不同文件夹中循环搜索的代码部分看不到任何 *.csv,但是如果 SubFolder 在开始时的初始条件被我手动从 "Folder1" 更改为"Folder2" 它现在将检测该文件夹中的 *.csv 文件。它还检测 "Folder1" 和 "Folder3" 中的 *.csv,当它们是子文件夹的初始条件时。我确实按照其他问题中的建议进行了检查,但在此代码中找不到任何缺失的“\”
Global Myfile, MyFolder, NewFile, SubFolder As String
Sub SpecificFileTypeInSpecificFolders()
'
SubFolder = "Folder1"
MyFolder = "C:\xxxxxx\" & SubFolder
Myfile = Dir(MyFolder & "\*.csv")
MsgBox SubFolder
MsgBox Myfile
Do While Myfile <> ""
MsgBox SubFolder
MsgBox Myfile
Myfile = Dir
If Myfile = "" Then
If SubFolder = "Folder2" Then 'several more folders like this
SubFolder = "Folder3"
End If
If SubFolder = "Folder1" Then
SubFolder = "Folder2"
End If
End If
MsgBox SubFolder
MsgBox Myfile
Loop
End Sub
在代码行 MyFolder = "C:\xxxxxx\" & SubFolder
之后更改 SubFolder
变量的值对 MyFolder
变量没有影响。当您使用 &
运算符连接字符串变量时,您正在获取 SubFolder
变量的值并将其附加到 C:\xxxxxx\
文本并将结果放入 [=15= 的值中]变量。
如果要搜索已知的文件夹列表,请创建一个文件夹数组,然后遍历该数组。
避免使用 Globals
- 最佳做法是声明具有所需最小范围的变量。在 VBA 中,当您在同一行声明多个变量时,您必须指定每个变量的类型,否则它们将被定义为 Variant
。所以在你的代码行中只有 SubFolder
被定义为一个字符串:
Global Myfile, MyFolder, NewFile, SubFolder As String
改为使用:
Dim Myfile As String, MyFolder As String, NewFile As String, SubFolder As String
就个人而言,我更喜欢将每个变量声明放在单独的行中。
这段代码应该运行没问题:
Sub SpecificFileTypeInSpecificFolders()
'
Dim myFile As String
Dim subFolder As Variant ' Must be variant to enable looping through the array
Dim folderNames As Variant
Dim mainFolder As String
folderNames = Array("Folder1", "Folder2", "Folder3")
mainFolder = "C:\xxxxxx\"
For Each subFolder In folderNames
MsgBox subFolder
myFile = Dir(mainFolder & subFolder & "\*.csv")
Do While myFile <> ""
MsgBox myFile
myFile = Dir
Loop
Next subFolder
End Sub