У меня есть код, который должен открывать все файлы с именем «effect00 *» в пути к файлу, однако он всегда открывает только первый найденный файл, но я хочу, чтобы он открывал их все, кто-нибудь знает, почему мой код этого не делает?

Мой код:

Sub LoopSubfoldersAndFiles()
Dim fso As Object
Dim Folder As Object
Dim subfolders As Object
Dim MyFile As String
Dim wb As Workbook
Dim CurrFile As Object

With Application
    .ScreenUpdating = False
    .EnableEvents = False
    .Calculation = xlCalculationManual
End With

Set fso = CreateObject("Scripting.FileSystemObject")
Set Folder = fso.GetFolder("\\My Documents\Output files\analysis-tool-development")
Set subfolders = Folder.subfolders
MyFile = "effect00*.dat"

For Each subfolders In subfolders

Set CurrFile = subfolders.Files

    For Each CurrFile In CurrFile
        If CurrFile.Name Like MyFile Then
            Set wb = Workbooks.Open(subfolders.Path & "\" & MyFile)
        End If
    Next

Next

Set fso = Nothing
Set Folder = Nothing
Set subfolders = Nothing

With Application
    .EnableEvents = True
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
End With

Конец Югу

0
user9103716 3 Янв 2018 в 12:08

2 ответа

Лучший ответ

Здесь происходит много лишнего - Set, это упрощает чтение, но в большинстве случаев в этом нет необходимости. Например, поскольку вы не используете объект Folder, кроме как для получения подпапок, вместо:

Set Folder = fso.GetFolder("\\My Documents\Output files\analysis-tool-development")
Set subfolders = Folder.subfolders

Вы могли просто:

Set subfolders = fso.GetFolder("\\My Documents\Output files\analysis-tool-development").subfolders

Но если вы хотите, чтобы его было легко читать и т. Д., Я просмотрел код и перемаркировал ваши объекты и т. Д., Чтобы: а) различать формулировки, специфичные для vba, и б) идентифицировать родительский / дочерний, как право собственности:

Sub LoopSubfoldersAndFiles()
    Dim fso As Object
    Dim myTopFolder As Object
    Dim mySubFolders As Object
    Dim mySingleFolder As Object
    Dim myFileCollection As Object
    Dim mySingleFile As Object
    Dim myFilePattern As String
    Dim wb As Workbook

    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set myTopFolder = fso.GetFolder("\\My Documents\Output files\analysis-tool-development")
    Set mySubFolders = myTopFolder.subfolders
    myFilePattern = "effect00*.dat"

    For Each mySingleFolder In mySubFolders

    Set myFileCollection = mySingleFolder.Files

        For Each mySingleFile In myFileCollection
            If mySingleFile.Name Like myFilePattern Then
                Set wb = Workbooks.Open(mySingleFolder.Path & "\" & mySingleFile.Name)
            End If
        Next

    Next

    Set fso = Nothing
    Set myTopFolder = Nothing
    Set mySubFolders = Nothing
    Set mySubFolders = Nothing
    Set mySingleFolder = Nothing
    Set myFileCollection = Nothing
    Set mySingleFile = Nothing

    With Application
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = True
    End With
End Sub

Наконец, я оставил их, но есть блок Set xxx = Nothing, который, по мнению многих, не является необходимым. Выглядит аккуратно / аккуратно, но я помню, что где-то читал, что End Sub все равно уберет их.

0
CLR 3 Янв 2018 в 11:06

Смотрите ваше заявление:

:
For Each subfolders In subfolders
:

Очевидно, что есть один и только один объект subfolders в subfolders.

Как предлагает Вариатус, попробуйте применить лучшую политику именования для ваших переменных.

0
FDavidov 3 Янв 2018 в 09:50