Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Sammanfattning
Den här stegvisa artikeln beskriver hur du hanterar Microsoft Office Excel 2003- och Microsoft Office Excel 2007-händelser från en Automation-klient som du utvecklar med hjälp av Visual Basic .NET.
Skapa en händelsehanterare
Du kan skapa en händelsehanterare med Microsoft Visual Basic .NET 2003 eller med Visual Basic .NET 2002 på något av följande sätt. Hur du skapar en händelsehanterare med Visual Basic .NET beror på hur du vill associera händelsehanteraren med händelser:
- Vanligtvis skapar du en händelsehanterare med nyckelordet Handles med nyckelordet WithEvents. När du deklarerar en variabel med hjälp av nyckelordet WithEvents ansluter Visual Basic .NET automatiskt till händelserna för objektet vid körning. Om du vill hantera en specifik händelse för objektet lägger du till relevant hanterare med hjälp av klasslistan och metodlistan för Visual Studio .NET-miljön när du är i kodvyn.
- Med nyckelordet AddHandler tillhandahåller Visual Basic .NET ett andra sätt att hantera händelser. Med nyckelordet AddHandler och nyckelordet RemoveHandler kan du starta och stoppa händelsehanteringen för en viss händelse dynamiskt.
Skapa Visual Basic .NET Automation-klienten
Följande steg visar hur du använder båda sätten för att hantera Excel-händelser från en Automation-klient som har utvecklats med hjälp av Visual Basic .NET:
Starta Visual Studio .NET 2002 eller Visual Studio .NET 2003. På Arkiv-menyn klickar du på Ny och sedan på Projekt. Under Visual Basic Projects väljer du Windows-program.
Som standard skapas Form1.
Lägg till en referens till Microsoft Excel-objektbiblioteket. Gör så här:
- Klicka på Lägg till referens på Projekt-menyn.
- På fliken COM letar du upp Microsoft Excel 11.0-objektbiblioteket och klickar sedan på Välj.
- Klicka på OK i dialogrutan Lägg till referenser för att acceptera dina val. Om du får en uppmaning om att generera omslutningar för de bibliotek som du har valt klickar du på Ja.
På projektmenyn väljer du Lägg till modul. I listan över mallar väljer du Modul och klickar sedan på Öppna. Klistra in följande kod i den nya modulen:
'================================================================== '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
Lägg till ytterligare en modul i projektet och klistra sedan in följande kod i modulen:
'================================================================== '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
Lägg till följande överst i både Module1.vb och Module2.vb:
Imports Microsoft.Office.Interop
Observera Det exakta namnet på Office-namnområdet kan variera beroende på vilken version av Office Primary Interop Assembly (PIA) som är registrerad i den globala sammansättningscachen (GAC) när referensen läggs till i lösningen. Om du får ett build-felmeddelande för den här instruktionen kontrollerar du namnet som det visas i Solution Explorer (under Referenser) och ändrar sedan namnet efter behov.
I Solution Explorer dubbelklickar du på Form1.vb för att visa formuläret i designvyn.
På menyn Visa väljer du Verktygslåda för att visa verktygslådan och lägger sedan till två knappar i Formulär1. Ändra egenskapen Text för Button1 genom att skriva Använd WithEvents. Ändra sedan egenskapen Text för Button2 genom att skriva Använd ombud.
På menyn Visa väljer du Kod för att visa formulärets kodfönster. Lägg till följande kod i Klicka på händelsehanterare för knapparna:
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
Testa koden
Tryck på CTRL+ALT+O för att visa fönstret Utdata.
Tryck på F5 för att skapa och köra programmet.
Klicka på Använd WithEvents i formuläret.
Programmet startar Excel och skapar sedan en arbetsbok med tre kalkylblad.
Lägg till data i celler i ett eller flera kalkylblad. Tryck på RETUR efter varje ändring. Granska fönstret Utdata i Visual Studio .NET för att kontrollera att händelsehanterarna anropas.
Avsluta Excel.
Klicka på Använd ombud i formuläret.
Återigen startar programmet Excel och skapar sedan en arbetsbok med flera kalkylblad.
Lägg till data i celler i ett eller flera kalkylblad. Tryck på RETUR efter varje ändring. Granska fönstret Utdata i Visual Studio .NET för att kontrollera att händelsehanterarna anropas.
Avsluta Excel och stäng sedan formuläret för att avsluta felsökningssessionen.
Felsökning
När du testar koden kan du få följande felmeddelande:
Ett ohanterat undantag av typen "System.InvalidCastException" inträffade i interop.excel.dll
Ytterligare information: Inget sådant gränssnitt stöds
Referenser
Mer information om Microsoft Office-utveckling med Visual Studio .NET finns på följande webbplats för Microsoft Developer Network (MSDN):
Microsoft Office-utveckling med Visual Studio
Om du vill ha mer information om hur du automatiserar Excel från Visual Basic .NET klickar du på följande artikelnummer för att visa artikeln i Microsoft Knowledge Base:
302094 HOWTO: Automatisera Excel från Visual Basic .NET för att fylla i eller hämta data i ett intervall med hjälp av matriser