Как изменить каталог при выполнении цикла в VBA?

Я хотел бы подняться на один уровень вверх, чтобы обработать следующий цикл. Я думал, что могу использовать ChDir, но вижу, что когда я вызываю файлы, я оказываюсь в неправильном каталоге. Любая помощь будет оценена по достоинству.

Я хотел бы обобщить путь, потому что каталог всегда меняется и отличается для других пользователей.

Тем не менее, вот ссылка на то, как я хотел бы, чтобы код работал. Файлы, которые я обрабатываю, будут в Data1, а этот модуль VBA будет в обработке, см. ниже. Поэтому мне нужно было бы перейти на один каталог вверх, в Data1, чтобы извлечь файлы, преобразовать их, а затем сохранить преобразованные файлы в том же каталоге, Data1.

C:\Пользователи\Документы\CDRL\Data1\Обработка

Sub loopFiles()

Dim fso As New FileSystemObject
Dim fil As File
Dim fold As Folder
Dim yourfolder As String

Set fold = fso.GetFolder(Application.ActivePresentation.Path)

ChDir ".."

For Each fil In fold.Files

    If InStr(1, fil.Name, ".potx") > 0 Then
        Application.Presentations.Open fil.Path
        ActivePresentation.SaveAs Replace(fil.Path, ".potx", ".pptx"), ppSaveAsDefault
        ActivePresentation.Close

        fil.Delete True
    End If

Next fil

End Sub

person t.breeze    schedule 13.06.2017    source источник
comment
вполне очевидно, что если изменение каталога должно происходить внутри цикла, оно должно быть в нем....   -  person Doug Coats    schedule 14.06.2017
comment
Продолжение stackoverflow.com/questions/44528624/   -  person Dan Donoghue    schedule 15.06.2017


Ответы (1)


Вам действительно не нужно использовать chdir, вы можете просто поместить каталог в сохранения:

Sub loopFiles()

Dim fso As New FileSystemObject, fil As File, fold As Folder, yourfolder As String, UpOneDir As String

Set fold = fso.GetFolder(Application.ActivePresentation.Path)

For Each fil In fold.Files

    If InStr(1, fil.name, ".potx") > 0 Then
        Application.Presentations.Open fil.Path
        UpOneDir = Left(fil.Path, Len(fil.Path) - Len(fil.name) - 1 - Len(Split(Left(fil.Path, Len(fil.Path) - Len(fil.name) - 1), "\")(UBound(Split(Left(fil.Path, Len(fil.Path) - Len(fil.name) - 1), "\")))))
        ActivePresentation.SaveAs UpOneDir & Replace(fil.name, ".potx", ".pptx"), ppSaveAsDefault
        ActivePresentation.Close

        fil.Delete True
    End If

Next fil

End Sub

Я создал переменную UpOneDir, которая берет fil.path и удаляет из него fil.name. Затем я разделяю результат с помощью «\» и вычисляю длину значения верхней границы массива, затем я беру левую часть строки за вычетом той длины, которую мы только что вычислили.

Это выглядит очень грязно, но это работает. Может быть более простой способ сделать это с помощью объекта файловой системы, я просто не использую его достаточно, чтобы знать сразу.

Вы могли бы сделать его красивым, если бы действительно хотели, разбивая части создания UpOneDir на маленькие части, но я чувствую, что это будет одноразовая вещь для вас, чтобы просто преобразовать некоторые файлы в текущий формат PowerPoint.

person Dan Donoghue    schedule 13.06.2017
comment
Мне нужно сначала открыть один каталог вверх, а затем я хочу сохранить его в том же каталоге. - person t.breeze; 14.06.2017
comment
Это не имеет смысла, вы опрашиваете файлы в каталоге, но хотите подняться в каталоге, прежде чем открывать их? по самой своей природе файлы не будут находиться в этом каталоге, если вы не продублировали каждый отдельный файл в родительскую папку (который теоретически мой код все равно будет работать, поскольку он будет работать с оригиналом, а не с дубликатом). Нужно больше деталей, прежде чем я смогу помочь дальше. - person Dan Donoghue; 15.06.2017
comment
хм, есть недоразумение. У меня есть папка (Processing) на рабочем столе с несколькими файлами обработки внутри, matlab, vba и т. д. Я копирую эту папку в другую папку (Data1), полную сотен файлов, которая всегда отличается папка для каждого набора данных. Затем я открываю свои файлы обработки, которые находятся на один уровень ниже, обрабатываю данные, затем удаляю папку «Обработка» из папки «Данные1». Это сделано для того, чтобы я мог взять с собой папку для обработки в любом месте, чтобы просмотреть эти наборы данных. Также позволяет легко поделиться с другими. - person t.breeze; 15.06.2017
comment
Я думаю, вам нужно отредактировать вопрос и поместить туда макет файловой структуры. Тогда мы сможем лучше понять, что вам нужно. - person Dan Donoghue; 15.06.2017
comment
Хорошо, я отредактировал описание. Как я уже упоминал, я хотел бы сохранить общий путь, поскольку он будет меняться для каждого пользователя. - person t.breeze; 15.06.2017