Как чередовать восходящую сортировку по убыванию для столбца имен переменных?

0

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

ID  Sales
Apple   10
Apple   2
Apple   12
Orange      15
Orange      4
Guava   2
Guava   18
Guava   20
Guava   3


ID  Sales
Apple   12
Apple   10
Apple   2
Orange      4
Orange      15
Guava   20
Guava   18
Guava   3
Guava   2

Я нашел код VBA для вставки пустой строки при изменении переменной. ссылка на сайт Можно ли это изменить, чтобы изменить порядок сортировки?

    sub AddBlankRows()
'
dim iRow as integer, iCol as integer
dim oRng as range

set oRng=range("a1")

irow=oRng.row
icol=oRng.column

do 
'
if cells(irow+1, iCol)<>cells(irow,iCol) then
    cells(irow+1,iCol).entirerow.insert shift:=xldown
    irow=irow+2
else
    irow=irow+1
end if
'
loop while not cells (irow,iCol).text=""
'
end sub
Anusha
источник
Используйте реальную систему, которая предназначена для использования в качестве базы данных. Даже если это просто доступ. Ваш пример просто просит об этом. Во всяком случае, вы должны, вероятно, посмотреть на Range.Sort и способ зарегистрировать новое значение в столбце. После этого сортируйте по идентификатору, группируйте по идентификатору и сортируйте по количеству элементов в группе. Сама идея на самом деле звучит довольно ужасно, так как она была бы очень противоречивой, особенно с вашим примером, который даже не имеет никакого смысла.
Seth
Просто чтобы указать на это: Apple нечетная и отсортированная по убыванию, Orange четная и отсортированная по возрастанию, Guava четная и убывающая. Большинство значений, за исключением 15 и 3, являются четными, поэтому они также не могут быть связаны с этим? Этот пример не подходит для того, что вы описали, или наоборот.
Seth
Это просто пример, чтобы показать, как я хочу отсортировать. Да, я хочу сначала отсортировать по возрастанию, а следующую переменную - по убыванию. Между числами нет связи. Они только для демонстрационных целей.
Anusha
Тем не менее Range.Sort и группировка будет решением. Без какой-либо более конкретной информации это, вероятно, так же хорошо, как и получается, если нет никакой сборки в пути.
Seth

Ответы:

0

Этот код VBA запрашивает входной номер (любое число, четное по возрастанию, нечетное по убыванию), проверьте его с помощью Mod Функция и сортировка данных «A1: B11» с заголовком, вы можете изменить его на ваши реальные данные (сортировка по столбцу 1 (A) по возрастанию, столбец 2 (B) по возрастанию или убыванию в соответствии с входным номером

Sub DataSort()  
    Dim theRange As Range 
    Dim rep As Variant 
    Set theRange = Range("A1:B11") 
    rep = InputBox("Enter a number to decide order") 
    If rep Mod 2 = 0 Then    
      With ActiveSheet
        .Sort.SortFields.Clear
        .Sort.SortFields.Add Key:=theRange.Columns(1).Cells, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Sort.SortFields.Add Key:=theRange.Columns(2).Cells, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With .Sort
            .SetRange theRange
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
     End With
    ElseIf rep Mod 2 = 1 Then
        With ActiveSheet
        .Sort.SortFields.Clear
        .Sort.SortFields.Add Key:=theRange.Columns(1).Cells, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Sort.SortFields.Add Key:=theRange.Columns(2).Cells, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
         With .Sort
            .SetRange theRange
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
         End With
        End With
    End If
End Sub
yass
источник
Спасибо за ответ Ясс. Возможно, мне не хватает чего-то базового, но я не вижу никакой сортировки, когда запускаю этот код. Нужно ли выбирать данные определенным образом, чтобы это работало? Также нет сортировки по разным столбцам. Если переменная в главном столбце изменяется, сортировка меняется с возрастания на убывание. то есть. когда переменная меняется с яблочной на оранжевую, сортировка продаж изменяется от убывания к возрастанию.
Anusha
Вы должны изменить A1: B11 на вашу ссылку (если у вас есть другие столбцы C, D ... и столбец 1 должен быть ID в A, а столбец 2 означает Sales в B и ввести 1 или 2 в поле ввода
yass