我在Excel电子表格中有一个表格。假设它有两列“Id”和“Name”。使用VBA,我想在工作表上使用双击事件来捕获当前行中的“Id”和“Name”。
我使用Intersect函数来确定是否在我感兴趣的表中发生了双击,但我不知道如何使用表列名访问行数据。
即
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
答案 0 :(得分:1)
您可以使用ActiveCell.Row
获取行。对于列,您必须通过将其与源范围进行比较来检查用户是否单击了ID或名称。
即
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
注意:我没有尝试过这段代码,而是根据我的想法写出来。
答案 1 :(得分: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
答案 2 :(得分:-1)
请尝试使用您的代码:使用Range.Columns Property将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