Я пытался сортировать даты на A1, но он сортируется по тексту, а не по значению.
Private Sub sortData()
Worksheets(Me.Combobox1.Value).Range("A1:F1", Range("A1:F1").End(xlDown)).Sort
Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes
End Sub
Я сделал несколько аранжировок. Все еще не работает
Ваши так называемые даты на самом деле представляют собой строки, которые выглядят только как даты. Они будут сортироваться иначе, чем фактические даты. Правильное решение — исправить свои данные, превратив их в настоящие даты
Все они относятся к типу данных даты
Нет, не знают. Если бы это были реальные даты, ваш код работал бы правильно. Щелкните ячейку A1 и посмотрите на значение в строке выражений. Что там сказано?
@KenWhite Это, очевидно, General A1, потому что это название. A2 и т. д. Дата
Я просто скопировал и вставил ваш пример с 30 ячейками и изменил «A1: F1» на «A1: C10». Он упорядочил все строки по дате правильно.
У меня есть больше данных, кроме столбца C, но все равно не работает
Вполне возможно иметь текстовую строку в ячейке, отформатированную как «Дата» или «Общие». Пожалуйста, выполните тест, предложенный @Ken White: выберите любую из ваших дат и отформатируйте ее ячейку как число. Если вы видите число, это настоящая дата. Если вы продолжаете видеть ту же самую «дату», это подделка.
@KenWhite прав; нет никакого способа отсортировать ваши текстовые даты как дату/время, если они не были исправлены или преобразованы, и два «ответа» ниже вам не помогут.
Это возможно с DataOption:=xlSortTextAsNumbers
Как начал говорить @Marcelo Scofano Diniz, когда вы сталкиваетесь с проблемой, забудьте о сокращении и следуйте правилам. Вот книга.
Private Sub SortByDate()
Dim Ws As Worksheet
Dim SortRange As Range
Set Ws = Worksheets(Me.ComboBox1.Value)
With Ws
Set SortRange = .Range(.Cells(1, 1), .Cells(.Rows.Count, "A").End(xlUp)) _
.Resize(, 6)
With .Sort.SortFields
.Clear
.Add2 Key:=SortRange.Cells(1), _
SortOn:=xlSortOnValues, _
Order:=xlAscending, _
DataOption:=xlSortNormal
End With
With .Sort
.SetRange SortRange
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
End Sub
Приведенный выше код будет выполнять сортировку, которую вы говорите, что ваш код не будет выполнять. Если даты являются истинными датами, они будут отсортированы по дате. Если это поддельные даты, они будут отсортированы как текст. И если у вас есть сомнения по поводу какой-либо части кода, вы можете увидеть, что делается, и выполнить его построчно.
Это сработало! Спасибо! Примечание. Если даты не будут истинными значениями дат, это можно легко исправить, написав dataOption следующим образом: DataOption:=xlSortTextAsNumbers
Изменить диапазон на таблицу имен Tbl затем создайте:
Sub Table_Sort(byval FieldNo as Integer)
Tbl.Sort.SortFields.Clear
FieldRange(FieldNo).Select
Tbl.Sort.SortFields.Add _
Key:=FieldRange(FieldNo), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortNormal
With Tbl.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Чтобы решить алгоритмическую задачу, нужно сначала понять алгоритм. Какой алгоритм оправдает ваши ожидания? Решите это сначала на листе бумаги; тогда вы будете в гораздо лучшем положении для написания кода.