Командная кнопка “Запуск сортировки дел”

Вопрос или проблема

Я хочу отсортировать поле данных по трём разным столбцам: C, G и H. C – номер волокна от 1 до 864, G – расстояние в футах, H – это столбец статуса, и я хотел бы, чтобы статус “Live” был сверху. Но я ещё не смог продвинуться дальше вызова метода CommandButton2. Он выдает ошибку на

CommandButton.OnAction = "SortData()",

Я пробовал сделать SortData как Public Sub, пробовал просто “SortData” без (). Есть идеи?

    Sub CommandButton2_Click()
    Dim CommandButton As Shape
    Dim SortCriteria As Variant

    SortCriteria = Array("Fiber", "Distance", "Stat")

    ' Убедитесь, что кнопка правильно идентифицирована
    On Error Resume Next
    Set CommandButton = ActiveSheet.Shapes("CommandButton2")
    On Error GoTo 0

    If CommandButton Is Nothing Then
        MsgBox "CommandButton2 не найден на активном листе.", vbCritical
        Exit Sub
    End If

    With CommandButton.OLEFormat.Object.Object
        .Caption = SortCriteria(0)
        '.LinkedCell = "" ' Очистите связанную ячейку, если необходимо
    End With

    ' Назначьте макрос кнопке, используя AssignMacro
    CommandButton.OnAction = "SortData()"
End Sub

Sub SortData()
    Dim SortColumn As Integer
    Dim SortOrder As XlSortOrder
    Dim lastRow As Long
    Dim CommandButton As Shape

    ' Убедитесь, что кнопка правильно идентифицирована
    On Error Resume Next
    Set CommandButton = ActiveSheet.Shapes("CommandButton2")
    On Error GoTo 0

    If CommandButton Is Nothing Then
        MsgBox "CommandButton2 не найден на активном листе.", vbCritical
        Exit Sub
    End If

    lastRow = Range("A3:Q1000").Find(What:="*", SearchOrder:=xlFormulas, SearchDirection:=xlPrevious).Row

    With Range("A3:Q" & lastRow)
        .Sort.SortFields.Clear
        .Sort.SortFields.Add Key:=.Columns(3), _
            SortOn:=xlSortOnValues, Order:=xlAscending, _
            DataOption:=xlSortNormal
        .Sort.SortFields.Add Key:=.Columns(7), _
            SortOn:=xlSortOnValues, Order:=xlAscending, _
            DataOption:=xlSortNormal
        .Sort.SortFields.Add Key:=.Columns(8), _
            SortOn:=xlSortOnValues, Order:=xlAscending, _
            DataOption:=xlSortNormal
        .Sort.Header = xlYes
        .Sort.MatchCase = False
        .Sort.Orientation = xlTopToBottom
        .Sort.SortMethod = xlPinYin
        .Sort.Apply
    End With

    With CommandButton.OLEFormat.Object.Object
        Select Case .Value
            Case 1
                .Sort.SortFields(1).Order = xlDescending
                .Sort.Apply
            Case 2
                .Sort.SortFields(2).Order = xlDescending
                .Sort.Apply
            Case 3
                .Sort.SortFields(3).Order = xlDescending
                .Sort.Apply
        End Select
    End With
End Sub

Ответ или решение

Полное решение проблемы сортировки данных с помощью CommandButton

Ваша задача – сортировать данные по трем колонкам (C, G и H) при нажатии кнопки CommandButton. Вы хотите, чтобы статус "Live" находился сверху, а последующие записи сортировались по номерам волокон и расстоянию. Ниже представлен исправленный и полный код, который поможет решить вашу задачу.

Исправленная версия кода:

Sub CommandButton2_Click()
    Dim CommandButton As Shape
    Dim SortCriteria As Variant

    SortCriteria = Array("Сортировать данные", "Distance", "Статус")

    ' Убедитесь, что кнопка правильно определена
    On Error Resume Next
    Set CommandButton = ActiveSheet.Shapes("CommandButton2")
    On Error GoTo 0

    If CommandButton Is Nothing Then
        MsgBox "Кнопка CommandButton2 не найдена на активации листа.", vbCritical
        Exit Sub
    End If

    With CommandButton.OLEFormat.Object.Object
        .Caption = SortCriteria(0)
        '.LinkedCell = "" ' Очистить связанный адрес ячейки, если необходимо
    End With

    ' Присваиваем макрос кнопке через AssignMacro
    CommandButton.OnAction = "SortData"
End Sub

Sub SortData()
    Dim lastRow As Long
    Dim CommandButton As Shape

    ' Убедитесь, что кнопка правильно определена
    On Error Resume Next
    Set CommandButton = ActiveSheet.Shapes("CommandButton2")
    On Error GoTo 0

    If CommandButton Is Nothing Then
        MsgBox "Кнопка CommandButton2 не найдена на активации листа.", vbCritical
        Exit Sub
    End If

    lastRow = Range("A3:Q1000").Find(What:="*", SearchOrder:=xlFormulas, SearchDirection:=xlPrevious).Row

    ' Сортировка данных по нескольким колонкам
    With Range("A3:Q" & lastRow)
        .Sort.SortFields.Clear

        ' Переместить все "Live" статус наверх (по статусу H)
        .Sort.SortFields.Add Key:=.Columns(8), _
            SortOn:=xlSortOnValues, Order:=xlDescending, _  ' Поменяйте на xlAscending, если "Live" первенство
            DataOption:=xlSortNormal

        ' Сортировка по номеру волокна C
        .Sort.SortFields.Add Key:=.Columns(3), _
            SortOn:=xlSortOnValues, Order:=xlAscending, _
            DataOption:=xlSortNormal

        ' Сортировка по расстоянию G
        .Sort.SortFields.Add Key:=.Columns(7), _
            SortOn:=xlSortOnValues, Order:=xlAscending, _
            DataOption:=xlSortNormal

        .Sort.Header = xlYes
        .Sort.MatchCase = False
        .Sort.Orientation = xlTopToBottom
        .Sort.SortMethod = xlPinYin
        .Sort.Apply
    End With
End Sub

Объяснение кода:

  1. CommandButton2_Click:

    • Этот метод устанавливает действие для кнопки CommandButton.
    • Он обновляет заголовок кнопки и связывает с ней макрос SortData.
  2. SortData:

    • Этот метод выполняет фактическую сортировку данных.
    • Сначала он определяет последнюю строку с данными.
    • Затем очищает предыдущие параметры сортировки и устанавливает новые: сначала сортируется по статусу, чтобы "Live" оказались на верху, затем по номеру волокна и, наконец, по расстоянию.

Примечания:

  • Убедитесь, что названия колонок правильно соответствуют вашим данным. Параметры Columns(3), Columns(7) и Columns(8) должны быть правильно сопоставлены с колонками C, G и H соответственно.
  • Если вы хотите, чтобы "Live" статус находился сверху, стоит установить Order:=xlDescending для соответствующего поля.
  • Перепроверьте название кнопки, чтобы убедиться, что оно совпадает с названием в коде.

Этот код должен работать без ошибок и корректно выполнять сортировку ваших данных.

Оцените материал
Добавить комментарий

Капча загружается...