如何: 使用 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 自动化客户端

以下步骤演示了如何使用这两种方法来处理 Excel 从 Visual Basic.net 开发的自动化客户端的事件。
  1. 启动 Microsoft Visual Studio.net。在 文件 菜单上单击 新建,然后单击 项目。在 Visual Basic 项目,下选择 Windows 应用程序。默认情况下创建 Form1。
  2. 添加到 Microsoft Excel 对象库 的引用。若要这样做,请按照下列步骤操作:
    1. 项目 菜单上单击 添加引用
    2. COM 选项卡上找到 Microsoft Excel 10.0 对象库,然后单击 选择: 如果您有没有执行这一操作,Microsoft 建议您下载并安装所 Microsoft Office XP 的主互操作程序集 (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 中添加两个按钮。要 使用 WithEvents,更改 Button1文本 属性,然后更改以 使用代理Button2文本 属性。
  9. 视图 菜单上选择 代码 以显示窗体的代码窗口。下面的代码添加到 单击 事件处理程序的按钮:
    
        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,然后关闭该窗体以结束调试会话。

故障排除

当测试代码时,您可能会收到以下错误消息:
类型 System.InvalidCastException interop.excel.dll 中发生的未处理的异常

其他信息: 没有此类支持的界面
如果您收到此错误,请参阅 Microsoft 知识库中下面的文章:
316653使用 WithEvents 或委托处理事件从 Microsoft Excel 中可视 Studio.NET PRB: 错误

参考

有关详细的信息,请参阅下面的 Microsoft 开发人员网络 (MSDN) Web 站点:
与 Visual Studio 的 Microsoft Office 开发
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
有关使 Visual Basic.net 中的 Excel 的自动化的其他信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
301982HOWTO: 自动完成 Microsoft Excel 从 Visual Basic.net
302094HOWTO: 自动化 Excel 从 Visual Basic.net 填充或获取在使用数组为区域的数据


(c) Microsoft 公司 2001,保留的所有权限。由 Joel 场,Microsoft 公司的贡献。

属性

文章编号: 302814 - 最后修改: 2007年6月29日 - 修订: 6.2
这篇文章中的信息适用于:
  • Microsoft Visual .NET 2002 标准版
  • Microsoft Excel 2002 标准版
关键字:?
kbmt kbautomation kbhowtomaster KB302814 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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