2

Excel スプレッドシートにテーブルがあります。「ID」と「名前」の2つの列があるとします。VBA を使用して、ワークシートのダブルクリック イベントを使用して、現在の行の「ID」と「名前」を取得したいと考えています。

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
4

3 に答える 3

2

を使用して行を取得できます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

注:私はこのコードを試していません。私が念頭に置いていることからこれを書いています。

于 2013-02-05T18:32:32.413 に答える
1

これが私がやったことです。この例では、「メイン」はテーブルを含むワークシートです。テーブルの名前は「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 に答える