Visual Basic .NET kullanarak Excel olaylarını işleme

Özet

Bu adım adım makalede, Visual Basic .NET kullanarak geliştirdiğiniz otomasyon istemcisinden Microsoft Office Excel 2003 ve Microsoft Office Excel 2007 olaylarının nasıl işlendiğini açıklanmaktadır.

Olay işleyicisi oluşturma

Microsoft Visual Basic .NET 2003 veya Visual Basic .NET 2002 ile aşağıdaki yollardan biriyle bir olay işleyicisi oluşturabilirsiniz. Visual Basic .NET ile olay işleyicisi oluşturma yönteminiz, olay işleyicisini olaylarla nasıl ilişkilendirmek istediğinize bağlıdır:

  • Genellikle Handles anahtar sözcüğünü WithEvents anahtar sözcüğüyle kullanarak bir olay işleyicisi oluşturursunuz. WithEvents anahtar sözcüğünü kullanarak bir değişken bildirdiğinizde, Visual Basic .NET çalışma zamanında bu nesnenin olaylarına otomatik olarak bağlanır. Bu nesne için belirli bir olayı işlemek için, Kod görünümündeyken Visual Studio .NET ortamının Sınıf listesini ve Yöntem listesini kullanarak ilgili işleyiciyi ekleyin.
  • AddHandler anahtar sözcüğüyle, Visual Basic .NET olayları işlemek için ikinci bir yol sağlar. AddHandler anahtar sözcüğü ve RemoveHandler anahtar sözcüğü, belirli bir olay için olay işlemeyi dinamik olarak başlatmanıza ve durdurmanıza izin verir.

Visual Basic .NET Automation istemcisini oluşturma

Aşağıdaki adımlarda, Visual Basic .NET kullanılarak geliştirilen bir Otomasyon istemcisinden Excel olaylarını işlemek için her iki yöntemin de nasıl kullanılacağı gösterilmektedir:

  1. Visual Studio .NET 2002 veya Visual Studio .NET 2003'i başlatın. Dosya menüsünde Yeni'ye ve ardından Proje'ye tıklayın. Visual Basic Projeleri'nin altında Windows Uygulaması'yı seçin.

    Varsayılan olarak Form1 oluşturulur.

  2. Microsoft Excel Nesne Kitaplığı'na başvuru ekleyin. Bunu yapmak için şu adımları uygulayın:

    1. Proje menüsünde Başvuru Ekle'ye tıklayın.
    2. COM sekmesinde Microsoft Excel 11.0 Nesne Kitaplığı'nı bulun ve Seç'e tıklayın.
    3. Seçimlerinizi kabul etmek için Başvuru Ekle iletişim kutusunda Tamam'a tıklayın. Seçtiğiniz kitaplıklar için sarmalayıcı oluşturma istemi alırsanız Evet'e tıklayın.
  3. Proje menüsünde Modül Ekle'yi seçin. Şablon listesinde Modül'e tıklayın ve aç'a tıklayın. Aşağıdaki kodu yeni modüle yapıştırın:

       '==================================================================
       'Demonstrates Using a Delegate for Event Handling
       '==================================================================
    
    Private xlApp As Excel.Application
       Private xlBook As Excel.Workbook
       Private xlSheet1 As Excel.Worksheet
       Private xlSheet2 As Excel.Worksheet
       Private xlSheet3 As Excel.Worksheet
       Private EventDel_BeforeBookClose As Excel.AppEvents_WorkbookBeforeCloseEventHandler
       Private EventDel_CellsChange As Excel.DocEvents_ChangeEventHandler
    
    Public Sub UseDelegate()
          'Start Excel and then create a new workbook.
          xlApp = CreateObject("Excel.Application")
          xlBook = xlApp.Workbooks.Add()
          xlBook.Windows(1).Caption = "Uses WithEvents"
    
    'Get references to the three worksheets.
          xlSheet1 = xlBook.Worksheets.Item(1)
          xlSheet2 = xlBook.Worksheets.Item(2)
          xlSheet3 = xlBook.Worksheets.Item(3)
          CType(xlSheet1, Excel._Worksheet).Activate()
    
    'Add an event handler for the WorkbookBeforeClose event of the
          'Application object.
          EventDel_BeforeBookClose = New Excel.AppEvents_WorkbookBeforeCloseEventHandler( _
                AddressOf BeforeBookClose)
          AddHandler xlApp.WorkbookBeforeClose, EventDel_BeforeBookClose
    
    'Add an event handler for the Change event of both Worksheet 
          'objects.
          EventDel_CellsChange = New Excel.DocEvents_ChangeEventHandler( _
                AddressOf CellsChange)
          AddHandler xlSheet1.Change, EventDel_CellsChange
          AddHandler xlSheet2.Change, EventDel_CellsChange
          AddHandler xlSheet3.Change, EventDel_CellsChange
    
    'Make Excel visible and give the user control.
          xlApp.Visible = True
          xlApp.UserControl = True
       End Sub
    
    Private Sub CellsChange(ByVal Target As Excel.Range)
          'This is called when a cell or cells on a worksheet are changed.
          Debug.WriteLine("Delegate: You Changed Cells " + Target.Address + " on " + _
                            Target.Worksheet.Name())
       End Sub
    
    Private Sub BeforeBookClose(ByVal Wb As Excel.Workbook, ByRef Cancel As Boolean)
          'This is called when you choose to close the workbook in Excel.
          'The event handlers are removed and then the workbook is closed 
          'without saving changes.
          Debug.WriteLine("Delegate: Closing the workbook and removing event handlers.")
          RemoveHandler xlSheet1.Change, EventDel_CellsChange
          RemoveHandler xlSheet2.Change, EventDel_CellsChange
          RemoveHandler xlSheet3.Change, EventDel_CellsChange
          RemoveHandler xlApp.WorkbookBeforeClose, EventDel_BeforeBookClose
          Wb.Saved = True 'Set the dirty flag to true so there is no prompt to save.
       End Sub
    
  4. Projeye başka bir modül ekleyin ve ardından modüle aşağıdaki kodu yapıştırın:

       '==================================================================
       'Demonstrates Using WithEvents for Event Handling
       '==================================================================
    
    Private WithEvents xlApp As Excel.Application
       Private xlBook As Excel.Workbook
       Private WithEvents xlSheet1 As Excel.Worksheet
       Private WithEvents xlSheet2 As Excel.Worksheet
       Private WithEvents xlSheet3 As Excel.Worksheet
    
    Public Sub UseWithEvents()
          'Start Excel and then create a new workbook.
          xlApp = CreateObject("Excel.Application")
          xlBook = xlApp.Workbooks.Add()
          xlBook.Windows(1).Caption = "Uses WithEvents"
    
    'Get references to the three worksheets.
          xlSheet1 = xlBook.Worksheets.Item(1)
          xlSheet2 = xlBook.Worksheets.Item(2)
          xlSheet3 = xlBook.Worksheets.Item(3)
          CType(xlSheet1, Excel._Worksheet).Activate()
    
    'Make Excel visible and give the user control.
          xlApp.Visible = True
          xlApp.UserControl = True
       End Sub
    
    Private Sub xlApp_WorkbookBeforeClose(ByVal Wb As Excel.Workbook, _
         ByRef Cancel As Boolean) Handles xlApp.WorkbookBeforeClose
          Debug.WriteLine("WithEvents: Closing the workbook.")
          Wb.Saved = True 'Set the dirty flag to true so there is no prompt to save
       End Sub
    
    Private Sub xlSheet1_Change(ByVal Target As Excel.Range) Handles xlSheet1.Change
          Debug.WriteLine("WithEvents: You Changed Cells " + Target.Address + " on Sheet1")
       End Sub
    
    Private Sub xlSheet2_Change(ByVal Target As Excel.Range) Handles xlSheet2.Change
          Debug.WriteLine("WithEvents: You Changed Cells " + Target.Address + " on Sheet2")
       End Sub
    
    Private Sub xlSheet3_Change(ByVal Target As Excel.Range) Handles xlSheet3.Change
          Debug.WriteLine("WithEvents: You Changed Cells " + Target.Address + " on Sheet3")
       End Sub
    
  5. Hem Module1.vb hem de Module2.vb dosyalarının üst kısmına aşağıdakileri ekleyin:

    Imports Microsoft.Office.Interop
    

    Not Office ad alanının tam adı, çözüme başvuru eklendiğinde Genel Derleme Önbelleği'ne (GAC) kaydedilen Office Birincil Birlikte Çalışma Derlemesi'nin (PIA) sürümüne bağlı olarak farklılık gösterebilir. Bu deyimde bir derleme hata iletisi alırsanız, adı Çözüm Gezgini (Başvurular altında) göründüğü şekilde denetleyin ve ardından adı uygun şekilde değiştirin.

  6. formu Tasarım görünümünde görüntülemek için Çözüm Gezgini Form1.vb'ye çift tıklayın.

  7. Görünüm menüsünde Araç Kutusu'nu seçerek Araç Kutusu'nu görüntüleyin ve ardından Form1'e iki düğme ekleyin. WithEvents'i Kullan yazarak Button1'in Text özelliğini değiştirin. Ardından, Temsilcileri Kullan yazarak Button2'nin Text özelliğini değiştirin.

  8. Görünüm menüsünde Kod'a tıklayarak formun Kod penceresini görüntüleyin. Düğmeler için Click olay işleyicilerine aşağıdaki kodu ekleyin:

    Private Sub Button1_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles Button1.Click
            UseWithEvents()
        End Sub
    
    Private Sub Button2_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles Button2.Click
            UseDelegate()
        End Sub
    

Kodu test edin

  1. Çıkış penceresini görüntülemek için CTRL+ALT+O tuşlarına basın.

  2. Programı derlemek ve çalıştırmak için F5 tuşuna basın.

  3. Formda , WithEvents Kullan'a tıklayın.

    Program Excel'i başlatır ve üç çalışma sayfası içeren bir çalışma kitabı oluşturur.

  4. Bir veya daha fazla çalışma sayfasındaki hücrelere veri ekleyin. Her değişiklik sonrasında ENTER tuşuna basın. Olay işleyicilerinin çağrıldığını doğrulamak için Visual Studio .NET'teki Çıkış penceresini inceleyin.

  5. Excel'den çıkın.

  6. Formda Temsilcileri Kullan'a tıklayın.

    Program yine Excel'i başlatır ve birden çok çalışma sayfası içeren bir çalışma kitabı oluşturur.

  7. Bir veya daha fazla çalışma sayfasındaki hücrelere veri ekleyin. Her değişiklik sonrasında ENTER tuşuna basın. Olay işleyicilerinin çağrıldığını doğrulamak için Visual Studio .NET'teki Çıkış penceresini inceleyin.

  8. Excel'den çıkın ve hata ayıklama oturumunu sonlandırmak için formu kapatın.

Sorun giderme

Kodu test ettiğinizde aşağıdaki hata iletisini alabilirsiniz:

interop.excel.dll'System.InvalidCastException' türünde işlenmeyen bir özel durum oluştu

Ek bilgi: Böyle bir arabirim desteklenmez

Başvurular

Visual Studio .NET ile Microsoft Office geliştirme hakkında ek bilgi için aşağıdaki Microsoft Geliştirici Ağı (MSDN) Web sitesini ziyaret edin:

Visual Studio ile Microsoft Office Geliştirme

Visual Basic .NET'ten Excel'i otomatikleştirme hakkında ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:

302094 NASıL YAPıLıR: Dizileri kullanarak bir aralıktaki verileri doldurmak veya almak için Visual Basic .NET'ten Excel'i otomatikleştirme