Prostym rozwiązaniem tej niedogodności jest to oto makro
Sub Generuj_i_Zapisz() Dim w As MailMerge Dim a As Long Dim sFileName As String On Error GoTo ERR_Handler Application.ScreenUpdating = False Application.Visible = False Set w = ActiveDocument.MailMerge w.DataSource.ActiveRecord = wdFirstDataSourceRecord For a = 0 To w.DataSource.RecordCount With w .Destination = wdSendToNewDocument .SuppressBlankLines = True With .DataSource .FirstRecord = a .LastRecord = a End With .Execute Pause:=False End With ' składamy nazwę pliku z jakiś elementów np. z kolumn źródła danych sFileName = "C:\Users\Przemek\Documents\w\" & w.DataSource.DataFields("c").Value & ".docx" ActiveDocument.Parent.ScreenUpdating = False ActiveDocument.SaveAs _ FileName:=sFileName, _ FileFormat:=wdFormatXMLDocument, _ LockComments:=False, _ Password:="", _ AddToRecentFiles:=True, _ WritePassword:="", _ ReadOnlyRecommended:=False, _ EmbedTrueTypeFonts:=False, _ SaveNativePictureFormat:=False, _ SaveFormsData:=False, _ SaveAsAOCELetter:=False ActiveWindow.Close w.DataSource.ActiveRecord = wdNextRecord Next END_Handler: Application.Visible = True Application.ScreenUpdating = True Exit Sub ERR_Handler: MsgBox Err.Description Resume END_Handler: End Sub
Komentarza w zasadzie wymagać może tylko linia
sFileName = w.DataSource.DataFields("c").Value & ".docx"gdzie DataFields("c") to nazwa kolumny ze źródła danych - w przypadku danych użytkownika trzeba to zmienić lub użyć własnego kodu VBA. Ewentualnie zamiast nazwy możemy podać numer obiektu w kolekcji.
Bardzo mi się przydało - jeśli by ktoś jeszcze dołożył pomysł jak to od razu zapisać do pdf to już byłaby pełnia szczęścia.
OdpowiedzUsuńhe he mamy 2019:)
Usuńzamiast
sFileName = w.DataSource.DataFields("c").Value & ".docx
wpisz:
sFileName = "C:\Users\Przemek\Documents\w\" & w.DataSource.DataFields("c").Value & ".pdf"
ActiveDocument.SaveAs FileName:="C:\Users\Przemek\Documents\w\" & w.DataSource.DataFields("c").Value & ".docx"
w efekcie otrzymasz 2 pliki i pdf i docx
Gdy próbuję uruchomić makro wyświetla się komunikat "żądany element kolekcji nie istnieje" OK i otwiera się plik ze wszystkimi dokumentami - Katalog. Korzystam z Office 2007 na Win XP. Mam utworzony dokument korespondencji seryjnej z bazą w postaci lokalnej tabeli excela. Proszę o pomoc
OdpowiedzUsuńJestem absolutnie zielona jeśli chodzi o makra, a bardzo zależy mi na dwóch rzeczach. Mam przygotowany dokument korespondencji seryjnej, ma on 1200 stron..Chciałabym zapisać każdy z plików (w sumie 300 plików, po 4 strony każdy) w taki sposób, aby każdy z zapisanych przeze mnie plików miał taką samą nazwę (List od XXX_NAZWA ORGANIZACJI). Nazwa organizacji znajduje się w mojej korespondecji seryjnej.
OdpowiedzUsuńCzy jest to możliwe?
Mam taki sam problem jak Leo. Proszę o pomoc
OdpowiedzUsuńCo prawda minęło trochę czasu od zapytania, ale może innym się przyda. Jeśli jest błąd "żądany element kolekcji nie istnieje" to znaczy, że coś jest źle w linijce:
OdpowiedzUsuńsFileName = w.DataSource.DataFields("c").Value & ".docx"
Trzeba zmienić to "c". Należy tam wstawić w cudzysłowie nazwę kolumny z excela, który jest źródłem danych. Nie numer kolumny (a, b, c...) tylko jej nazwę np. "adres", "towar" itp.
W pętli For chyba powinno być a = 1
OdpowiedzUsuńFor a = 1 To w.DataSource.RecordCount
Faktycznie "For a=1" ponieważ jak było 0 to nazwa pliku rozmijała sie z prawdą o jeden rekord.:-)
UsuńGeneralnie działa rewelacyjnie - dzięki!
Dziękuję!
OdpowiedzUsuńSkrypt działa super :)
OdpowiedzUsuńmam tylko pytanie, czy jest możliwość sortowania plików w folderach,
Dajmy na to, mam kolumnę nazwisko, czyli tworzy ścieżkę sFileName = "D:\NAZWISKO\& w.DataSource.DataFields("Nazwisko").Value & ". doc" ?
witam
OdpowiedzUsuńa czy można do tego dołożyć okno dialogowe w którym określa się zakres pozycji od której do której ma wygenerować te pliki aby za każdym razem nie tworzył kilku set plików tylko te które są potrzebne