사용자 정의 목록 없이 Excel을 사용한 사용자 정의 정렬

사용자 정의 목록 없이 Excel을 사용한 사용자 정의 정렬

데이터가 다음과 같은 Excel 행을 정렬하고 싶습니다.

Column - 1                 Other Columns

701-GBL-1843-MLMK          blah
566-JJB-2785-MYJW
254-WYD-3220-NAND
884-GLE-2843-FRYA

그리고 세 번째 매개변수를 기준으로 데이터를 정렬하여 문자열 중간에 있는 숫자를 기준으로 비교하고 싶습니다.

701-GBL-1843-MLMK
566-JJB-2785-MYJW
884-GLE-2843-FRYA
254-WYD-3220-NAND

100000000000000개 항목 길이의 사용자 정의 목록을 만드는 대신 이를 수행할 수 있는 방법이 있습니까?

기본적으로 다음과 같은 사용자 지정 비교를 만들 수 있는 Excel용 코드를 작성하는 방법을 알고 싶습니다.

가짜:

mycompare(cell1, cell2):
    if(cell1's third param > cell2's third param):
        return GREATER
    if(cell1's third param < cell2's third param):
        return LESS
    return EQUAL

sort(myWorksheet, mycompare)

말할 필요도 없이 저는 VB를 프로그래밍하거나 사용하는 방법을 모릅니다. 죄송합니다.

답변1

도우미 열을 만듭니다. 해당 열의 2행에(1행에 머리글이 있다고 가정) 수식을 입력합니다.

=MID(A2,9,4)

그러면 첫 번째 열의 값에서 "세 번째 매개변수"가 추출됩니다. 그런 다음 도우미 열을 정렬합니다.

도우미 열 정렬

답변2

내가 취할 접근 방식은 추가 데이터 열을 생성하는 것입니다. 열 1의 값 형식이 예제에서와 같이 항상 고정 길이라고 가정하면 =MID(A2,9,4)세 번째 요소를 별도의 셀로 추출하여 해당 열을 정렬할 수 있습니다. 내 수식 예제에서는 9번째 문자 위치에서 시작하는 4자를 선택하는데, 이는 표시된 데이터 예제에 적합한 것으로 보입니다.

두 번째 및 세 번째 대시와 그 사이의 숫자를 찾아 세 번째 요소를 추출하는 공식이 필요한 경우에도 수행할 수 있습니다. 실제로 가장 짧은 접근 방식을 찾기 위해 해당 요소를 사용하면 되지만 쉽게 수행할 수 있습니다. .

답변3

답변이 있다는 것을 알고 있지만 VBa를 사용하여 수행하는 방법을 물으셨기 때문에

Option Explicit

Sub Testing()

Start (False) ' large to small
Start (True) ' small to big

End Sub

Sub Start(fromSmallToBig As Boolean)

Dim myRow As Integer
myRow = 1

Do While (Range("A" & myRow).Value <> "")

    Dim currentValue As String
    currentValue = Range("A" & myRow).Value

    Dim nextValue As String
    nextValue = Range("A" & myRow + 1).Value

    If (nextValue = "") Then
    Exit Do
    End If

    Dim first() As String
    first = Split(currentValue, "-")

    Dim second() As String
    second = Split(nextValue, "-")


    If (fromSmallToBig) Then
        Call Sorting(first(2), second(2), myRow, nextValue, currentValue)
    Else
        Call Sorting(second(2), first(2), myRow, nextValue, currentValue)
    End If

    myRow = myRow + 1

Loop

End Sub

Sub Sorting(first As String, second As String, myRow As Integer, nextValue As String, currentValue As String)

      If first > second Then

        Dim rowOne() As Variant
        rowOne = Rows(myRow).Value

        Dim rowTwo() As Variant
        rowTwo = Rows(myRow + 1).Value

        Rows(myRow).Value = rowTwo
        Rows(myRow + 1).Value = rowOne

        myRow = 0 ' start all over again, not efficient but, simpler code

    End If

End Sub

이는 실제로는 좋지 않을 수도 있지만 정렬을 위해 추가 열이 필요하지 않음을 의미합니다(Scott의 답변에서는 Excel의 기능을 사용할 수 있지만 내 VBa 답변은 종소리가 아니며 그렇지 않을 수도 있습니다). 매우 큰 데이터에 매우 효율적임)

관련 정보