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