【问题标题】:How do you get current row and access columns using VBA in Excel?如何在 Excel 中使用 VBA 获取当前行和访问列?
【发布时间】:2013-02-05 18:22:06
【问题描述】:

我在 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

【问题讨论】:

  • 这不是一张桌子。它是一个命名范围。
  • 这是一张桌子。如果我在工作表中选择一个单元格,我可以访问所有表格工具。我还可以使用 Users[Id] 等来引用表中的其他列...

标签: excel vba


【解决方案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

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

【讨论】:

    【解决方案2】:

    这就是我想做的事情。在此示例中,“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
    

    【讨论】:

      【解决方案3】:

      在您的代码即将完成时尝试此操作:使用 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
      

      【讨论】:

      • 如果你看这个问题,我试图避免不得不避免使用固定的列号引用。我想使用如下代码: Dim id as Int id = GetTableData("Users", "Id", target) 其中 target 是行中的任何单元格。
      猜你喜欢
      • 2013-09-29
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      相关资源
      最近更新 更多