[[20240114165458]] 『連番に並び替えしたいがうまくいかない(マクロで』(ぴょんた) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『連番に並び替えしたいがうまくいかない(マクロで実施したい)』(ぴょんた)

A列に下記のような番号が並んでいて、これを単純に昇順にしたいのですが上手くいきません。

昇順にした時に、このように並ばせたいのですが、
#1-1-1
#1-1-2
#1-1-3
#1-1-4
#1-1-5
#1-1-6
#1-1-7
#1-1-8
#1-1-9
#1-1-10
#1-1-11
#1-1-12

こうなってしまうのです。。。
#1-1-1
#1-1-10
#1-1-11
#1-1-12
#1-1-2
#1-1-3
#1-1-4
#1-1-5
#1-1-6
#1-1-7
#1-1-8
#1-1-9

マクロで並び替え操作しようと考えていますが、実現可能な方法をご存じの方いらっしゃいましたら教えてください。
(ちなみに手動でフィルタ付けて昇順で並びかえしても同様の結果になります。文字列として扱われてしまうが為に、こうなるのですよね…)

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


>実現可能な方法を
#1-1-1を#1-1-01〜09にして桁数を揃えたらどうですか。

(IT) 2024/01/14(日) 17:32:19


マクロで頑張るのも手ではあるでしょうが、「使用 Excel:Microsoft365」ということなので、隣の列に「=TEXTSPLIT(A1,"-")」のような数式を設定して(フィル)コピーすると↓のようにできるのでB〜Dをキーにソートしてみてはどうでしょうか?
     ___A__     __B__   _C_     _D_
  1  #1-1-1      #1      1       1
  2  #1-1-2      #1      1       2
  3  #1-1-3      #1      1       3
  4  #1-1-4      #1      1       4
  5  #1-1-5      #1      1       5
  6  #1-1-6      #1      1       6
  7  #1-1-7      #1      1       7
  8  #1-1-8      #1      1       8
  9  #1-1-9      #1      1       9
 10  #1-1-10     #1      1      10
 11  #1-1-11     #1      1      11
 12  #1-1-12     #1      1      12

(もこな2) 2024/01/14(日) 18:35:49


IT様
ありがとうございます。
その方法は思いつきませんでした。
とても勉強になります。

もこな2様
作業列を設けるパターンも一つの手だな…と考えていましたが、
TEXTSPLIT関数なるものがあるのですね!調べてみると、色々な使い方ができそうですね。
ありがとうございます、今後活用してみます。

(ぴょんた) 2024/01/14(日) 20:10:56


 余談です。

 これに適したWinAPIがあります。
[[20200209162559]]
 の記事が見つかりました。参考になるかもしれません。

(xyz) 2024/01/14(日) 20:39:16


xyz様
まさに同じ内容の質問ですね。ありがとうございます。
WinAPI、中々マニアックなコードですね。
試してみたところ、64ビットシステムで使用するコードなので更新する必要あり…と出てきたため、
会社PCで別途試してみます。
色々な方法があるのですね。ありがとうございます!
(ぴょんた) 2024/01/14(日) 20:47:57

 StrCmpLogicalW 64bit などと検索すると、宣言方法を書いたものがみつかります。
 Private Declare PtrSafe Function StrCmpLogicalW Lib "SHLWAPI.DLL" (ByVal lpStr1 As LongPtr, ByVal lpStr2 As LongPtr) As Long
 でしょうか。 

(xyz) 2024/01/14(日) 22:11:34


 365なので試しに関数で
 =LAMBDA(col,SORTBY(col,MAP(col,LAMBDA(c,TEXTJOIN("",,TEXT(TEXTSPLIT(SUBSTITUTE(c,"#",""),"-"),"00"))*1))))(A1:A12)
(´・ω・`) 2024/01/14(日) 22:56:45

    Sub main()
    Dim k(1 To 3) As Long, m(1 To 3) As String, c As Range, i As Long, dlist As Object
    On Error Resume Next
    Set dlist = CreateObject("System.Collections.SortedList")
    For Each c In Range("A:A").SpecialCells(2)
        If Len(Split(c.Value, "-")(2)) > k(1) Then k(1) = Len(Split(c.Value, "-")(2))
        If Len(Split(c.Value, "-")(1)) > k(2) Then k(2) = Len(Split(c.Value, "-")(1))
        If Len(Split(c.Value, "-")(0)) - 1 > k(3) Then k(3) = Len(Split(c.Value, "-")(0)) - 1
    Next c
    For Each c In Range("A:A").SpecialCells(2)
        m(1) = Format(Replace(Split(c.Value, "-")(0), "#", ""), WorksheetFunction.Rept("0", k(3)))
        m(2) = Format(Split(c.Value, "-")(1), WorksheetFunction.Rept("0", k(2)))
        m(3) = Format(Split(c.Value, "-")(2), WorksheetFunction.Rept("0", k(1)))
        dlist.Add Val(m(1) & m(2) & m(3)), c.Value
    Next c
    For Each c In Range("A:A").SpecialCells(2)
        c.Value = dlist.getbyindex(i)
        i = i + 1
    Next c
    End Sub

(mm) 2024/01/16(火) 16:52:51


 365ということなのでWorksheetFunction.SortByを使ったサンプル

 Public Sub SortSamole()
    Dim aryData(), Key1(), Key2(), Key3()
    aryData = Range("A1").CurrentRegion.Value
    ReDim Key1(1 To UBound(aryData), 1 To 1)
    ReDim Key2(1 To UBound(aryData), 1 To 1)
    ReDim Key3(1 To UBound(aryData), 1 To 1)

    Dim i As Long, t
    For i = 1 To UBound(aryData)
        t = Split(aryData(i, 1), "-")
        Key1(i, 1) = Val(Mid(t(0), 2))
        Key2(i, 1) = Val(t(1))
        Key3(i, 1) = Val(t(2))
    Next
    aryData = WorksheetFunction.SortBy(aryData, Key1, 1, Key2, 1, Key3, 1)

    Range("C1").Resize(UBound(aryData), UBound(aryData, 2)).Value = aryData
 End Sub

(hatena) 2024/01/17(水) 11:40:56


 上記はC列に並べ変えた結果を出力してますが、A列に上書きしたい場合は、最後のコードを修正してください。

     Range("A1").Resize(UBound(aryData), UBound(aryData, 2)).Value = aryData
(hatena) 2024/01/17(水) 11:45:43

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.