-1

私は12列x26行のテーブルを持っており、名前はランダムにセルに入力されます。これらの名前のリストを、テーブルに入力されている順序で生成したいと思います。

何か案は?

4

1 に答える 1

1

あなたは本当にあなたがリストなどを望む場所を指定しなかったので、私はそれでいくつかの自由を取りました。

コードは次のことを監視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
于 2013-03-05T23:41:48.857 に答える