如何: 使用 Visual Basic.NET,Excel 處理事件

文章翻譯 文章翻譯
文章編號: 302814 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文將逐步告訴您,如何處理 Excel 中以 Visual Basic.NET 開發的自動化用戶端的事件。

事件處理的概觀

您可以建構事件處理常式使用 Visual Basic.NET 下列的兩種方式,視您要將事件處理常式與事件相關聯的方式:
  • 標準的方式來建立事件處理常式是使用 Handles 關鍵字使用 WithEvents 關鍵字。當您使用 WithEvents 關鍵字來宣告變數時,Visual Basic.NET 自動連接到該物件的事件在執行階段。處理特定的事件,該物件的使用 Visual Studio.NET 的 [類別] 和 [方法] 清單來新增相關的處理常式時您的環境是在 [程式碼] 檢視中。-或者-

  • 使用 AddHandler] 關鍵字 Visual Basic.NET 會提供第二個方法來處理事件。AddHandlerRemoveHandler 可以讓您開始並以動態方式停止特定事件的事件處理。

建立 Visual Basic.NET 自動化用戶端

下列步驟將告訴您,如何使用任一種方法來處理來自以 Visual Basic.NET 開發的自動化用戶端的 Excel 事件。
  1. 啟動 Microsoft Visual Studio.NET。在 [檔案] 功能表上按一下 [新增],然後按一下 [專案]。在 Visual Basic 專案 下, 選取 [Windows 應用程式]。預設會建立 Form1。
  2. 將參考加入至 Microsoft Excel 物件程式庫。要這麼做,請您執行下列步驟:
    1. 在 [專案] 功能表上按一下 [加入參考]。
    2. 在 [COM] 索引標籤,找出 Microsoft Excel 10.0 物件程式庫,然後按一下 [注意: 如果您已經不這樣,Microsoft 建議您下載並安裝組 [Microsoft Office XP 主要 Interop 件 (PIA)。 取得更多資訊有關 Office XP PIA 按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
      328912資訊: Microsoft Office XP PIA 可供下載
    3. 按一下 [[確定] 在 [加入參考] 對話方塊以接受您的選擇。如果接到提示,以產生您所選取的程式庫的包裝函式時,按一下 [是]
  3. 在 [專案] 功能表上, 選取 [加入模組]。選取的範本清單中的 模組,然後按一下 [開啟]。將下列程式碼貼入新的模組中:
       '==================================================================
       '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 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. 將另一個模組新增到該專案,然後貼上下列程式碼模組中:
       '==================================================================
       '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 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
    					
  5. 將下列程式碼加入至 Module1.vb 頂端:
    Imports Microsoft.Office.Interop
    					
  6. 將下列程式碼加入至 Module2.vb 頂端:
    Imports Microsoft.Office.Interop
    					
  7. 在 [方案總管中按兩下 [Form1.vb],以在 [設計] 檢視中顯示表單]。
  8. 在 [檢視] 功能表上選擇 [工具箱],以顯示 [工具箱],然後再將兩個按鈕加入至 Form1。將 Button1] 的 [文字] 屬性變更為 使用 WithEvents,並 使用委派 來變更 Button2] 的 [文字] 屬性。
  9. 在 [檢視] 功能表中上, 選取 [以顯示表單的 [程式碼] 視窗的 程式碼]。將下列程式碼加入 Click 事件處理常式,該按鈕:
    
        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
    					

測試程式碼

  1. 按下 CTRL + ALT + O 以顯示 [輸出] 視窗。
  2. 按下 F5 以建置並執行程式。
  3. 在表單上按一下 [使用 WithEvents。程式啟動 Excel,並且會建立具有三張工作表的活頁簿。
  4. 將任何資料新增到一或多個工作表上的儲存格。在每個變更之後,按下 ENTER 鍵。請檢查以確認稱為事件處理常式的 Visual Studio 中的 [輸出] 視窗。
  5. 請結束 Excel。
  6. 在表單上按一下 [使用代理人。再次,程式啟動 Excel,並建立具有多個工作表的活頁簿。
  7. 將任何資料新增到一或多個工作表上的儲存格。在每個變更之後,按下 ENTER 鍵。請檢查以確認稱為事件處理常式的 Visual Studio 中的 [輸出] 視窗。
  8. 請結束 Excel,然後關閉表單,以結束偵錯工作階段。

疑難排解

當您測試程式碼時,可能會收到下列錯誤訊息:
型別中 interop.excel.dll 'System.InvalidCastException' 發生未處理的例外狀況

其他資訊: 沒有這種支援的介面
如果您收到這個錯誤訊息,請參閱下列文件 「 Microsoft 知識庫 」 中:
316653PRB: 錯誤使用 WithEvents 或委派來處理從 Microsoft Excel 在 Visual Studio.NET 中的事件

?考

如需詳細資訊,請參閱下列 Microsoft 開發人員網路 MSDN 網站:
與 Visual Studio 的 Microsoft Office 程式開發
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
取得更多資訊有關自動化 Excel 從 Visual Basic.NET 按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中 「 文件:
301982HOWTO: 自動化 Microsoft Excel 從 Visual Basic.NET
302094HOWTO: 自動化 Excel 從 Visual Basic.net 填滿或取得使用陣列的範圍中的資料


(保留所有的權限 c) Microsoft Corporation 2001。Joel Alley,Microsoft 公司所佔的比重。

屬性

文章編號: 302814 - 上次校閱: 2007年6月29日 - 版次: 6.2
這篇文章中的資訊適用於:
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Excel 2002 Standard Edition
關鍵字:?
kbmt kbautomation kbhowtomaster KB302814 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:302814
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com