私は12列x26行のテーブルを持っており、名前はランダムにセルに入力されます。これらの名前のリストを、テーブルに入力されている順序で生成したいと思います。
何か案は?
あなたは本当にあなたがリストなどを望む場所を指定しなかったので、私はそれでいくつかの自由を取りました。
コードは次のことを監視Range(A1:L26)
して実行します
テキストが追加されると、そのアイテムがリスト(列NおよびM)に追加されます。
そのセル内の値が後で変更されると、最初のリスト項目が更新されます。
値がクリアされると、リストアイテムが削除され、残りのリストアイテムが1つ上にシフトします。
次のコードをワークシートモジュールにコピーします(例:シート1でアクティブにする場合はSheet1)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Row As Integer
Dim List As Range
Set List = Range("N1")
If Not Intersect(Target, Range("A1:L26")) Is Nothing Then
Row = 0
Do
If List.Offset(RowOFfset:=Row).Value = "" Then
' End of list or empty list, add item to list
List.Offset(RowOFfset:=Row).Value = Target.Address
List.Offset(RowOFfset:=Row, ColumnOffset:=1).Value = Target.Value
Exit Do
Else
If List.Offset(RowOFfset:=Row).Value = Target.Address Then
' Target has been added already
If Target.Value = "" Then
' Target has been cleared, remove the item from the list and shift list up
Range(List.Offset(RowOFfset:=Row), List.Offset(RowOFfset:=Row, ColumnOffset:=1)).Delete xlShiftUp
Else
' Target has changed, update the list item (in place)
List.Offset(RowOFfset:=Row, ColumnOffset:=1).Value = Target.Value
End If
Exit Do
Else
Row = Row + 1
End If
End If
Loop
Else
' Invalid Target
End If
End Sub
アップデート
うまくいけばあなたが望むことをするようにコードを変更しました。「2列おき」に少し戸惑いましたので、B、E、H、Kの列を意味しているといいのですが…。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Row As Integer
Dim List As Range
Dim Column As Integer
Set List = ThisWorkbook.Worksheets("Sheet2").Range("A1")
If Target.Cells.Count > 1 Then Exit Sub
Column = Target.Column
' This is used to determine if the column is one we are looking for
' eg: 2-3 = -1, 5-3-3 = -1, 8-3-3-3 = -1 etc
Do
Column = Column - 3
If Column <= 0 Then Exit Do
Loop
If Column = -1 Then
If Target.Row > 2 And Target.Row < 27 Then
' Target Match
Row = 0
Do
If List.Offset(RowOffset:=Row).Value = "" Then
' End of list or empty list, add item to list
List.Offset(RowOffset:=Row).Value = Target.Address
List.Offset(RowOffset:=Row, ColumnOffset:=1).Value = Target.Value
List.Offset(RowOffset:=Row, ColumnOffset:=2).Value = Cells(2, Target.Column).Value
Exit Do
Else
If List.Offset(RowOffset:=Row).Value = Target.Address Then
' Target has been added already
If Target.Value = "" Then
' Target has been cleared, remove the item from the list and shift list up
Range(List.Offset(RowOffset:=Row), List.Offset(RowOffset:=Row, ColumnOffset:=2)).Delete xlShiftUp
Else
' Target has changed, update the list item (in place)
List.Offset(RowOffset:=Row, ColumnOffset:=1).Value = Target.Value
End If
Exit Do
Else
Row = Row + 1
End If
End If
Loop
Else
' Target Column, Non-Target Row
End If
Else
' Non-Target Column
End If
End Sub