- מאמר
- חל על:
- Microsoft Office
סיכום
בעת פיתוח יישום המשתמש בנתונים במסמך Office, כדאי להציג נתונים אלה ישירות בתוך יישום Visual Basic כדי שהמשתמש יוכל לראות ולערוך את הנתונים מבלי שתצטרך לעבור ליישום Office. באפשרותך לבצע זאת ב- Visual Basic באמצעות פקד הגורם המכיל של OLE.
מאמר זה מדגים כיצד ליצור מסמך Office באופן דינאמי להפוך אותו לאוטומטי באמצעות פקד הגורם המכיל של OLE.
מידע נוסף
היכולת להוסיף מסמך Office ל- Visual Basic אפשרית על-ידי טכנולוגיית קישור והטבעה של אובייקטים (OLE) של Microsoft. OLE נועד לאפשר ליישום אחד לארח אובייקט השייך ליישום אחר באופן שנוח למשתמש הקצה, אך אינו דורש מהיישומים המעורבים לדעת את הפרטים הפנימיים של האחר. Visual Basic מספק את פקד הגורם המכיל של OLE כדי לאפשר למתכנתים של Visual Basic להוסיף אובייקטי OLE לטופס.
לאחר הטבעת האובייקט, רוב שרתי OLE תומכים באוטומציה כדי לאפשר ליישום המארח לשנות את האובייקט או לטפל בו באמצעות תיכנות באמצעות קוד. כדי לקבל הפניה לאובייקט אוטומציה, השתמש במאפיין אובייקט של הגורם המכיל OLE. מאפיין זה מחזיר את אובייקט האוטומציה התואם באופן דומה לפריט המסוים המוטבע.
יצירת יישום Visual Basic המארח חוברת עבודה של Excel
הפעל את Visual Basic וצור פרוייקט סטנדרטי חדש. Form1 נוצר כברירת מחדל.
מתוך ארגז הכלים של הפקד, הוסף שלושה לחצני פקודות לטופס1. לאחר מכן הוסף מופע של הפקד OLE Container. כאשר הפקד OLE Container ממוקם בטופס, הוא מבקש ממך את סוג האובייקט שברצונך להוסיף. עבור דוגמה זו, עליך להוסיף את האובייקט באופן דינאמי, לכן לחץ על ביטול כדי לבטל את תיבת הדו-שיח מבלי להוסיף אובייקט.
בחלון קוד עבור Form1, הוסף את הקוד הבא:
Option ExplicitDim oBook As ObjectDim oSheet As ObjectPrivate Sub Command1_Click() On Error GoTo Err_Handler' Create a new Excel worksheet... OLE1.CreateEmbed vbNullString, "Excel.Sheet"' Now, pre-fill it with some data you ' can use. The OLE.Object property returns a ' workbook object, and you can use Sheets(1) ' to get the first sheet. Dim arrData(1 To 5, 1 To 5) As Variant Dim i As Long, j As LongSet oBook = OLE1.object Set oSheet = oBook.Sheets(1)' It is much more efficient to use an array to ' pass data to Excel than to push data over ' cell-by-cell, so you can use an array.' Add some column headers to the array... arrData(1, 2) = "April" arrData(1, 3) = "May" arrData(1, 4) = "June" arrData(1, 5) = "July"' Add some row headers... arrData(2, 1) = "John" arrData(3, 1) = "Sally" arrData(4, 1) = "Charles" arrData(5, 1) = "Toni"' Now add some data... For i = 2 To 5 For j = 2 To 5 arrData(i, j) = 350 + ((i + j) Mod 3) Next j Next i' Assign the data to Excel... oSheet.Range("A3:E7").Value = arrDataoSheet.Cells(1, 1).Value = "Test Data" oSheet.Range("B9:E9").FormulaR1C1 = "=SUM(R[-5]C:R[-2]C)"' Do some auto formatting... oSheet.Range("A1:E9").Select oBook.Application.Selection.AutoFormatCommand1.Enabled = False Command2.Enabled = False Command3.Enabled = True Exit SubErr_Handler: MsgBox "An error occurred: " & Err.Description, vbCriticalEnd SubPrivate Sub Command2_Click() On Error GoTo Err_Handler' Create an embedded object using the data ' stored in Test.xls.<?xm-insertion_mark_start author="v-thomr" time="20070327T040420-0600"?> If this code is run in Microsoft Office ' Excel 2007, <?xm-insertion_mark_end?><?xm-deletion_mark author="v-thomr" time="20070327T040345-0600" data=".."?><?xm-insertion_mark_start author="v-thomr" time="20070327T040422-0600"?>change the file name to Test.xlsx.<?xm-insertion_mark_end?> OLE1.CreateEmbed "C:\Test.xls"Command1.Enabled = False Command2.Enabled = False Command3.Enabled = True Exit SubErr_Handler: MsgBox "The file 'C:\Test.xls' does not exist" & _ " or cannot be opened.", vbCriticalEnd SubPrivate Sub Command3_Click() On Error Resume Next' Delete the existing test file (if any)... Kill "C:\Test.xls"' Save the file as a native XLS file... oBook.SaveAs "C:\Test.xls" Set oBook = Nothing Set oSheet = Nothing' Close the OLE object and remove it... OLE1.Close OLE1.DeleteCommand1.Enabled = True Command2.Enabled = True Command3.Enabled = FalseEnd SubPrivate Sub Form_Load() Command1.Caption = "Create" Command2.Caption = "Open" Command3.Caption = "Save" Command3.Enabled = FalseEnd Sub
הקש על מקש F5 כדי להפעיל את התוכנית. לחץ על לחצן צור. פעולה זו מטביעה גליון עבודה חדש ושולחת את Excel לאוטומטי כדי להוסיף נתונים ישירות לגיליון. שים לב שאם תלחץ פעמיים על האובייקט, הוא יופעל במקום והמשתמש יוכל לערוך את הנתונים ישירות. כעת לחץ על שמור כדי לשמור את הנתונים בקובץ ולסגור את אובייקט ה- OLE. לחצן פתח מאפשר לך לפתוח עותק של קובץ שנשמר בעבר.
יצירת יישום Visual Basic המארח מסמך Word
הפעל את Visual Basic וצור פרוייקט סטנדרטי חדש. Form1 נוצר כברירת מחדל.
מתוך ארגז הכלים של הפקד, הוסף שלושה לחצני פקודות לטופס1. לאחר מכן הוסף מופע של הפקד OLE Container. כאשר הפקד OLE Container ממוקם בטופס, הוא מבקש ממך את סוג האובייקט שברצונך להוסיף. עבור דוגמה זו, עלינו להוסיף את האובייקט באופן דינאמי, לכן לחץ על ביטול כדי לבטל את תיבת הדו-שיח מבלי להוסיף אובייקט.
בחלון קוד עבור Form1, הוסף את הקוד הבא:
Option ExplicitDim oDocument As ObjectPrivate Sub Command1_Click() On Error GoTo Err_Handler' Create a new Word Document... OLE1.CreateEmbed vbNullString, "Word.Document"' Add some text to the document. The OLE.Object ' property returns the document object... Set oDocument = OLE1.objectoDocument.Content.Select With oDocument.Application.Selection' Add a heading at the top of the document... .Style = oDocument.Styles("Heading 1") .Font.Color = &HFF0000 .TypeText "Blue Sky Airlines" .ParagraphFormat.Alignment = 1 '[wdAlignParagraphCenter] .TypeParagraph .TypeParagraph' Now add some text... .TypeText "Dear Mr. Smith," .TypeParagraph .TypeParagraph .TypeText "Thank you for your interest in our current fares " & _ "from Oakland to Sacramento. We guarantee to be " & _ "the lowest price for local flights, or we'll " & _ "offer to make your next flight FREE!" .TypeParagraph .TypeParagraph .TypeText "The current fare for a flight leaving Oakland " & _ "on October 4, 1999 and arriving in Sacramento " & _ "the same day is $54.00." .TypeParagraph .TypeParagraph .TypeText "We hope you will choose to fly Blue Sky Airlines." .TypeParagraph .TypeParagraph .TypeText "Sincerely," .TypeParagraph .TypeParagraph .TypeParagraph .TypeText "John Taylor" .TypeParagraph .Font.Italic = True .TypeText "Regional Sales Manager" .TypeParagraphEnd With' Zoom to see entire document... OLE1.SizeMode = 3 OLE1.DoVerb -1Command1.Enabled = False Command2.Enabled = False Command3.Enabled = True Exit SubErr_Handler: MsgBox "An error occurred: " & Err.Description, vbCriticalEnd SubPrivate Sub Command2_Click() On Error GoTo Err_Handler' Create an embedded object using the data ' stored in Test.doc.<?xm-insertion_mark_start author="v-thomr" time="20070327T040719-0600"?> If this code is run in Microsoft Office ' Word 2007, change the file name to Test.docx.<?xm-insertion_mark_end?><?xm-deletion_mark author="v-thomr" time="20070327T040717-0600" data=".."?> OLE1.CreateEmbed "C:\Test.doc"Command1.Enabled = False Command2.Enabled = False Command3.Enabled = True Exit SubErr_Handler: MsgBox "The file 'C:\Test.doc' does not exist" & _ " or cannot be opened.", vbCriticalEnd SubPrivate Sub Command3_Click() On Error Resume Next' Delete the existinf test file (if any)... Kill "C:\Test.doc"' Save the file as a native Word DOC file... oDocument.SaveAs "C:\Test.doc" Set oDocument = Nothing' Close the OLE object and remove it... OLE1.Close OLE1.DeleteCommand1.Enabled = True Command2.Enabled = True Command3.Enabled = FalseEnd SubPrivate Sub Form_Load() Command1.Caption = "Create" Command2.Caption = "Open" Command3.Caption = "Save" Command3.Enabled = FalseEnd Sub
הקש על מקש F5 כדי להפעיל את התוכנית. לחץ על לחצן צור. פעולה זו מטביעה מסמך חדש ושולחת את Word לאוטומטי כדי להוסיף נתונים ישירות למסמך. שים לב שאם תלחץ פעמיים על האובייקט, הוא יופעל במקום והמשתמש יוכל לערוך את הנתונים ישירות. כעת לחץ על שמור כדי לשמור את הנתונים בקובץ ולסגור את אובייקט ה- OLE. לחצן פתח מאפשר לך לפתוח עותק של קובץ שנשמר בעבר.
שיקולים בעת שימוש בגורמים המכילים של OLE
אם אתה מוטבע מקובץ קיים, הנתונים שיוצגו בתוך הגורם המכיל של OLE הם עותק של הנתונים בקובץ. כל השינויים שתבצע לא יישמרו באופן אוטומטי באותו קובץ. על אף שניתן להשתמש בשיטה דומה לזו שלעיל כדי לשמור את התוצאות בחזרה בקובץ מסוים, לא כל שרתי OLE תומכים ביכולת זו. אופן הפעולה של אובייקט OLE רגיל אינו נחשב.
אם אתה "מקשר" לקובץ, אין אפשרות להפעיל את האובייקט במקום. במקום זאת, כאשר המשתמש לוחץ פעמיים על האובייקט, האובייקט נפתח בחלון של יישום השרת. ניתן להפעיל אובייקטים מוטבעים בלבד במקום.
פקד הגורם המכיל של OLE מודע לנתונים מאוגדים. אם יש לך מסד נתונים של Access 97 או Access 2000, באפשרותך לאגד את הפקד לשדה אובייקט OLE במסד הנתונים. כאשר הטופס מוצג, הנתונים לקוחים ממסד הנתונים ויוצגו על-ידי המשתמש לעריכה. כל שינויי העריכה שבוצעו על-ידי המשתמש נשמרים באופן אוטומטי בחזרה במסד הנתונים כאשר אובייקט ה- OLE נסגר.
כדי להפוך את נתוני הפקד של הגורם המכיל של OLE לאגד, הוסף פקד נתונים של Visual Basic והגדר את המאפיין DatabaseName שלו לנתיב מסד הנתונים. לאחר מכן הגדר את RecordSource לטבלה קיימת במסד הנתונים. השתמש במאפיין DataSource של פקד OLE כדי לאגד את הפקד לפקד Visual Basic Data ולאחר מכן הגדר את המאפיין DataField כך שיצביע על שדה מסוים בערכת הרשומות המכילה את אובייקט OLE. Visual Basic עושה את כל השאר.
הגודל והמיקום של הגבול מקווקו המציג כאשר הגורם המכיל הפך לפעיל במקום נקבעים לפי גודל האובייקט והאפשרויות שנבחרו עבור פקד OLE. גבול זה מוצג כדי לסמן את גבולות חלון העריכה. גבולות חלון העריכה לעתים קרובות אינם תואמים לגבולות של הגורם המכיל של OLE עצמו; אופן פעולה זה הוא רגיל עבור אובייקט OLE. אין אפשרות לשנות את חלון העריכה באמצעות תיכנות מ- Visual Basic.
ייתכן שפעולות שירות מסוימות של אוטומציה לא יפעלו כראוי, אלא אם האובייקט הפך לפעיל במקום. כדי להפעיל אובייקט OLE באופן תיכנותי, השתמש בפעולת השירות DoVerb וציין vbOLEShow (-1) לפועל.
באפשרותך לקבוע אם תפריט של אובייקט מקושר או מוטבע מופיע בטופס הגורם המכיל על-ידי הגדרת המאפיין NegotiateMenus של טופס. אם המאפיין NegotiateMenus של טופס הצאצא מוגדר ל- True ושורת התפריטים מוגדרת על-ידי הגורם המכיל, תפריטי האובייקט ממוקמים בשורת התפריטים של הגורם המכיל כאשר האובייקט מופעל. אם הגורם המכיל אינו מכיל שורת תפריטים, או שהמאפיין NegotiateMenus מוגדר ל- False, התפריטים של האובייקט אינם מופיעים כאשר הוא מופעל. שים לב כי המאפיין NegotiateMenus אינו חל על טפסי MDI כך שלא ניתן למזג תפריט של טופס MDI עם אלה של האובייקט שהופעל. כדי להמחיש משא ומתן על התפריט, נסה את הפעולות הבאות באמצעות היישום לדוגמה שיצרת בסעיף הקודם:
- הפעל את היישום ולחץ על לחצן צור כדי להטביע מסמך חדש בגורמים המכילים של OLE.
- לחץ באמצעות לחצן העכבר הימני על הגורם המכיל של OLE ובחר ערוך כדי להפעיל את האובייקט במקום. שים לב כי התפריטים עבור היישום של האובייקט מופיעים מאחר שהמאפיין NegotiateMenus של Form1 מוגדר ל- True כברירת מחדל.
- סגור את הטופס כדי לסיים את היישום.
- כאשר האפשרות טופס1 נבחרה, לחץ על עורך תפריטים בתפריט כלים.
- צור תפריט חדש ברמה העליונה עם הכיתוב קובץ ואת השם mnuFile. הגדר את המאפיין NegotiatePosition של תפריט זה ל-"1-שמאל". צור פריט תפריט עם הכיתוב Open ואת השם mnuOpen.
- לחץ על אישור כדי לסגור את עורך התפריטים.
- שוב, הפעל את היישום ולחץ על לחצן צור כדי להטביע מסמך חדש בגורמים המכילים של OLE.
- לחץ באמצעות לחצן העכבר הימני על הגורם המכיל של OLE ובחר ערוך כדי להפעיל את האובייקט במקום. שים לב שהתפריט עבור Form1 מוזג עם התפריטים עבור יישום האובייקט.
Visual Basic אינו מאפשר לך לשלוט בתהליך מיזוג התפריטים או לבצע שינויים בפריטי התפריט של השרת בעת הוספתו. עם זאת, באפשרותך לשנות או לשנות תפריטים של יישום Office באמצעות אוטומציה באמצעות קוד דומה לרכיבים הבאים:
' This code disables the Insert|Object item on the merged menu... Dim oMenuBar As Object Set oMenuBar = oBook.Application.CommandBars("Worksheet Menu Bar") oMenuBar.Controls("&Insert").Controls("&Object...").Enabled = False
שים לב שייתכן שיהיה צורך לבצע שינויים מסוימים לפני שהאובייקט יהיה פעיל במקום, אחרת ייתכן שהשינויים לא יופיעו בתפריט הממוזג.
הערה נקודת תבליט זו אינה חלה על Microsoft Office Excel 2007 או על Microsoft Office Word 2007.
Visual Basic אינו תומך כעת בהקצאה של שטח בסרגל הכלים. לכן, סרגלי כלים מעיקנים אינם מופיעים בדרך כלל כאשר האובייקט מופעל. עם זאת, ייתכן שתוכל להציג חלון כלי צף עם אוטומציה:
OLE1.DoVerb -1 '[vbOLEShow] With oBook.Application.CommandBars("Standard") .Position = 4 '[msoBarFloating] .Visible = True End With
הערה נקודת תבליט זו אינה חלה על Microsoft Office Excel 2007 או על Microsoft Office Word 2007.
עבור תוכניות הדורשות אובייקט להישאר פעיל במקום בכל עת, Microsoft סיפקה את טכנולוגיית ActiveX Documents. לא כל שרתי OLE הם שרתי מסמכים של ActiveX; Microsoft Word, Microsoft Excel ו- Microsoft PowerPoint הם שרתי מסמכים של ActiveX.
Visual Basic אינו תומך בפקד מקורי לאירוח מסמכי ActiveX. עם זאת, הפקד WebBrowser שמגיע עם Internet Explorer (גירסה 3.0 ואילך) תומך באופן זה של כלולה במקום. ניתן להשתמש בפקד זה כדי לפתוח מסמך Office כמסמך ActiveX. לקבלת מידע נוסף אודות השימוש בפקד WebBrowser, עיין במאמר הבא:
243058 כיצד להשתמש בפקד WebBrowser כדי לפתוח מסמך Office
פעולת השירות SaveToFile של הגורם המכיל OLE יוצרת קובץ שניתן לפתוח אותו בגורמים המכילים של OLE. עם זאת, לא ניתן לפתוח קבצים שנשמרו באמצעות פעולת השירות SaveToFile של הגורם המכיל OLE ישירות ביישום Office המתאים. אם ברצונך לשמור את המסמך המוטבע בדיסק כך שניתן יהיה לפתוח את המסמך ביישום היעד, השתמש בפעולת השירות SaveAs של המסמך של היישום:
OLE1.object.SaveAs ("C:\MyNewFile.doc")