カスタム リストを使用せずに Excel を使用したカスタム並べ替え

カスタム リストを使用せずに Excel を使用したカスタム並べ替え

次のようなデータのExcel行を並べ替えられるようにしたい

Column - 1                 Other Columns

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

そして、3番目のパラメータでデータをソートできるようにしたいので、文字列の真ん中の数字で比較して、次のようになります。

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)

これにより、最初の列の値から「3 番目のパラメータ」が抽出されます。次に、ヘルパー列で並べ替えます。

ヘルパー列での並べ替え

答え2

私が採用するアプローチは、追加のデータ列を生成することです。列 1 の値の形式が、例のように常に固定長であると仮定すると、 =MID(A2,9,4)3 番目の要素を別のセルに抽出して、その列で並べ替えることができるようにします。私の数式の例では、9 番目の文字位置から始まる 4 番目の文字が選択されますが、これは、示されているデータの例には機能するようです。

2 番目と 3 番目のダッシュとそれらの間の数字に基づいて 3 番目の要素を抽出する数式が必要な場合も、それが可能です。最短のアプローチを見つけるには実際に試してみる必要がありますが、簡単に実行できます。

答え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 の回答では機能が不足しており、非常に大きなデータではあまり効率的ではない可能性があります)

関連情報