Vb.Net Excel自动化行select事件

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

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

尽pipe我已经search了,但是我还没有能够发现是否可以在.Net中捕获select事件。

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

谢谢!


迈克,谢谢你的失败。 我会做更多的研究,现在我有一个很好的基础。 我的用户将在电子表格中做各种事情:1)select行进行进一步处理(路由操作); 可能是非连续的2)如果操作没有出现在input中(未路由的操作),然后select它们,添加行。 3)可能添加列数据(我想限制这个function,但用户是老板….)

我会尝试,但你能告诉我如何区分行select和列select; 即我想回应的select变化和我不?

您正在寻找“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 

在这个例子中,如果你改变活动工作表上的select,那么所有三个事件处理程序都会触发,并且你会得到3个消息框。 这有点烦人,大声笑,但它certificate了一点。

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

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

一旦你的处理程序被调用,它可以使用自动化提取值。 您可以使用Range.Value属性来获取单个单元格的值,或者从多单元格范围返回2维范围的值。 当然,只要基于select知道了哪个行,就可以再次运行SQL,但是我只是想指出可以直接提取单元格值。

希望这可以帮助!

麦克风

编辑:更新到旋律的回复

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

没问题。 🙂

“我需要深入了解Target.Address(External:= True)的内容,我假定目标包含了所选内容的信息,可以提供更多的信息吗?是否封装了行号或数字是否select了行?是否包含可用于获取列值的索引或项目属性?External = True参数是否说这是来自非托pipe代码,还是我的假设是错误的?

这只是一个例子,显示如何报告所选范围的地址。 我们来看看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事件具有第二个参数,说明在哪个工作表上发生了select更改,但是在Worksheet.Selection更改事件的情况下,我们已经知道在哪个工作表上发生了select更改,因此省略参数。)

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

 Dim localAddress As String = Target.Address 

要获得完整path地址(例如“[Book1.xls] Sheet1!A1:C3”):

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

要获得所选的行数:

 Dim numRows As Integer = Target.Rows.Count 

要获取工作表上的行索引(请记住:Excel工作室使用基本1编址!)的范围的顶行:

 Dim topRowIndex As Integer = Target.Row 

要获取最后一行的行索引:

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

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

由于假期我可能无法立即回复你,但我很感激你的帮助。

懒鬼。 开个玩笑,祝你周末愉快。 🙂