Udostępnij za pośrednictwem


Jak osadzać i automatyzować dokumenty pakietu Office za pomocą języka Visual Basic

Podsumowanie

Podczas tworzenia aplikacji korzystającej z danych w dokumencie pakietu Office korzystne może być prezentowanie tych danych bezpośrednio w aplikacji Visual Basic, aby użytkownik mógł wyświetlać i edytować dane bez konieczności przełączania się do aplikacji pakietu Office. Można to zrobić w języku Visual Basic przy użyciu kontrolki kontenera OLE.

W tym artykule pokazano, jak dynamicznie tworzyć i automatyzować dokument pakietu Office przy użyciu kontrolki kontenera OLE.

Więcej informacji

Możliwość wstawiania dokumentu pakietu Office do języka Visual Basic jest możliwa dzięki technologii łączenia obiektów i osadzania (OLE) firmy Microsoft. Rozwiązanie OLE zostało zaprojektowane tak, aby umożliwić jednej aplikacji hostowanie obiektu należącego do innej aplikacji w sposób, który jest wygodny dla użytkownika końcowego, ale nie wymaga, aby zaangażowane aplikacje znały wewnętrzne szczegóły drugiej. Visual Basic udostępnia kontrolkę kontenera OLE umożliwiającą programistom visual basic dodawanie obiektów OLE do formularza.

Gdy obiekt jest osadzony, większość serwerów OLE obsługuje usługę Automation, aby umożliwić aplikacji hosta programowe zmienianie lub manipulowanie obiektem z kodu. Aby uzyskać odwołanie do obiektu automatyzacji, użyj właściwości Object kontenera OLE. Ta właściwość zwraca obiekt usługi Automation, który jest ściśle zgodny z określonym osadzonym elementem.

Tworzenie aplikacji Visual Basic hostującej skoroszyt programu Excel

  1. Uruchom program Visual Basic i utwórz nowy projekt standardowy. Formularz 1 jest tworzony domyślnie.

  2. W przyborniku kontrolki dodaj trzy przyciski poleceń do formularza Form1. Następnie dodaj wystąpienie kontrolki kontenera OLE. Gdy kontrolka kontenera OLE zostanie umieszczona w formularzu, zostanie wyświetlony monit o typ obiektu, który chcesz wstawić. W tym przykładzie należy dodać obiekt dynamicznie, więc kliknij przycisk Anuluj, aby zamknąć okno dialogowe bez dodawania obiektu.

  3. W oknie Kod formularza Form1 dodaj następujący kod:

    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
    
    
  4. Naciśnij klawisz F5, aby uruchomić program. Kliknij przycisk Utwórz. Osadza to nowy arkusz i automatyzuje program Excel w celu dodawania danych bezpośrednio do arkusza. Pamiętaj, że po dwukrotnym kliknięciu obiektu aktywuje się on w miejscu, a użytkownik może bezpośrednio edytować dane. Teraz kliknij przycisk Zapisz, aby zapisać dane w pliku i zamknąć obiekt OLE. Przycisk Otwórz umożliwia otwarcie kopii wcześniej zapisanego pliku.

Tworzenie aplikacji Visual Basic hostującej dokument programu Word

  1. Uruchom program Visual Basic i utwórz nowy projekt standardowy. Formularz 1 jest tworzony domyślnie.

  2. W przyborniku kontrolki dodaj trzy przyciski poleceń do formularza Form1. Następnie dodaj wystąpienie kontrolki kontenera OLE. Gdy kontrolka kontenera OLE zostanie umieszczona w formularzu, zostanie wyświetlony monit o typ obiektu, który chcesz wstawić. W tym przykładzie musimy dodać obiekt dynamicznie, więc kliknij przycisk Anuluj, aby zamknąć okno dialogowe bez dodawania obiektu.

  3. W oknie Kod formularza Form1 dodaj następujący kod:

    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
    
    
  4. Naciśnij klawisz F5, aby uruchomić program. Kliknij przycisk Utwórz. Spowoduje to osadzanie nowego dokumentu i automatyzowanie programu Word w celu dodawania danych bezpośrednio do dokumentu. Pamiętaj, że po dwukrotnym kliknięciu obiektu aktywuje się on w miejscu, a użytkownik może bezpośrednio edytować dane. Teraz kliknij przycisk Zapisz, aby zapisać dane w pliku i zamknąć obiekt OLE. Przycisk Otwórz umożliwia otwarcie kopii wcześniej zapisanego pliku.

Zagadnienia dotyczące korzystania z kontenera OLE

  • Jeśli osadzasz z istniejącego pliku, dane widoczne w kontenerze OLE są kopią danych w pliku. Wprowadzone zmiany nie są automatycznie zapisywane w tym samym pliku. Chociaż można użyć techniki podobnej do powyższej, aby zapisać wyniki z powrotem do określonego pliku, nie wszystkie serwery OLE obsługują tę funkcję. Nie jest on traktowany jako normalne zachowanie obiektu OLE.

  • Jeśli "łączysz" się z plikiem, nie można aktywować obiektu w miejscu. Zamiast tego, gdy użytkownik dwukrotnie kliknie obiekt, obiekt zostanie otwarty w oknie aplikacji serwera. W miejscu można aktywować tylko obiekty osadzone.

  • Kontrolka kontenera OLE jest powiązana z danymi. Jeśli masz bazę danych programu Access 97 lub Access 2000, możesz powiązać kontrolkę z polem obiektu OLE w bazie danych. Po wyświetleniu formularza dane są pobierane z bazy danych i wyświetlane do edycji przez użytkownika. Wszelkie zmiany edycji wprowadzone przez użytkownika są automatycznie zapisywane z powrotem do bazy danych po zamknięciu obiektu OLE.

    Aby utworzyć powiązanie danych kontrolki kontenera OLE, dodaj kontrolkę Danych Visual Basic i ustaw jej właściwość DatabaseName na ścieżkę bazy danych. Następnie ustaw źródło rekordów na istniejącą tabelę w bazie danych. Użyj właściwości DataSource kontrolki OLE, aby powiązać kontrolkę z kontrolką Danych Visual Basic, a następnie ustaw właściwość DataField tak, aby wskazywała określone pole w zestawie rekordów, które zawiera obiekt OLE. Visual Basic robi resztę.

  • Rozmiar i położenie obramowania wykluwanego, które jest wyświetlane, gdy kontener jest aktywny w miejscu, zależy od rozmiaru obiektu i opcji wybranych dla kontrolki OLE. To obramowanie jest wyświetlane w celu oznaczenia granic okna edycji. Granice okna edycji często nie są zgodne z granicami samego kontenera OLE; to zachowanie jest normalne dla obiektu OLE. Nie można programowo zmienić okna edycji z poziomu języka Visual Basic.

  • Niektóre metody automatyzacji mogą nie działać poprawnie, chyba że obiekt został w miejscu aktywny. Aby programowo aktywować obiekt OLE, użyj metody DoVerb i określ parametr vbOLEShow (-1) jako czasownik.

  • Możesz określić, czy menu obiektu połączonego, czy osadzonego jest wyświetlane w formularzu kontenera, ustawiając właściwość NegotiateMenus formularza. Jeśli właściwość NegotiateMenus formularza podrzędnego jest ustawiona na wartość True, a kontener ma zdefiniowany pasek menu, menu obiektu są umieszczane na pasku menu kontenera po aktywowaniu obiektu. Jeśli kontener nie ma paska menu lub właściwość NegotiateMenus ma wartość False, menu obiektu nie są wyświetlane po jego aktywowaniu. Należy pamiętać, że właściwość NegotiateMenus nie ma zastosowania do formularzy MDI, więc nie można scalić menu formularza MDI z menu aktywowanego obiektu. Aby zilustrować negocjacje menu, spróbuj wykonać następujące czynności z przykładową aplikacją utworzoną w poprzedniej sekcji:

    1. Uruchom aplikację i kliknij przycisk Utwórz, aby osadzić nowy dokument w kontenerze OLE.
    2. Kliknij prawym przyciskiem myszy kontener OLE i wybierz pozycję Edytuj, aby aktywować obiekt w miejscu. Pamiętaj, że menu aplikacji obiektu są wyświetlane, ponieważ właściwość NegotiateMenus formularza Form1 jest domyślnie ustawiona na wartość True.
    3. Zamknij formularz, aby zakończyć aplikację.
    4. Po wybraniu formularza Form1 kliknij pozycję Edytor menu w menu Narzędzia.
    5. Utwórz nowe menu najwyższego poziomu z podpisem Plik i nazwą mnuFile. Ustaw właściwość NegotiatePosition tego menu na wartość "1-Left". Utwórz element menu z podpisem Otwórz i nazwą mnuOpen.
    6. Kliknij przycisk OK, aby zamknąć edytor menu.
    7. Ponownie uruchom aplikację i kliknij przycisk Utwórz, aby osadzić nowy dokument w kontenerze OLE.
    8. Kliknij prawym przyciskiem myszy kontener OLE i wybierz pozycję Edytuj, aby aktywować obiekt w miejscu. Zwróć uwagę, że menu formularza Form1 zostało scalone z menu aplikacji obiektu.

    Program Visual Basic nie umożliwia kontrolowania procesu scalania menu ani wprowadzania zmian w elementach menu serwera po dodaniu. Można jednak zmienić lub zmodyfikować menu aplikacji pakietu Office za pomocą usługi Automation przy użyciu kodu podobnego do następującego:

     ' 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
    
    

    Należy pamiętać, że niektóre zmiany mogą wymagać wprowadzenia, zanim obiekt zostanie włączony w miejscu, w przeciwnym razie zmiany mogą nie być wyświetlane w scalonym menu.

    Uwaga Ten punktor NIE ma zastosowania do programu Microsoft Office Excel 2007 lub Microsoft Office Word 2007.

  • Obecnie program Visual Basic nie obsługuje przypisywania miejsca na pasku narzędzi. W związku z tym zadokowane paski narzędzi zwykle nie są wyświetlane po aktywowaniu obiektu. Jednak może być możliwe wyświetlenie zmiennoprzecinkowych okien narzędzi z automatyzacją:

       OLE1.DoVerb -1 '[vbOLEShow]
       With oBook.Application.CommandBars("Standard")
          .Position = 4 '[msoBarFloating]
          .Visible = True
       End With
    
    

    Uwaga Ten punktor NIE ma zastosowania do programu Microsoft Office Excel 2007 lub Microsoft Office Word 2007.

  • W przypadku programów, które wymagają, aby obiekt pozostawał aktywny w miejscu przez cały czas, firma Microsoft udostępnia technologię ActiveX Documents. Nie wszystkie serwery OLE są serwerami dokumentów ActiveX; Microsoft Word, Microsoft Excel i Microsoft PowerPoint to serwery dokumentów ActiveX.

    Visual Basic nie obsługuje kontrolki natywnej do hostowania dokumentów ActiveX. Jednak kontrolka WebBrowser dostarczana z programem Internet Explorer (wersja 3.0 lub nowsza) obsługuje tę formę hermetyzowania w miejscu. Za pomocą tej kontrolki można otworzyć dokument pakietu Office jako dokument ActiveX. Aby uzyskać więcej informacji na temat korzystania z kontrolki WebBrowser, zobacz następujący artykuł:

    243058 jak otworzyć dokument pakietu Office za pomocą kontrolki WebBrowser

  • Metoda SaveToFile kontenera OLE tworzy plik, który można otworzyć w kontenerze OLE. Jednak plików zapisanych przy użyciu metody SaveToFile kontenera OLE nie można otwierać bezpośrednio w odpowiedniej aplikacji pakietu Office. Jeśli chcesz zapisać osadzony dokument na dysku, aby można było otworzyć dokument w aplikacji docelowej, użyj metody SaveAs dokumentu aplikacji:

    OLE1.object.SaveAs ("C:\MyNewFile.doc")