데이터가 다음과 같은 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 답변은 종소리가 아니며 그렇지 않을 수도 있습니다). 매우 큰 데이터에 매우 효율적임)