Vb.Net Excel自动行选择事件

时间:2009-09-25 20:02:44

标签: .net excel automation

在VB.Net Windows应用程序中,我通过早期绑定创建一个Excel对象,并使用从SQL返回的行填充电子表格。

目的是允许用户从电子表格中选择1行或更多行,捕获select事件,然后从所选行中检索所有数据以供进一步处理。我知道如果我使用SQL数据填充datagridview但用户坚持使用Excel会很简单。

虽然我已经搜索过,但我无法发现是否可以在.Net中捕获选择事件。

如果有可能,请告诉我如何或给我一个关于这个主题的好文章的链接。如果没有,请告诉我。

谢谢!


感谢破败,迈克。我会做更多的研究,因为我有一个良好的基础开始。我的用户将在电子表格中做各种事情:1)选择行进行进一步处理(路由操作);可能是非连续的2)如果操作未出现在输入中(未路由操作),则添加行,然后选择它们。 3)可能添加列数据(我想限制此功能,但用户是老板....)

我会试验,但你能告诉我如何区分行选择和列选择;即我要回应的选择变更和我不回应的选择变更?

1 个答案:

答案 0 :(得分:4)

您正在寻找“SelectionChange”活动。有三个相关事件:Worksheet.SelectionChangeWorkbook.SheetSelectionChangeApplication.SheetSelectionChange

我认为,出于您的目的,使用Worksheet.SelectionChange可能是您想要的,因为您已经知道您感兴趣的哪个工作表,但这是一个使用所有三个作为示例的示例:

Public Class ExcelEventHandlingClass
    Dim WithEvents xlApp As Excel.Application
    Dim WithEvents myWorkbook As Excel.Workbook
    Dim WithEvents myWorksheet As Excel.Worksheet

    Sub New()
        xlApp = New Excel.Application
        xlApp.Visible = True

        myWorkbook = xlApp.Workbooks.Add
        myWorksheet = CType(myWorkbook.Worksheets.Add, Excel.Worksheet)
    End Sub

    Private Sub xlApp_SheetSelectionChange( _
        ByVal Sh As Object, _
        ByVal Target As Excel.Range) _
        Handles xlApp.SheetSelectionChange

        MessageBox.Show( _
            "xlApp_SheetSelectionChange: " & _
            Target.Address(External:=True) & " was selected")
    End Sub

    Private Sub myWorkbook_SheetSelectionChange( _
        ByVal Sh As Object, _
        ByVal Target As Excel.Range) _
        Handles myWorkbook.SheetSelectionChange

        MessageBox.Show( _
            "myWorkbook_SheetSelectionChange: " & _
            Target.Address(External:=True) & " was selected")
    End Sub

    Private Sub myWorksheet_SelectionChange( _
        ByVal Target As Excel.Range) _
        Handles myWorksheet.SelectionChange

        MessageBox.Show( _
            "myWorksheet_SelectionChange: " & _
            Target.Address(External:=True) & " was selected")
    End Sub
End Class

您可以按如下方式运行上述内容:

Dim o As ExcelEventHandlingClass

Private Sub StartExample()
    o = New ExcelEventHandlingClass
End Sub

在此示例中,如果更改活动工作表上的选择,则会触发所有三个事件处理程序,并且您将获得3个消息框。这有点烦人,哈哈,但它证明了重点。

当然,您不必使用WithEvents来连接事件处理程序,而是可以使用AddHandler:

AddHandler xlApp.SheetSelectionChange, AddressOf xlApp_SheetSelectionChange
AddHandler myWorkbook.SheetSelectionChange, AddressOf myWorkbook_SheetSelectionChange
AddHandler myWorksheet.SelectionChange, AddressOf myWorksheet_SelectionChange

调用处理程序后,它可以使用自动化提取值。您可以使用Range.Value属性从单个单元格中获取值,或从多单元格范围返回2维值范围。当然,根据选择,你可以再次运行SQL,一旦你知道你想要哪一行,但我只是想我会指出你可以直接提取单元格值。

希望这有帮助!

麦克

编辑:更新到Melody的回复

  

“非常感谢你的帮助,迈克!”

没问题。 : - )

  

“我需要深入了解细节   Target.Address(外部:= True)   位。我假设目标包含信息   什么被选中?你能提供吗?   更多信息?它是否封装了一行   行的数量或数量   选择?它是否包含索引或   可用于获取的item属性   在列值?是吗?   外部=真正的论点只是这样说   来自非托管代码,或者是   我的假设不正确?“

这只是一个示例,说明如何报告所选范围的地址。让我们看一下Worksheet.SelectionChange事件处理程序的方法签名:

Private Sub myWorksheet_SelectionChange( _
    ByVal Target As Excel.Range) _
    Handles myWorksheet.SelectionChange

   ' Your code goes here...

End Sub

该事件有一个参数,即Target As Excel.Range参数。 (Application.SheetSelectionChangeWorkbook.SheetSelectionChange事件有第二个参数说明选择更改发生在哪个工作表上,但在Worksheet.Selection更改事件的情况下,我们已经知道选择更改发生在哪个工作表上,所以省略了参数。)

关键是你可以利用Target As Excel.Range参数来确定你想要的东西。获取本地地址,包括范围地址,但不包括工作表地址(例如“A1:C3”):

Dim localAddress As String = Target.Address

获取完整路径地址(例如“[Book1.xls] Sheet1!A1:C3”):

Dim localAddress As String = Target.Address(External:=True)

获取所选行数:

Dim numRows As Integer = Target.Rows.Count

要获取工作表上的行索引(请记住:Excel工作表使用Base 1寻址!)作为范围的第一行:

Dim topRowIndex As Integer = Target.Row

获取最后一行的行索引:

Dim lastRowIndex As Integer = Target.Rows(Target.Rows.Count).Row

这些只是一些例子。您必须使用Excel VBA帮助文件(或Google)来获取有关Range类成员的更多信息。

  

由于假期我可能无法做到   马上回应你,但我是   感谢你的帮助。

散漫。开玩笑,周末愉快。 : - )