2

我在 Excel 电子表格中有一个表格。假设它有两列“Id”和“Name”。使用 VBA,我想使用工作表上的双击事件来捕获当前行中的“Id”和“Name”。

我使用 Intersect 函数来确定我感兴趣的表中是否发生了双击,但我不知道如何使用表列名访问​​行数据。

IE

Private Sub Worksheet_BeforeDoubleClick(ByVal target As Range, Cancel As Boolean)
   Dim user_rge as Range
   Set user_rge = Me.Worksheets("Data").Range("Users")
   If Not Intersects(user_rge, target) is Nothing Then
        Dim id as Integer
        Dim name as String
        ` What goes in here?
   End
End Sub
4

3 回答 3

2

您可以使用ActiveCell.Row. 对于列,您必须通过将其与源范围进行比较来检查用户是否单击了 ID 或名称。

IE

If ActiveCell.Column = users_rge.Columns(1) Then
   ID = ActiveCell.Value
   Name = ActiveCell.Offset(ColumnOffset:=1).Value
Else
   Name = ActiveCell.Value
   ID = ActiveCell.Offset(ColumnOffset:=-1).Value
End If

注意:我还没有尝试过这段代码,我是根据我的想法写的。

于 2013-02-05T18:32:32.413 回答
1

这就是我做的。在此示例中,“Main”是上面有表格的工作表。表的名称是“TableName”,其中有“columnXXXX”、“columnYYYY”和“columnZZZZ”列

我可能会创建一个名为 TableLookupByRange(tablename, columnname, range) 的辅助函数,您可以在其中传入表的名称、列的名称和包含您想要执行的行中任何位置的单元格的范围抬头。这也会清理代码。

Dim table_lo as ListObject
Dim main_ws as Worksheet
Set main_ws = Me.Worksheets("Main")
Set table_lo = main_ws.ListObjects("TableName")

rownum = target.Row - 1
columnXXXX_colnum = table_lo.ListColumns("columnXXXX").index
columnYYYY_colnum = table_lo.ListColumns("columnYYYY").index
columnZZZZ_colnum = table_lo.ListColumns("columnZZZZ").index

Dim columnXXXX As String
Dim columnYYYY As String
Dim columnZZZZ As Double

columnXXXX = trades_rge.Cells(rownum, columnXXXX_colnum).Value
columnYYYY = UCase(trades_rge.Cells(rownum, columnYYYY_colnum).Value)
columnZZZZ = trades_rge.Cells(rownum, columnZZZZ_colnum).Value
于 2013-02-08T17:09:40.267 回答
-1

试试这个,因为你的代码几乎就在那里:使用Range.Columns 属性将 Target 与 user_range 列 1 和 2 进行比较。

Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal target As Range, Cancel As Boolean)
   Dim id as Integer
   Dim name as String
   Dim user_rge as Range

   Set user_rge = Me.Worksheets("Data").Range("Users")
   If Not Intersects(user_rge, target) is Nothing Then
      Select Case Target.Column
         Case user_rge.Columns(1)
              id = Target.Offset(0,0).Value
              name = Target.Offset(0,1).Value   
         Case user_rge.Columns(2)             
              id = Target.Offset(0,-1).Value
              name = Target.Offset(0,0).Value     
      End Select
   End If
End Sub
于 2013-02-05T18:54:05.670 回答