Вопрос или проблема
Я хочу отсортировать поле данных по трём разным столбцам: 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
Объяснение кода:
-
CommandButton2_Click:
- Этот метод устанавливает действие для кнопки CommandButton.
- Он обновляет заголовок кнопки и связывает с ней макрос
SortData
.
-
SortData:
- Этот метод выполняет фактическую сортировку данных.
- Сначала он определяет последнюю строку с данными.
- Затем очищает предыдущие параметры сортировки и устанавливает новые: сначала сортируется по статусу, чтобы "Live" оказались на верху, затем по номеру волокна и, наконец, по расстоянию.
Примечания:
- Убедитесь, что названия колонок правильно соответствуют вашим данным. Параметры
Columns(3)
,Columns(7)
иColumns(8)
должны быть правильно сопоставлены с колонками C, G и H соответственно. - Если вы хотите, чтобы "Live" статус находился сверху, стоит установить
Order:=xlDescending
для соответствующего поля. - Перепроверьте название кнопки, чтобы убедиться, что оно совпадает с названием в коде.
Этот код должен работать без ошибок и корректно выполнять сортировку ваших данных.