Zpracování událostí pro Excel pomocí jazyka Visual Basic .NET

Souhrn

Tento podrobný článek popisuje, jak zpracovávat události aplikace Microsoft Office Excel 2003 a Microsoft Office Excel 2007 z klienta automation, který vyvíjíte pomocí jazyka Visual Basic .NET.

Vytvoření obslužné rutiny události

Obslužnou rutinu události můžete vytvořit pomocí microsoft Visual Basic .NET 2003 nebo Visual Basic .NET 2002 v některém z následujících způsobů. Způsob vytvoření obslužné rutiny události pomocí jazyka Visual Basic .NET závisí na tom, jak chcete přidružit obslužnou rutinu události k událostem:

  • Obvykle vytvoříte obslužnou rutinu události pomocí Handles klíčové slovo with The WithEvents klíčové slovo. Když deklarujete proměnnou pomocí klíčového slova WithEvents, visual Basic .NET se automaticky připojí k událostem daného objektu za běhu. Pokud chcete zpracovat konkrétní událost pro tento objekt, přidejte příslušnou obslužnou rutinu pomocí seznamu tříd a seznamu metod prostředí Visual Studio .NET, když jste v zobrazení kódu.
  • S AddHandler klíčové slovo, Visual Basic .NET poskytuje druhý způsob zpracování událostí. Klíčové slovo AddHandler a klíčové slovo RemoveHandler umožňují dynamicky spustit a zastavit zpracování událostí pro konkrétní událost.

Vytvoření klienta automatizace .NET jazyka Visual Basic

Následující kroky ukazují, jak použít kterýkoli způsob zpracování událostí aplikace Excel z klienta služby Automation, který je vyvinut pomocí jazyka Visual Basic .NET:

  1. Spusťte Visual Studio .NET 2002 nebo Visual Studio .NET 2003. V nabídce Soubor klikněte na Nový a potom klikněte na Project. V části Projekty v jazyce Visual Basic vyberte aplikaci systému Windows.

    Ve výchozím nastavení je vytvořen Formulář1.

  2. Přidejte odkaz na knihovnu objektů aplikace Microsoft Excel. Postupujte takto:

    1. V nabídce Projekt klikněte na Přidat odkaz.
    2. Na kartě COM vyhledejte Microsoft Excel 11.0 Object Library a potom klepněte na tlačítko Vybrat.
    3. Kliknutím na tlačítko OK v dialogovém okně Přidat odkazy potvrďte výběry. Pokud se zobrazí výzva k vygenerování obálek pro vybrané knihovny, klikněte na tlačítko Ano.
  3. V nabídce Projekt vyberte Přidat modul. V seznamu šablon vyberte Modul a potom klikněte na Otevřít. Do nového modulu vložte následující kód:

       '==================================================================
       '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. Přidejte do projektu další modul a vložte do modulu následující kód:

       '==================================================================
       '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. Na začátek modulů Module1.vb a Module2.vb přidejte následující položky:

    Imports Microsoft.Office.Interop
    

    Poznámka Přesný název oboru názvů Office se může lišit v závislosti na verzi primárního definičního sestavení (PIA), která je zaregistrovaná v globální mezipaměti sestavení (GAC) při přidání odkazu do řešení. Pokud se u tohoto příkazu zobrazí chybová zpráva sestavení, zkontrolujte název, který se zobrazí v Průzkumník řešení (v části Odkazy), a podle potřeby změňte název.

  6. V Průzkumník řešení poklikáte na soubor Form1.vb, aby se formulář zobrazil v návrhovém zobrazení.

  7. V nabídce Zobrazení vyberte sadu nástrojů , aby se zobrazila sada nástrojů, a pak přidejte dvě tlačítka do Form1. Změňte vlastnost Text tlačítka Button1 zadáním příkazu Use WithEvents. Potom změňte vlastnost Text tlačítka Button2 zadáním příkazu Použít delegáty.

  8. V nabídce Zobrazení vyberte Kód , aby se zobrazilo okno Kód pro formulář. Do obslužných rutin událostí Click pro tlačítka přidejte následující kód:

    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
    

Testování kódu

  1. Stisknutím kombinace kláves CTRL+ALT+O zobrazte okno Výstup.

  2. Stisknutím klávesy F5 sestavte a spusťte program.

  3. Ve formuláři klepněte na tlačítko Použít WithEvents.

    Aplikace spustí aplikaci Excel a vytvoří sešit se třemi listy.

  4. Přidejte všechna data do buněk na jednom nebo více listech. Po každé změně stiskněte klávesu ENTER. Zkontrolujte okno Výstup v sadě Visual Studio .NET a ověřte, že jsou volány obslužné rutiny událostí.

  5. Ukončete Excel.

  6. Ve formuláři klepněte na tlačítko Použít delegáty.

    Aplikace znovu spustí aplikaci Excel a vytvoří sešit s více listy.

  7. Přidejte všechna data do buněk na jednom nebo více listech. Po každé změně stiskněte klávesu ENTER. Zkontrolujte okno Výstup v sadě Visual Studio .NET a ověřte, že jsou volány obslužné rutiny událostí.

  8. Ukončete Excel a zavřete formulář, aby se ukončila ladicí relace.

Řešení problémů

Při testování kódu se může zobrazit následující chybová zpráva:

V interop.excel.dlldošlo k neošetřené výjimce typu System.InvalidCastException

Další informace: Takové rozhraní není podporováno.

Odkazy

Další informace o vývoji pro Microsoft Office pomocí sady Visual Studio .NET naleznete na následujícím webu Microsoft Developer Network (MSDN):

Vývoj pro Microsoft Office pomocí sady Visual Studio

Další informace o automatizaci aplikace Excel z jazyka Visual Basic .NET klepněte na následující číslo článku databáze Microsoft Knowledge Base:

302094 POSTUPY: Automatizace aplikace Excel z jazyka Visual Basic .NET k vyplnění nebo získání dat v oblasti pomocí polí