מיזוג דואר מטבלת אקסס
-
צהריים טובים.
יש לי טבלה עם נתונים וכן קובץ וורד של מכתב עם מיזוג דואר שמקור הנתונים שלו זו הטבלה הנ"ל.
אני רוצה לעשות קוד VBA שפשוט ידפיס את הקובץ עם הנתונים העדכניים מהטבלה (יש בה רק שדה אחד כל פעם).
הבעיה היא ששמתי לב שכאשר קובץ האקסס פתוח אי אפשר לעשות מקור נתונים אליו.
כרגע מה שעשיתי זה שהקוד קודם מייצא את הטבלה לאקסל, ואז מגדיר את המקור נתונים של הוורד לאקסל.
הבעיה בזה היא, א' זה ארוך ולוקח קצת זמן, וב' אני לא מצליח לכתוב לו למחוק את הקובץ אקסל לאחר הפעולה, כנראה כי זה נשאר לו פתוח בזכרון.
יש למישהו פתרון יותר טוב?
תודה.זה הקוד הנוכחי:
Public Function Export() MixToWord "מכתב", "C:\Users\1\Downloads\מכתב.docx", True End Function Public Function MixToWord(StrTbl As String, strFile As String, Printer As Boolean) On Error Resume Next Dim OW As Object Dim StrPath As String If IsNothing(Dir(strFile)) Then MsgBox "!הקובץ אינו קיים" & vbCrLf & ":מיקום קובץ" & vbCrLf & strFile, vbMsgBoxRight + vbInformation, "מיקום קובץ שגוי": Exit Function Err.Clear StrPath = Environ("TEMP") & "\מכתב.xlsx" DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, StrTbl, StrPath, True Set OW = CreateObject("Word.Application") ' New Word.Application If Err <> 0 Then MsgBox "הייתה בעיה באיתחול וורד!" & vbCrLf & "אנא פנה לתמיכה (" & Err.Number & ")": Exit Function OW.Documents.Open strFile OW.ActiveDocument.MailMerge.MainDocumentType = 0 OW.ActiveDocument.MailMerge.OpenDataSource Name:=StrPath, SQLStatement:="SELECT * FROM `מכתב`" OW.ActiveDocument.MailMerge.ViewMailMergeFieldCodes = 9999998 OW.ActiveDocument.MailMerge.ShowWizard InitialState:=6, ShowDataStep:=False, ShowTemplateStep:=False If Printer = True Then ' APrint = PrintrDef ' OW.ActivePrinter = APrint With OW.ActiveDocument.MailMerge .Destination = 1 ' wdSendToPrinter .SuppressBlankLines = True With .DataSource .FirstRecord = 1 ' wdDefaultFirstRecord .LastRecord = -16 ' wdDefaultLastRecord End With .Execute Pause:=False End With OW.Quit False Else OW.Visible = True OW.AppActivate OW.Caption OW.Activate End If End Function
-
@ארי אמר במיזוג דואר מטבלת אקסס:
יש למישהו פתרון יותר טוב?
את האשכול הזה ראית?
https://tchumim.com/topic/12095/הדפסת-ד-וח-מאקסס-על-בסיס-קובץ-וורד?page=1 -
@OdedDvir ניסיתי קוד כזה:
Public Function Export() MixToWord "מכתב", "C:\Users\1\מכתב.doc", True End Function Public Function MixToWord(StrTbl As String, strFile As String, Printer As Boolean) On Error Resume Next Dim OW As Object Dim StrPath As String StrPath = CurrentProject.Path & "\" & CurrentProject.Name Set OW = CreateObject("Word.Application") If Err <> 0 Then MsgBox "הייתה בעיה באיתחול וורד!" & vbCrLf & "אנא פנה לתמיכה (" & Err.Number & ")": Exit Function OW.Documents.Open strFile With OW.ActiveDocument.MailMerge .MainDocumentType = 0 .OpenDataSource Name:=StrPath, SQLStatement:="SELECT * FROM מכתב" .ViewMailMergeFieldCodes = 9999998 .ShowWizard InitialState:=6, ShowDataStep:=False, ShowTemplateStep:=False End With If Printer = True Then With OW.ActiveDocument.MailMerge .Destination = 1 .SuppressBlankLines = True With .DataSource .FirstRecord = 1 .LastRecord = -16 End With .Execute Pause:=False End With OW.Quit False Else OW.Visible = True OW.AppActivate OW.Caption OW.Activate End If End Function
קבלתי את השגיאה הבאה:
-
@ארי אני שמח שהנקודה הזו הובהרה. אין בעיה עקרונית למזג מבסיס נתונים פתוח. (למעשה, יכולת מיזוג הדואר היתה מאוד עלובה אם היתה מגבלה כזו...)
השאלה המתבקשת כעת היא: האם יש בכלל צורך לקשר שוב בקוד את הוורד לאקסס? אם הוא מקושר כבר לאקסס ואתה מנסה לקשר שוב לאותו הקובץ, זה אכן יכול לגרום את השגיאה.עצתי לך:
- אם אתה לא צריך לקשר את הוורד באופן דינמי לאקסס, פשוט תדלג על כל השורות של הקישור:
With OW.ActiveDocument.MailMerge .MainDocumentType = 0 .OpenDataSource Name:=StrPath, SQLStatement:="SELECT * FROM מכתב" .ViewMailMergeFieldCodes = 9999998 .ShowWizard InitialState:=6, ShowDataStep:=False, ShowTemplateStep:=False End With
- אם יש צורך לקשר את הוורד באופן דינמי, הכי פשוט הוא לפתוח את הוורד בלי לקשר לבסיס הנתונים, ולשמור אותו כך (רק עם הסימניות של השדות). לאחר מכן הקוד יוכל לעבוד כצפוי.
-
@OdedDvir אמר במיזוג דואר מטבלת אקסס:
אם יש צורך לקשר את הוורד באופן דינמי, הכי פשוט הוא לפתוח את הוורד בלי לקשר לבסיס הנתונים, ולשמור אותו כך (רק עם הסימניות של השדות). לאחר מכן הקוד יוכל לעבוד כצפוי.
מיזוג דואר תמיד זה דינאמי. לא?
איך אני מכניס רק סימניות בלי לקשר לקובץ אקסס, כשאני לא בוחר קובץ למיזוג השורת כותרת נראית כך:
אין אפשרות להכניס שדות למיזוג.
תודה רבה!עריכה: אני מצרף כאן את קבצי האקסס והוורד, תודה.
מינהל_האוכלוסין.doc
למיזוג - עותק.accdb -
@ארי אמר במיזוג דואר מטבלת אקסס:
מיזוג דואר תמיד זה דינאמי. לא?
כוונתי הייתה אם מיקום מקור הנתונים אינו קבוע, ויש צורך לקבוע אותו באופן דינמי בזמן ריצה. אם זה לא המקרה, אפשר ליצור קובץ עם שדות ולבטל את הקישור לאחר מכן.
אין אפשרות להכניס שדות למיזוג.
נכון. בהתחלה אתה באמת צריך לקשר למקור הנתונים, למקם את השדות ולשמור. אחר כך פתח את הקובץ שוב, ובדיאלוג ששואל האם ברצונך לקשר למקור הנתונים, בחר לא. ושמור את הקובץ.