הדפסת ד''וח מאקסס על בסיס קובץ וורד
-
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
@בערל לא בדקתי את הקוד של @clickone ואני לא יכול לייעץ לך לגביו. אם נשאר לך רק שלב ג, כלומר אתה אוחז במצב שאם אתה פותח את הוורד אתה רואה את הנתונים הנכונים מהטבלה, אז נשאר לכתוב רק את הקוד של הלחצן. זה לא כל כך קשה לדעתי. אם החלטת שזה הכיוון אעזור לך בשמחה.
הכל מוכן (חוץ מבעיה קטנה שוורד מציג נתוני זמן ותאריך ללא הפורמט שהגדרתי להם באקסס כמו כאן ), אשמח מאוד.
תודה רבה!
-
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
אז נשאר לכתוב רק את הקוד של הלחצן
זה מה שעושה הקוד שלי
@בערל
בגדול הקובץ שהעלתי אז היה קובץ זיפ עם קובץ וורד בפנים בשביל הדומא
אני לא מוצא אותו כעת, אולי ל @מלא יש אותו והוא יכול להעלות....
בכל מקרה, מה שאתה צריך, זה לשים את הטבלה והטופס שלך, לא משנה איך קוראים לטבלה ולטופס,
ולשים מאחורי הכפתור את הקוד הבא: (הוא מופיע במסך דוגמא, אבל זה באמת רק דוגמא)MixDocToWord "", "tbl", Me!tFile, Me!bPrint, ppdf, False
הסבר למשתנים שהפונקציה מקבלת (בדוגמא כאן זה בעצם פקדים בבטופס, אתה יכול במקום זה שזה יהיה ממשתנה, או איך שבא לך)
המשתנה הראשון, שבדוגמא כאן הוא ריק ("") זה המשפט סינון שלך לנתונים. נניח מזהה=123tbl= שם הטבלה או השאילתא שלך (כדי לפשט את הדוגמא קראתי לו ככה, אתה יכול להחליף אותו למה שבא לך)
tFile = שם הקובץ - בדוגמא אני שם את שם הקובץ באופן אוטומטי מהתיקייה, אתה יכול לתת גם נתיב מוחלט לבחירתך (או מהגדרות בטבלה)
bPrint = האם לשלוח למדפסת, בוליאני (כן ולא)
ppdf = האם לסגור לקובץ PDF, בוליאני (כן ולא)
הפרמטר האחרון שעשיתי בדוגמא אותו קבוע ב False זה האם לייצר קובץ חדש,
ואחריו יש עוד משתנה שלא חייבים לשים, וזה האם למיין ואיך.מקווה שזה יעזור
אם לא, @OdedDvir התותח כאן כדי להסביר איך לעשות את זה הכי טוב שיש
-
@בערל אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
נתוני זמן ותאריך ללא הפורמט שהגדרתי להם באקסס
בעיה ידועה וכואבת
יש 2 אפשרויות, או שתפצל את הנתונים בשאילתא, ואז תציג אחד אחרי השני (או בדרך אחרת תמיר את זה לסטרינג ולא מסוג תאריך
אפשרות שניה שבה אני משתמש בד"כ, זה לעשות עיצוב על התאריך ולהגדיר ידנית את הפורמט הנכון. צריך לעשות את זה רק פעם אחת, ואח"כ אתה שומר את זה והוא זוכר את ההגדרה.
(אני רואה עכשיו שבלינק שהבאת @OdedDvir התייחס לפיתרון הראשון אז, ו @מנחם לפיתרון השני....) -
@בערל הנה הקוד הבסיסי (הסתמכתי על המקור הזה)
Public Sub MergeWordDocument(inputFileName As String, outputFileName As String) 'Open the templete document Dim wdDoc As Object Set wdDoc = GetObject(inputFileName, "Word.Document") wdDoc.Application.Visible = False With wdDoc.MailMerge .MainDocumentType = 0 ' wdFormLetters .Destination = 0 ' wdSendToNewDocument .SuppressBlankLines = True .Execute Pause:=False End With ' Save the output document wdDoc.Application.Visible = True wdDoc.Application.ActiveDocument.SaveAs outputFileName ' Cleanup wdDoc.Close SaveChanges:=False Set wdDoc = Nothing End Sub
צור לחצן בטופס, ובאירוע לחיצה שלו תכתוב את הקוד הבא (תחליף כמובן את שמות הקבצים):
MergeWordDocument "D:\temp\myTemplete.docx", "d:\temp\output.docx"
-
תודה רבה על הפירוט
הורדתי ובדקתי את הזיפ, הלחצן של ההדפסה לא מגיב לי ולא הצלחתי לבדוק איך זה עובד.@clickone אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
בעיה ידועה וכואבת
יש 2 אפשרויות, או שתפצל את הנתונים בשאילתא, ואז תציג אחד אחרי השני (או בדרך אחרת תמיר את זה לסטרינג ולא מסוג תאריך
אפשרות שניה שבה אני משתמש בד"כ, זה לעשות עיצוב על התאריך ולהגדיר ידנית את הפורמט הנכון. צריך לעשות את זה רק פעם אחת, ואח"כ אתה שומר את זה והוא זוכר את ההגדרה.הסתדרתי ע"י הוספת עמודה בשאילתא והמרה לטקסט ע"י הפונקציה Format
-
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
תודה רבה!
זה עובד מעולה!האם יש אפשרות שישמור כPDF?
ובנוסף, זה שומר קובץ עם כל השורות של הנתונים ולא רק הנתון הנוכחי שמופיע בטופס, יש משהו לעשות בנידון? -
@בערל אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
האם יש אפשרות שישמור כPDF?
בבקשה:
Public Sub RunMailMerge(inputFileName As String, outputFileName As String, Optional saveAsPDF As Boolean = False) ' Open Template file Dim wdDoc As Object Set wdDoc = GetObject(inputFileName, "Word.Document") With wdDoc .Application.Visible = False With .MailMerge .MainDocumentType = 0 ' wdFormLetters .Destination = 0 ' wdSendToNewDocument .SuppressBlankLines = True .Execute Pause:=False End With ' Save output file .Application.Visible = True If saveAsPDF Then .Application.ActiveDocument.ExportAsFixedFormat _ outputFileName:=outputFileName, _ ExportFormat:=17, _ OpenAfterExport:=True, _ OptimizeFor:=wdExportOptimizeForPrint, _ Range:=0, _ IncludeDocProps:=True, _ CreateBookmarks:=2, _ BitmapMissingFonts:=True Else .Application.ActiveDocument.SaveAs outputFileName End If ' Cleanup .Close SaveChanges:=False End With Set wdDoc = Nothing End Sub
כדי לייצא ל-PDF תוסיף בקריאה לפונקציה פרמטר שלישי ותתן לו ערך
True
:MergeWordDocument "D:\temp\myTemplete.docx", "d:\temp\output.PDF", True
ובנוסף, זה שומר קובץ עם כל השורות של הנתונים ולא רק הנתון הנוכחי שמופיע בטופס, יש משהו לעשות בנידון?
בוודאי, (כמעט) תמיד יש מה לעשות...
לכן שאלתי מראש אם השאילתא שלך כבר מוכנה. אם היא אמורה להכיל רק רשומה אחת, אתה צריך לשנות אותה כך שתכיל רק את הרשומה הנוכחית, או לשנות את מקור הנתונים בוורד. -
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
@בערל אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
האם יש אפשרות שישמור כPDF?
בבקשה:
כדי לייצא ל-PDF תוסיף בקריאה לפונקציה פרמטר שלישי ותתן לו ערך
True
:MergeWordDocument "D:\temp\myTemplete.docx", "d:\temp\output.PDF", True
מדהים!
בוודאי, (כמעט) תמיד יש מה לעשות...
לכן שאלתי מראש אם השאילתא שלך כבר מוכנה. אם היא אמורה להכיל רק רשומה אחת, אתה צריך לשנות אותה כך שתכיל רק את הרשומה הנוכחית, או לשנות את מקור הנתונים בוורד.צודק, טעות שלי.
עד עכשיו היה לי טבלת בסיס אחת ושאילתא אחת שמוסיפה פרטים ע''י ביצוע חישובים.
היה לזה גם חסרון שלא היה לי את הנתונים בטבלה - רק בשאילתאכעת אני משנה לשאילתת עדכון שתכניס את החישובים לטבלה המקורית
ואז אעשה שאילתא חדשה שתביא לי רק את השורה האחרונה מהטבלה, (איך? ע''י בחירת ה-ID הגבוה ביותר? או יש דרך יותר מומלצת?). -
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
@בערל אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
ואז אעשה שאילתא חדשה שתביא לי רק את השורה האחרונה מהטבלה, (איך? ע''י בחירת ה-ID הגבוה ביותר?
זה כנראה הכי פשוט. שאילתת קיבוץ עם הפונקציה Max על השדה ID.
אם אתה רוצה לייצא לpdf בזמן שהטופס פתוח אצלך, תוכל לסנן לפי הID שבטופס = כך גם תוכל לייצא דפים ישנים אם תרצה לתקן בהם משהו או סתם להדפיס שוב.
-
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
@בערל אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
ואז אעשה שאילתא חדשה שתביא לי רק את השורה האחרונה מהטבלה, (איך? ע''י בחירת ה-ID הגבוה ביותר?
זה כנראה הכי פשוט. שאילתת קיבוץ עם הפונקציה Max על השדה ID.
עשיתי ככה:
מקווה שלזה הכוונהSELECT TOP 1 Table1.ID, Table1.FirstName, Table1.LastName, .....,....,..., FROM Table1 ORDER BY Table1.ID DESC;
\@avi-rz אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
אם אתה רוצה לייצא לpdf בזמן שהטופס פתוח אצלך, תוכל לסנן לפי הID שבטופס
כך גם תוכל לייצא דפים ישנים אם תרצה לתקן בהם משהו או סתם להדפיס שוב.אשמח לדעת איך
זה יעזור לי בכדי להדפיס קובץ ישן
הסיבה השניה לא רלוונטית בשבילי מכיוון שהגדרתי בשאילתת העדכון לא לדרוס נתונים קיימים, אז גם אם אני מתקן נתונים בטופס זה לא ישפיע על שאר השדות בטבלה (אני יכול לתקן אותם ישירות בטבלה אבל עדיף כבר ליצור שורה חדשה...)
בכל אופן, הסיבה הראשונה מספיקה... -
ברוך השם המערכת עובדת מעולה
מה שבעבר היה לוקח לי כעשר דקות עכשיו מתבצע תוך דקה!אפי' הוספתי ערך ברג'יסטרי שידלג על האזהרה של וורד בפתיחת המסמך על שימוש במיזוג נתונים.
תודה רבה @OdedDvir היה נחמד לחזור לאקסס אחרי תקופה שלא נגעתי...
תודה רבה לשאר החברים היקרים על ההתגייסות הנרחבת
אני רוצה לנסות לשפר קצת ולשפשף אז אל תבטלו את המעקב בבקשה...
-
@בערל
א. השאילתא שכתבת מצויינת, פשוט חייכתי מאוזן לאוזן!
ב. כדי להדפיס את העמודה הנוכחית, אתה יכול ליצור שאילתא באקסס שמסננת את הטבלה לפי הערך של השדה ID הנוכחי בטופס, כמו שציין @avi-rz, ולבחור אותה כמקור הנתונים בוורד. משהו כזה:SELECT * FROM Table1 WHERE Table1.ID = Forms!YourFormName!ID
זה היופי באקסס, שאפשר לשלב נתונים מהטופס ישירות בשאילתא.
ג. אהבתי את הפטנט ברג'יסטרי, לא חשבתי על זההיה נחמד לחזור לאקסס אחרי תקופה שלא נגעתי...
נחמד לראות שאתה משתמש בה לתועלת, וזו זריקת עידוד בשבילי להמשיך עם ההדרכה
-
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
א. השאילתא שכתבת מצויינת, פשוט חייכתי מאוזן לאוזן!
ב. כדי להדפיס את העמודה הנוכחית, אתה יכול ליצור שאילתא באקסס שמסננת את הטבלה לפי הערך של השדה ID הנוכחי בטופס, כמו שציין @avi-rz, ולבחור אותה כמקור הנתונים בוורד. משהו כזה:
SELECT * FROM Table1 WHERE Table1.ID = Forms!YourFormName!ID
זה היופי באקסס, שאפשר לשלב נתונים מהטופס ישירות בשאילתא.
פנטסטי!
בדקתי ועבד מעולה.
אבל אחר כך שמתי לב שזה עושה בעיות עם החיבור לוורד, לכאורה בגלל שמתי שהטופס סגור השאילתא לא מכילה כלוםאז יצרתי טבלה חדשה בשם MailMerge שתכיל תמיד את הנתון האחרון
והתיישבתי לחשוב איך להכין שאילתת עדכון מתאימה אבל הסתבכתי.
ולמרבה שמחתי גיליתי סוג שאילתא חדשה שלא הכרתי "Make Table", נראה שנוצרה בדיוק בשביל זה.אבל לא הצלחתי לגרום לקוד VBA להריץ אותו, אני מקבל את השגיאה הבאה:
Debug מצביע על שורה 9
בתחתית הטופס יש לחצן שמכיל את הקוד הבא:
DoCmd.RunCommand (acCmdSaveRecord) On Error Resume Next DoCmd.DeleteObject acTable, "MailMerge" On Error GoTo 0 CurrentDb.Execute "qryUpdate_Data", dbFailOnError CurrentDb.Execute "qryMake_MailMerge" DoCmd.GoToRecord , , acNext RunMailMerge "C:\Users\.....TEMPLATE.docx", "C:\Users......pdf", True
יש לציין שהשאילתא עובדת מצוין בהרצה ידנית, רק לא דרך הקוד.
תחביר השאילתא:SELECT qrySelect_currentID.Data.ID, qrySelect_currentID.Data.FirstName, qrySelect_currentID.Data.LastName, INTO MailMerge FROM qrySelect_currentID;
מה יכול להיות?
qrySelect_currentID = שאילתת קיבוץ שמביאה את נתוני הטופס שפתוח
Data = טבלת הנתונים המרכזיתג. אהבתי את הפטנט ברג'יסטרי, לא חשבתי על זה
אכן חוסך המון זמן וגם גורם לוורד להיסגר מיד, לפני זה הייתי צריך לאשר שמירת שינויים...
היה נחמד לחזור לאקסס אחרי תקופה שלא נגעתי...
נחמד לראות שאתה משתמש בה לתועלת, וזו זריקת עידוד בשבילי להמשיך עם ההדרכה
בעז"ה אשתדל יותר לשתף פעולה...
-
@בערל אני לא מבין את התחביר של השאילתא:
SELECT qrySelect_currentID.Data.ID, qrySelect_currentID.Data.FirstName, qrySelect_currentID.Data.LastName, INTO MailMerge FROM qrySelect_currentID;
- איך יתכן שתי נקודות בשם שדה
qrySelect_currentID.Data.ID
, האם אתה משתמש בשדה עם ערכים מרובים? - אחרי
LastName
יש פסיק מיותר
- איך יתכן שתי נקודות בשם שדה
-
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
@בערל אני לא מבין את התחביר של השאילתא:
SELECT qrySelect_currentID.Data.ID, qrySelect_currentID.Data.FirstName, qrySelect_currentID.Data.LastName, INTO MailMerge FROM qrySelect_currentID;
- איך יתכן שתי נקודות בשם שדה
qrySelect_currentID.Data.ID
, האם אתה משתמש בשדה עם ערכים מרובים? - אחרי
LastName
יש פסיק מיותר
האמת לא עשיתי את התחביר חבד אלא השתמשתי במעצב השאילתות ומשום מה ככה זה יצא (אולי בגלל שערכתי שאילתת קיבוץ קיימת והפכתי אותו ליצירת טבלה). הפסיק זה טעות שלי, (יש עוד שדות בהמשך שהשתמטתי בהעלאה לפורום...)
בכל אופן יצרתי אותו מחדש ועדיין אותו בעיה, ידנית זה עובד ומהקוד אני מקבל שגיאה כנ"ל.
SELECT qrySelect_currentID.ID, qrySelect_currentID.FirstName, qrySelect_currentID.LastName INTO MailMerge FROM qrySelect_currentID
ניסיתי גם לקחת ישירות מטבלת הנתונים:
SELECT Data.ID, Data.FirstName, Data.LastName INTO MailMerge FROM Data WHERE (((Data.ID)=[Forms]![frmData]![ID]));
- איך יתכן שתי נקודות בשם שדה
-
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
מה התחביר של qryUpdate_Data?
יש לי טופס שאני ממלא בו פרטים
וזה שאילתת עדכון שממלא חישובים לתוך שדות נוספים בטבלת הDATA
לדוגמה מחשב גיל לפי תאריך לידה, וממיר את תאריך הלידה לטקסט.UPDATE Data SET Data.DobT = Format([dob],"dd/mm/yy"), Data.Age = IIf([age] Is Null,DateDiff("yyyy",[Dob],Now())+Int(Format(Now(),"mmdd")<Format([Dob],"mmdd")),[age]);
אני צריך לפני ההדפסה שיעדכן את טבלת הנתונים במקום שאחשב אותם לבד במילוי הטופס.
גם כשאני מוחק את הכל מה-VBA ומשאיר רק את יצירת הטבלה הוא עושה בעיות.Private Sub cmdPrint_Click() CurrentDb.Execute "qryMake_MailMerge" End Sub
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
אגב: סליחה על הדיליי בתגובה
סליחה???
אני זה שצריך לבקש... -
@בערל אוקי. הניחוש שלי הוא שהטבלה MailMerge לא מספיקה להימחק לפני שאתה מנסה לבנות אותה מחדש. זה בגלל שיש השהייה בקריאה ל:
"DoCmd.DeleteObject acTable, "MailMerge
. ככה זה באקסס.תוסיף את שתי הפונקציות השימושיות הבאות למודל חדש:
Public Function TableExist(TableName As String) As Boolean TableExist = Not IsNull(DLookup("Name", "MSysObjects", "Name='" & TableName & "'")) End Function Public Sub TableDelete(TableName As String) If TableExist(TableName) Then CurrentDb.TableDefs.Delete (TableName) End Sub
ובקוד של הלחצן תמחק את הטבלה כך:
TableDelete "MailMerge" CurrentDb.Execute "qryMake_MailMerge"