요약
Office 문서에서 데이터를 사용하는 애플리케이션을 개발할 때 사용자가 Office 응용 프로그램으로 전환하지 않고도 데이터를 보고 편집할 수 있도록 해당 데이터를 Visual Basic 애플리케이션 내에 직접 표시하는 것이 도움이 될 수 있습니다. OLE 컨테이너 컨트롤을 사용하여 Visual Basic에서 이 작업을 수행할 수 있습니다.
이 문서에서는 OLE 컨테이너 컨트롤을 사용하여 Office 문서를 동적으로 만들고 자동화하는 방법을 보여 줍니다.
추가 정보
Office 문서를 Visual Basic에 삽입하는 기능은 Microsoft의 OLE(개체 연결 및 포함) 기술을 통해 가능합니다. OLE는 최종 사용자에게 편리하지만 관련된 애플리케이션이 다른 애플리케이션의 내부 세부 정보를 알 필요가 없는 방식으로 한 애플리케이션이 다른 애플리케이션에 속한 개체를 호스트할 수 있도록 설계되었습니다. Visual Basic은 Visual Basic 프로그래머가 양식에 OLE 개체를 추가할 수 있도록 하는 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 Data 컨트롤을 추가하고 DatabaseName 속성을 데이터베이스 경로로 설정합니다. 그런 다음, RecordSource를 데이터베이스의 기존 테이블로 설정합니다. OLE 컨트롤의 DataSource 속성을 사용하여 컨트롤을 Visual Basic Data 컨트롤에 바인딩한 다음 OLE 개체가 포함된 레코드 집합의 특정 필드를 가리키도록 DataField 속성을 설정합니다. Visual Basic은 나머지 작업을 수행합니다.
컨테이너가 현재 위치에서 활성화될 때 표시되는 부화 테두리의 크기와 위치는 개체의 크기와 OLE 컨트롤에 대해 선택한 옵션에 따라 결정됩니다. 이 테두리는 편집 창의 경계를 표시하기 위해 표시됩니다. 편집 창의 경계가 OLE 컨테이너 자체의 경계와 일치하지 않는 경우가 많습니다. 이 동작은 OLE 개체에 대해 정상입니다. 편집 창은 Visual Basic에서 프로그래밍 방식으로 변경할 수 없습니다.
개체가 현재 위치에서 활성화되지 않은 경우 일부 Automation 메서드가 제대로 작동하지 않을 수 있습니다. OLE 개체를 프로그래밍 방식으로 활성화하려면 DoVerb 메서드를 사용하고 vbOLEShow(-1)를 동사로 지정합니다.
폼의 NegotiateMenus 속성을 설정하여 연결된 개체 또는 포함된 개체의 메뉴가 컨테이너 양식에 표시되는지 여부를 확인할 수 있습니다. 자식 폼의 NegotiateMenus 속성이 True로 설정되고 컨테이너에 메뉴 모음이 정의된 경우 개체가 활성화되면 개체의 메뉴 모음에 개체 메뉴가 배치됩니다. 컨테이너에 메뉴 모음이 없거나 NegotiateMenus 속성이 False로 설정된 경우 활성화될 때 개체의 메뉴가 표시되지 않습니다. NegotiateMenus 속성은 MDI Forms에 적용되지 않으므로 MDI 폼의 메뉴를 활성화된 개체의 메뉴와 병합할 수 없습니다. 메뉴 협상을 설명하려면 이전 섹션에서 만든 샘플 애플리케이션으로 다음을 시도합니다.
- 애플리케이션을 실행하고 만들기 단추를 클릭하여 OLE 컨테이너에 새 문서를 포함합니다.
- OLE 컨테이너를 마우스 오른쪽 단추로 클릭하고 편집을 선택하여 개체를 현재 위치로 활성화합니다. Form1의 NegotiateMenus 속성이 기본적으로 True로 설정되어 있으므로 개체의 애플리케이션에 대한 메뉴가 나타납니다.
- 양식을 닫아 애플리케이션을 종료합니다.
- Form1을 선택한 상태에서 도구 메뉴에서 메뉴 편집기를 클릭합니다.
- 캡션 파일 및 이름 mnuFile을 사용하여 새 최상위 메뉴를 만듭니다. 이 메뉴의 NegotiatePosition 속성을 "1-Left"로 설정합니다. 열기 및 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.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 문서를 호스트하는 네이티브 컨트롤을 지원하지 않습니다. 그러나 Internet Explorer(버전 3.0 이상)와 함께 제공되는 WebBrowser 컨트롤은 이러한 형태의 현재 위치 포함을 지원합니다. 이 컨트롤을 사용하여 Office 문서를 ActiveX 문서로 열 수 있습니다. WebBrowser 컨트롤 사용에 대한 자세한 내용은 다음 문서를 참조하세요.
WebBrowser 컨트롤을 사용하여 Office 문서를 여는 방법 243058
OLE 컨테이너의 SaveToFile 메서드는 OLE 컨테이너에서 열 수 있는 파일을 만듭니다. 그러나 OLE 컨테이너의 SaveToFile 메서드로 저장된 파일은 해당 Office 응용 프로그램에서 직접 열 수 없습니다. 대상 애플리케이션에서 문서를 열 수 있도록 포함된 문서를 디스크에 저장하려면 애플리케이션의 문서 SaveAs 메서드를 사용합니다.
OLE1.object.SaveAs ("C:\MyNewFile.doc")