1

У меня есть набор буквенно-цифровых значений в нескольких строках. Например,

 a1          b1        c2     
 b1          a2        d3     
 c1          a2        d3     

Я хочу отсортировать значения строки 1, строки 2 и строки 3 по отдельности в соседние ячейки. За. например

 a1          b1        c2     =>       a1          b1        c2       
 b1          a2        d3     =>       a2          b1        d3
 c1          a2        d3     =>       a2          c1        d3

Я могу сделать это для двух рядов, но для более чем двух рядов это стало сложным.

1 ответ1

0

Относительно легко сделать это с помощью VBA и пользовательской функции. Поскольку сортировать нужно всего несколько элементов, я использовал простую BubbleSort. Другие методы могут быть использованы также.

Для ввода этой пользовательской функции (UDF)alt-F11 открывает редактор Visual Basic. Убедитесь, что ваш проект выделен в окне Project Explorer. Затем в верхнем меню выберите «Вставить / Модуль» и вставьте приведенный ниже код в открывшееся окно.

Чтобы использовать эту пользовательскую функцию (UDF), введите формулу

=sortAlpha(A1:C1)

в диапазоне ячеек, простирающихся через ваш пункт назначения (например: E1: G1), а затем заполнить.

Это формула массива, которая возвращает массив значений. Таким образом, чтобы ввести его, вы бы, например:

  • Сначала выберите E1:G1
  • Затем наведите курсор на панель формул и введите формулу
  • Наконец, вместо того, чтобы просто нажать Enter, вы должны удерживать Ctrl + Shift при нажатии Enter. Если вы сделаете это правильно, Excel поместит фигурные скобки {...} вокруг формулы

Option Explicit

'Comment out next line for case sensitive sorting
Option Compare Text

Function sortAlpha(rg As Range) As String()
    Dim S() As String
    Dim C As Range
    Dim I As Long

ReDim S(0 To rg.Count - 1)
For Each C In rg
    S(I) = C.Text
    I = I + 1
Next C

SingleBubbleSort S

sortAlpha = S

End Function
Sub SingleBubbleSort(TempArray As Variant)
'copied directly from support.microsoft.com
    Dim Temp As Variant
    Dim I As Integer
    Dim NoExchanges As Integer

    ' Loop until no more "exchanges" are made.
    Do
        NoExchanges = True

        ' Loop through each element in the array.
        For I = LBound(TempArray) To UBound(TempArray) - 1

            ' If the element is greater than the element
            ' following it, exchange the two elements.
            If TempArray(I) > TempArray(I + 1) Then
                NoExchanges = False
                Temp = TempArray(I)
                TempArray(I) = TempArray(I + 1)
                TempArray(I + 1) = Temp
            End If
        Next I
    Loop While Not (NoExchanges)
End Sub

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .