Сортировка столбца двойным щелчком - это смешивание порядка - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть данные, которые показывают Имя в столбце, а затем другие цифры в других столбцах. Когда я дважды щелкаю ячейку заголовка, она сортирует столбец в порядке убывания. Это работает, но тогда все имена больше не соответствуют его значению, и я не могу понять, почему.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim KeyRange As Range
Dim ColumnCount As Integer
Dim lrow As Long

lrow = Sheets("Tracker").Cells(Rows.Count, "B").End(xlUp).Row

On Error Resume Next

    ColumnCount = Range("B5:Q" & lrow).Columns.Count
        Cancel = False
    If Target.Row = 5 And Target.Column <= ColumnCount Then
        Cancel = True
        Worksheets("Backend").Range("C1") = Target.Value

        Set KeyRange = Range(Target.Address)

        Range("B5:Q" & lrow).sort Key1:=KeyRange, Header:=xlYes, Order1:=xlDescending
        Worksheets("Backend").Range("A1") = Target.Column
        Worksheets("Backend").Calculate
            For i = 1 To ColumnCount
            Range("B5:Q" & lrow).Cells(1, i).Value = Worksheets("Backend").Range("A4").Offset(0, i - 1).Value
            Next i
    End If

On Error GoTo 0

End Sub

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Проблема была не с кодом, а с формулами в таблице. См .: https://answers.microsoft.com/en-us/msoffice/forum/all/index-match-breaks-when-sorting/c848e231-9e53-4a8d-a5f6-f4bf1b9f0a12

1 голос
/ 06 апреля 2020

Вы не включили столбец имен в диапазон для сортировки.

У вас есть

Range("B5:Q" & lrow).sort Key1:=KeyRange, Header:=xlYes, Order1:=xlDescending

Но это должно быть

Range("A5:Q" & lrow).sort Key1:=KeyRange, Header:=xlYes, Order1:=xlDescending


Редактировать 1:

Поскольку имена в столбце B, а не A, как я предполагал, возможно, множественная сортировка применяется друг к другу. Чтобы исключить эту вероятность, попробуйте выполнить сортировку с использованием объекта листа вместо объекта диапазона (после очистки старой сортировки).

Вот как

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    Dim KeyRange As Range
    Dim ColumnCount As Integer
    Dim lrow As Long

    lrow = Sheets("Tracker").Cells(Rows.Count, "B").End(xlUp).Row

    On Error Resume Next

    ColumnCount = Range("B5:Q" & lrow).Columns.Count
    Cancel = False
    If Target.Row = 5 And Target.Column <= ColumnCount Then
        Cancel = True

        Worksheets("Backend").Range("C1") = Target.Value

        With Me
            .Sort.SortFields.Clear
            .SortFields.Add2 Key:=Target, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
            .Sort.SetRange .Range("B5:Q" & lrow)
            .Sort.Header = xlYes
            .Sort.MatchCase = False
            .Sort.Orientation = xlTopToBottom
            .Sort.SortMethod = xlPinYin
            .Sort.Apply
        End With


        With Worksheets("Backend")
            .Range("A1") = Target.Column
            .Calculate
            For i = 1 To ColumnCount
                Range("B5:Q" & lrow).Cells(1, i).Value = .Range("A4").Offset(0, i - 1).Value
            Next i
        End With

    End If

    On Error GoTo 0

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...