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