Сохранение файлов в назначенных папках

#vba #ms-word

#vba #ms-word

Вопрос:

Это код, полученный из советов и рекомендаций по слиянию почты.

 Sub Merge_To_Individual_Files()
Application.ScreenUpdating = False
Dim StrFolder As String, StrName As String, MainDoc As Document, i As Long, j As Long
Set MainDoc = ActiveDocument
With MainDoc
  StrFolder = .Path amp; Application.PathSeparator
  For i = 1 To .MailMerge.DataSource.RecordCount
    With .MailMerge
      .Destination = wdSendToNewDocument
      .SuppressBlankLines = True
      With .DataSource
        .FirstRecord = i
        .LastRecord = i
        .ActiveRecord = i
        If Trim(.DataFields("Name")) = "" Then Exit For
        StrName = .DataFields("Number") amp; "_" amp; .DataFields("Name") amp; "_Test"
      End With
      .Execute Pause:=False
    End With
    StrName = Trim(StrName)
    With ActiveDocument
      .SaveAs2 FileName:=StrFolder amp; StrName amp; ".pdf", FileFormat:=wdFormatPDF, AddToRecentFiles:=False
      .PrintOut Copies:=1
      .Close SaveChanges:=False
    End With
  Next i
End With
Application.ScreenUpdating = True
End Sub
 

Код разделяет серийный номер на отдельные файлы, сохраняет их в формате pdf и запускает печать.

Макрос сохраняет все файлы в одной папке, и я должен переместить каждый файл в указанную папку вручную (у каждого файла есть своя папка с «Номером» из кода в качестве имени).

Возможно ли сохранить файлы непосредственно в намеченной папке?

Комментарии:

1. Где StrPath -то установлено? Вы имели в виду StrFolder ?

Ответ №1:

Я бы сделал что-то вроде этого:

 Dim num, numGen as long, f, StrFolder As String
'...
'...
num = .DataFields("Number") 'capture the value in the With .DataSource block
'...
'...

'check if the destination folder exists
f = FindFolder(StrFolder, CStr(num)) 'returns folder path if exists

If Len(f) = 0 Then
    'no match was found - use a generic folder
    f =   StrFolder amp; "General" 'or whatever you want
    numGen = numGen   1
End If

.SaveAs2 FileName:= f amp; _
         Application.PathSeparator amp; StrName amp; ".pdf", _
         FileFormat:=wdFormatPDF, AddToRecentFiles:=False
'...
'...
'Notify that some files need to be moved
If numGen > 0 Then
    Msgbox numGen amp; " files were saved to 'General' folder"
End If
 

Эта функция вернет путь к любой соответствующей папке, в которой указана начальная папка для начала (включает поиск во вложенных папках). Возвращает пустую строку, если совпадений нет.

 Function FindFolder(StartAt As String, ByVal folderName As String) As String
    Dim colFolders As New Collection, sf, path, fld, fso
    Set fso = CreateObject("scripting.filesystemobject")
    colFolders.Add StartAt
    Do While colFolders.Count > 0
        fld = colFolders(1)
        colFolders.Remove 1
        If Right(fld, 1) <> "" Then fld = fld amp; ""
        For Each sf In fso.getfolder(fld).subfolders
            If sf.Name = folderName Then
                FindFolder = sf.path
                Exit Function
            Else
                colFolders.Add sf
            End If
        Next sf
    Loop
End Function
 

Комментарии:

1. Спасибо за вашу помощь. Я попробовал, и файлы были сохранены в правильной папке. К сожалению, я столкнулся с другой проблемой. Проблема заключается в следующем. Если назначенная папка файла еще не существует, макрос перестает работать. Можно ли установить общую папку и сохранить все файлы, у которых нет назначенной папки, в этой папке? Таким образом, makro сохраняет файл с существующей папкой в назначенной папке, а все остальные — в общей папке. Заранее спасибо и счастливого Рождества!

2. Было бы лучше, чтобы макрос создавал папку «number», если она еще не существует?

3. К сожалению, папки уже существуют, но без номера (только имя пользователя). Номер папки добавляется позже вручную, но иногда ответственный человек забывает это сделать. Таким образом, создание новых папок будет означать, что у некоторых людей есть 2 папки.

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

5. Я столкнулся с другой проблемой. Makro не находит назначенную папку, если это вложенная папка. Возможно ли выполнить поиск по всей папке (со всеми вложенными папками)?

Ответ №2:

Ваш код получен из статьи «Отправить вывод Mailmerge в отдельные файлы» в разделе «Советы и рекомендации Mailmerge» по адресу https://www.msofficeforums.com/mail-merge/21803-mailmerge-tips-tricks.html .

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