Aracılığıyla paylaş


Visual Basic ile Office belgelerini ekleme ve otomatikleştirme

Özet

Office belgesinde veri kullanan bir uygulama geliştirirken, kullanıcının Office uygulamasına geçmek zorunda kalmadan verileri görebilmesi ve düzenleyebilmesi için bu verilerin doğrudan Visual Basic uygulamanızın içinde sunulması yararlı olabilir. Bunu Visual Basic'te OLE Kapsayıcı Denetimi'ni kullanarak gerçekleştirebilirsiniz.

Bu makalede, OLE Kapsayıcı Denetimi'ni kullanarak bir Office belgesini dinamik olarak oluşturma ve Otomatikleştirme işlemleri gösterilmektedir.

Daha Fazla Bilgi

Visual Basic'e Office belgesi ekleme özelliği, Microsoft'un Nesne Bağlama ve Ekleme (OLE) teknolojisiyle mümkün hale getiriliyor. OLE, bir uygulamanın başka bir uygulamaya ait bir nesneyi son kullanıcı için uygun bir şekilde barındırmasına izin verecek şekilde tasarlanmıştır, ancak ilgili uygulamaların diğerinin iç ayrıntılarını bilmesini gerektirmez. Visual Basic, Visual Basic programcıların forma OLE nesneleri eklemesine izin vermek için OLE Kapsayıcı Denetimi sağlar.

Nesne katıştırıldıktan sonra, çoğu OLE sunucusu konak uygulamanın nesneyi program aracılığıyla değiştirmesine veya koddan işlemesine izin vermek için Otomasyon'u destekler. Otomasyon nesnesine başvuru almak için OLE kapsayıcısının Object özelliğini kullanın. Bu özellik, katıştırılmış belirli öğeyle yakından eşleşen Otomasyon nesnesini döndürür.

Excel çalışma kitabını barındıran bir Visual Basic uygulaması oluşturma

  1. Visual Basic'i başlatın ve yeni bir standart proje oluşturun. Form1 varsayılan olarak oluşturulur.

  2. Denetim araç kutusundan Form1'e üç Komut Düğmesi ekleyin. Ardından OLE Kapsayıcısı denetiminin bir örneğini ekleyin. OLE Kapsayıcısı denetimi forma yerleştirildiğinde, eklemek istediğiniz nesne türünü sorar. Bu örnek için nesneyi dinamik olarak eklemeniz gerekir, bu nedenle nesne eklemeden iletişim kutusunu kapatmak için İptal'e tıklayın.

  3. Form1'in Kod penceresine aşağıdaki kodu ekleyin:

    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. Programı çalıştırmak için F5 tuşuna basın. Oluştur düğmesine tıklayın. Bu, yeni bir çalışma sayfası ekler ve doğrudan sayfaya veri eklemek için Excel'i otomatikleştirir. Nesneye çift tıklarsanız nesnenin yerinde etkinleştirildiğini ve kullanıcının verileri doğrudan düzenleyebileceğini unutmayın. Şimdi kaydet'e tıklayarak verileri bir dosyaya kaydedin ve OLE nesnesini kapatın. Aç düğmesi, daha önce kaydedilmiş bir dosyanın kopyasını açmanıza olanak tanır.

Word belgesini barındıran bir Visual Basic uygulaması oluşturma

  1. Visual Basic'i başlatın ve yeni bir standart proje oluşturun. Form1 varsayılan olarak oluşturulur.

  2. Denetim araç kutusundan Form1'e üç Komut Düğmesi ekleyin. Ardından OLE Kapsayıcısı denetiminin bir örneğini ekleyin. OLE Kapsayıcısı denetimi forma yerleştirildiğinde, eklemek istediğiniz nesne türünü sorar. Bu örnek için nesneyi dinamik olarak eklememiz gerekir, bu nedenle nesne eklemeden iletişim kutusunu kapatmak için İptal'e tıklayın.

  3. Form1'in Kod penceresine aşağıdaki kodu ekleyin:

    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. Programı çalıştırmak için F5 tuşuna basın. Oluştur düğmesine tıklayın. Bu işlem yeni bir belge ekler ve Word'e otomatikleştirerek doğrudan belgeye veri ekler. Nesneye çift tıklarsanız nesnenin yerinde etkinleştirildiğini ve kullanıcının verileri doğrudan düzenleyebileceğini unutmayın. Şimdi kaydet'e tıklayarak verileri bir dosyaya kaydedin ve OLE nesnesini kapatın. Aç düğmesi, daha önce kaydedilmiş bir dosyanın kopyasını açmanıza olanak tanır.

OLE kapsayıcısını kullanırken dikkat edilmesi gerekenler

  • Mevcut bir dosyadan ekleniyorsanız, OLE Kapsayıcısı'nda görülen veriler dosyadaki verilerin bir kopyasıdır. Yaptığınız değişiklikler otomatik olarak aynı dosyaya kaydedilmez. Sonuçları belirli bir dosyaya geri kaydetmek için yukarıdakine benzer bir teknik kullanabilirsiniz ancak tüm OLE sunucuları bu özelliği desteklemez. Normal OLE nesnesi davranışı olarak kabul edilmez.

  • Bir dosyaya "bağlanıyorsanız" nesne yerinde etkinleştirilemez. Bunun yerine, kullanıcı nesneye çift tıkladığında, nesne sunucu uygulamasının penceresinde açılır. Yalnızca eklenmiş nesneler yerinde etkinleştirilebilir.

  • OLE Kapsayıcısı denetimi, veri bağlamaya duyarlıdır. Access 97 veya Access 2000 veritabanınız varsa, denetimi veritabanındaki bir OLE Nesnesi alanına bağlayabilirsiniz. Form görüntülendiğinde, veriler veritabanından çekilir ve kullanıcının düzenlemesi için görüntülenir. Kullanıcı tarafından yapılan tüm düzenleme değişiklikleri, OLE nesnesi kapatıldığında otomatik olarak veritabanına geri kaydedilir.

    OLE Kapsayıcısı denetimi verilerinin bağlı olmasını sağlamak için bir Visual Basic Veri denetimi ekleyin ve DatabaseName özelliğini veritabanı yoluna ayarlayın. Ardından KayıtKaynağı'nı veritabanındaki mevcut bir tabloya ayarlayın. Denetimi Visual Basic Veri denetimine bağlamak için OLE denetiminin DataSource özelliğini kullanın ve ardından DataField özelliğini OLE nesnesini içeren kayıt kümesindeki belirli bir alana işaret etmek üzere ayarlayın. Gerisini Visual Basic yapar.

  • Kapsayıcı yerinde etkin hale getirildiğinde görüntülenen taranmış kenarlık boyutu ve konumu, nesnenin boyutuna ve OLE denetimi için seçilen seçeneklere göre belirlenir. Bu kenarlık, düzenleme penceresinin sınırlarını işaretlemek için görüntülenir. Düzenleme penceresinin sınırları genellikle OLE kapsayıcısının kendi sınırlarıyla eşleşmez; bu davranış bir OLE nesnesi için normaldir. Düzenleme penceresi Visual Basic'ten program aracılığıyla değiştirilemez.

  • Nesne yerinde etkin hale getirilmediği sürece bazı Otomasyon yöntemleri düzgün çalışmayabilir. Bir OLE nesnesini program aracılığıyla etkinleştirmek için DoVerb yöntemini kullanın ve fiil olarak vbOLEShow (-1) belirtin.

  • Bir formun NegotiateMenus özelliğini ayarlayarak, bağlantılı veya eklenmiş nesne menüsünün kapsayıcı formunda görünüp görünmediğini belirleyebilirsiniz. Alt formun NegotiateMenus özelliği True olarak ayarlanmışsa ve kapsayıcı tanımlı bir menü çubuğuna sahipse, nesne etkinleştirildiğinde nesnenin menüleri kapsayıcının menü çubuğuna yerleştirilir. Kapsayıcının menü çubuğu yoksa veya NegotiateMenus özelliği False olarak ayarlandıysa, nesnenin menüleri etkinleştirildiğinde görünmez. NegotiateMenus özelliğinin MDI Forms için geçerli olmadığını, bu nedenle MDI Formunun menüsünün etkinleştirilmiş nesnenin menüleriyle birleştirilemeyeceğini unutmayın. Menü anlaşmasını göstermek için, önceki bölümde oluşturduğunuz örnek uygulamayla aşağıdakileri deneyin:

    1. Uygulamayı çalıştırın ve OLUŞTUR düğmesine tıklayarak OLE kapsayıcısına yeni bir belge ekleyin.
    2. OLE kapsayıcısına sağ tıklayın ve Nesneyi yerinde etkinleştirmek için düzenle'yi seçin. Form1'in NegotiateMenus özelliği varsayılan olarak True olarak ayarlandığından nesnenin uygulamasının menülerinin göründüğünü unutmayın.
    3. Uygulamayı sonlandırmak için Formu kapatın.
    4. Form1 seçili durumdayken, Araçlar menüsünde Menü Düzenleyicisi'ne tıklayın.
    5. Dosya başlığı ve mnuFile adıyla yeni bir üst düzey menü oluşturun. Bu menünün NegotiatePosition özelliğini "1-Sol" olarak ayarlayın. Aç başlığı ve mnuOpen adıyla bir menü öğesi oluşturun.
    6. Menü düzenleyicisini kapatmak için Tamam'a tıklayın.
    7. Bir kez daha uygulamayı çalıştırın ve Oluştur düğmesine tıklayarak OLE kapsayıcısına yeni bir belge ekleyin.
    8. OLE kapsayıcısına sağ tıklayın ve Nesneyi yerinde etkinleştirmek için düzenle'yi seçin. Form1 menüsünün nesnenin uygulamasının menüleriyle birleştirildiğine dikkat edin.

    Visual Basic, menü birleştirme işlemini denetlemenize veya eklendiğinde sunucunun menü öğelerinde değişiklik yapmanıza izin vermez. Ancak, otomasyon aracılığıyla bir Office uygulamasının menülerini aşağıdakine benzer bir kod kullanarak değiştirebilir veya değiştirebilirsiniz:

     ' 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
    
    

    Nesne yerinde etkin hale getirilmeden önce bazı değişikliklerin yapılması gerekebileceğini, aksi takdirde değişikliklerin birleştirilmiş menüde görünemeyebilir.

    Not Bu madde işareti, Microsoft Office Excel 2007 veya Microsoft Office Word 2007 için UYGULANMAZ.

  • Visual Basic şu anda araç çubuğu alanı atamayı desteklememektedir. Bu nedenle, nesne etkinleştirildiğinde yerleşik araç çubukları normalde görünmez. Ancak, otomasyon ile kayan bir araç penceresi görüntülemek mümkün olabilir:

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

    Not Bu madde işareti, Microsoft Office Excel 2007 veya Microsoft Office Word 2007 için UYGULANMAZ.

  • Bir nesnenin her zaman etkin kalmasını gerektiren programlar için Microsoft, ActiveX Belgeleri teknolojisini sağlamıştır. Tüm OLE sunucuları ActiveX Belge sunucuları değildir; Microsoft Word, Microsoft Excel ve Microsoft PowerPoint, ActiveX Belge sunucularıdır.

    Visual Basic, ActiveX Belgelerini barındırmak için yerel denetimi desteklemez. Ancak, Internet Explorer (sürüm 3.0 ve üzeri) ile birlikte gelen WebBrowser denetimi bu yerinde kapsama biçimini destekler. Bir Office belgesini ActiveX Belgesi olarak açmak için bu denetimi kullanmak mümkündür. WebBrowser denetimini kullanma hakkında daha fazla bilgi için lütfen aşağıdaki makaleye bakın:

    243058 Office Belgesini Açmak için WebBrowser Denetimini Kullanma

  • OLE kapsayıcısının SaveToFile yöntemi, OLE kapsayıcısında açılabilir bir dosya oluşturur. Ancak, OLE kapsayıcısının SaveToFile yöntemiyle kaydedilen dosyalar doğrudan ilgili Office uygulamasında açılamaz. Belgenin hedef uygulamada açılabilmesi için katıştırılmış belgenizi diske kaydetmek istiyorsanız uygulamanın SaveAs yöntemini kullanın:

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