全貼了
---------------------------------------------------------------------------------------
藉由 Microsoft 的物件連結與內嵌 (OLE) 技術,可以將 Office 文件插入 Visual Basic 中。OLE 的設計,是要讓某個應用程式利用使用者方便的方式,裝載屬於另一個應用程式的物件,
但是相關的應用程式並不需要知道對方的內部詳細資料。Visual Basic 提供 OLE 容器控制項,可讓 Visual Basic 程式設計人員將 OLE 物件加入表單。
一旦內嵌物件之後,大多數 OLE 伺服器都支援 Automation,可讓主應用程式以程式設計的方式變更或操作物件。若要取得 Automation 物件的參照,請使用 OLE 容器的 Object 屬性。這個
屬性會傳回最符合特定之內嵌項目的 Automation 物件。
回此頁最上方
建立裝載 Excel 活頁簿的 Visual Basic 應用程式
啟動 Visual Basic 並建立新的標準專案。根據預設會建立 Form1。
從控制工具箱中,新增三個命令按鈕至 Form1。然後新增一個 OLE 容器控制項的執行個體。將 OLE 容器控制項放在表單上後,它會提示您選擇要插入的物件類型。在這個範例中,您必須動態地新增
物件,因此請按一下 [取消] 以關閉對話方塊,不新增物件。
在 Form1 的 [程式碼] 視窗中,新增下列程式碼:
Option Explicit
Dim oBook As Object
Dim oSheet As Object
Private 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 Long
Set 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 = arrData
oSheet.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.AutoFormat
Command1.Enabled = False
Command2.Enabled = False
Command3.Enabled = True
Exit Sub
Err_Handler:
MsgBox "An error occurred: " & Err.Description, vbCritical
End Sub
Private 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 Sub
Err_Handler:
MsgBox "The file 'C:\Test.xls' does not exist" & _
" or cannot be opened.", vbCritical
End Sub
Private 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.Delete
Command1.Enabled = True
Command2.Enabled = True
Command3.Enabled = False
End Sub
Private Sub Form_Load()
Command1.Caption = "Create"
Command2.Caption = "Open"
Command3.Caption = "Save"
Command3.Enabled = False
End Sub
按 F5 鍵以執行程式。按一下 [建立] 按鈕。這會內嵌新的工作表,並自動化 Excel 以直接新增資料至工作表。請注意,如果您按兩下物件,它會就地啟動,而且使用者可以直接編輯資料。
接著按一下 [儲存],將資料儲存至檔案並關閉 OLE 物件。[開啟] 按鈕可讓您開啟先前儲存之檔案的複本。
回此頁最上方
建立裝載 Word 文件的 Visual Basic 應用程式
啟動 Visual Basic 並建立新的標準專案。根據預設會建立 Form1。
從控制工具箱中,新增三個命令按鈕至 Form1。然後新增一個 OLE 容器控制項的執行個體。將 OLE 容器控制項放在表單上後,它會提示您選擇要插入的物件類型。在這個範例中,我們必須動態
地新增物件,因此請按一下 [取消] 以關閉對話方塊,不新增物件。
在 Form1 的 [程式碼] 視窗中,新增下列程式碼:
Option Explicit
Dim oDocument As Object
Private 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.object
oDocument.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"
.TypeParagraph
End With
' Zoom to see entire document...
OLE1.SizeMode = 3
OLE1.DoVerb -1
Command1.Enabled = False
Command2.Enabled = False
Command3.Enabled = True
Exit Sub
Err_Handler:
MsgBox "An error occurred: " & Err.Description, vbCritical
End Sub
Private 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 Sub
Err_Handler:
MsgBox "The file 'C:\Test.doc' does not exist" & _
" or cannot be opened.", vbCritical
End Sub
Private 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.Delete
Command1.Enabled = True
Command2.Enabled = True
Command3.Enabled = False
End Sub
Private Sub Form_Load()
Command1.Caption = "Create"
Command2.Caption = "Open"
Command3.Caption = "Save"
Command3.Enabled = False
End Sub
按 F5 鍵以執行程式。按一下 [建立] 按鈕。這會內嵌新的文件,並自動化 Word 以直接新增資料至文件。請注意,如果您按兩下物件,它會就地啟動,而且使用者可以直接編輯資料。
接著按一下 [儲存],將資料儲存至檔案並關閉 OLE 物件。[開啟] 按鈕可讓您開啟先前儲存之檔案的複本。
回此頁最上方
使用 OLE 容器時的考量
如果您是內嵌現有的檔案,在 OLE 容器內所看到的資料就是檔案中之資料的複本。您所做的任何變更並不會自動儲存至同一個檔案。雖然您可以使用類似上面的技巧將結果存回特定的檔案
,但是並非所有的 OLE 伺服器都支援這項功能。這並不是正常的 OLE 物件行為。如果您是「連結」檔案‧則不能就地啟動物件。而是會在使用者按兩下物件時,在伺服器應用程式的視窗中
開啟物件。只有內嵌的物件可以就地啟動。OLE 容器控制項可以感知資料繫結。如果您有 Access 97 或 Access 2000 資料庫,就可以將控制項繫結至資料庫中的 OLE 物件欄位。顯示
表單時,會從資料庫取出並顯示資料,以供使用者編輯。使用者所做的任何編輯變更,都會在關閉 OLE 物件時自動存回資料庫。
若要讓 OLE 容器控制項產生資料繫結,請新增一個 Visual Basic 資料控制項,並將其 DatabaseName 屬性設定至資料庫路徑。然後將 RecordSource 設定為資料庫中現有的資料表
。使用 OLE 控制項的 DataSource 屬性,將控制項繫結至 Visual Basic 資料控制項,然後設定 DataField 屬性,以指向包含 OLE 物件之資料錄集內的特定欄位。其餘的工作就交
給 Visual Basic。就地啟動容器時顯示之影線框線的大小和位置,是由您為 OLE 控制項選取之物件大小和選項決定。顯示這個框線是要標記編輯視窗的界限。編輯視窗的界限往往與 OLE
容器本身的界限不一致;這種行為對 OLE 物件而言是正常的。編輯視窗不能從 Visual Basic 以程式設計的方式改變。有些 Automation 方法必須在就地啟動物件時才能正確工作。如果
要以程式設計的方式啟動 OLE 物件,請使用 DoVerb 方法,並指定 vbOLEShow (-1) 為其動作。您可以設定表單的 NegotiateMenus 屬性,以決定是否在容器中顯示連結或內嵌物件的
功能表。如果子表單的 NegotiateMenus 屬性設定為 True,而且容器定義了功能表列,則在啟動物件時,會將物件的功能表放在容器的功能表列上。如果容器沒有功能表列,或者
NegotiateMenus 屬性設定為 False,則在啟動物件時,並不會顯示物件的功能表。請注意,NegotiateMenus 屬性並不會套用至 MDI 表單,因此 MDI 表單的功能表不能與啟動之物件
的功能表合併。為了說明功能表交涉,請利用您在前一節建立的範例應用程式執行下列作業:
執行應用程式,然後按一下 [建立] 按鈕,將新文件內嵌到 OLE 容器中。
用滑鼠右鍵按一下 OLE 容器,然後選取 [編輯] 以就地啟動物件。請注意,這會顯示物件應用程式的功能表,因為 Form1 的 NegotiateMenus 屬性預設設定為 True。
關閉表單以結束應用程式。
選取 Form1,然後按一下 [工具] 功能表上的 [功能表編輯器]。
建立新的最上層功能表,標題為 File,名稱為 mnuFile。將這個功能表的 NegotiatePosition 屬性設定為「1-Left」。建立一個功能表項目,標題為 Open,名稱為 mnuOpen。
按一下 [確定] 以關閉功能表編輯器。
再次執行應用程式,然後按一下 [建立] 按鈕,將新文件內嵌至 OLE 容器中。
用滑鼠右鍵按一下 OLE 容器,然後選取 [編輯] 以就地啟動物件。請注意,Form1 的功能表已經和物件應用程式的功能表合併。
Visual Basic 不允許您在新增時控制功能表的合併程序,或者變更伺服器的功能表項目。但是,您可以使用類似下列的程式碼,透過 Automation 變更或修改 Office 應用程式的功能表:
' This code disables the Insert|Object item on the merged menu...
Dim oMenuBar As Object
Set oMenuBar = oBook.("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.("Standard")
.Position = 4 '[msoBarFloating]
.Visible = True
End With
注意 這個項目並不適用於 Microsoft Office Excel 2007 或 Microsoft Office Word 2007。
針對要求物件永遠保持就地啟動的程式,Microsoft 提供了 ActiveX Documents 技術。並非所有的 OLE 伺服器都屬於 ActiveX Document 伺服器;Microsoft Word、Microsoft Excel
及 Microsoft PowerPoint 是 ActiveX Document 伺服器。
Visual Basic 並不支援裝載 ActiveX Documents 的原生控制項。不過,Internet Explorer (3.0 版和更高的版本) 所附的 WebBrowser 控制項支援這種形式的就地 Containment。
您可以使用這個控制項將 Office 文件開啟為 ActiveX 文件。如需使用 WebBrowser 控制項的詳細資訊,請參閱下面的文件:243058
(http://support. )
如何使用 WebBrowser 控制項開啟 Office 文件OLE 容器的 SaveToFile 方法會建立一個可以在 OLE 容器中開啟的檔案。不過,利用 OLE 容器的 SaveToFile 方法儲存的檔案,不能直接在
對應的 Office 應用程式中開啟。如果您要將內嵌的文件儲存到磁碟,以便讓文件能夠在目標應用程式中開啟,請使用應用程式的文件 SaveAs 方法:
OLE1.object.SaveAs ("C:\MyNewFile.doc")