[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『連番に並び替えしたいがうまくいかない(マクロで実施したい)』(ぴょんた)
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 >
(IT) 2024/01/14(日) 17:32:19
___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
もこな2様
作業列を設けるパターンも一つの手だな…と考えていましたが、
TEXTSPLIT関数なるものがあるのですね!調べてみると、色々な使い方ができそうですね。
ありがとうございます、今後活用してみます。
(ぴょんた) 2024/01/14(日) 20:10:56
余談です。
これに適したWinAPIがあります。 [[20200209162559]] の記事が見つかりました。参考になるかもしれません。
(xyz) 2024/01/14(日) 20:39:16
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.