[[20200514110330]] 『並べ替え』(bks18) ページの最後に飛ぶ

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

 

『並べ替え』(bks18)

VBAについては初心です
ネットで調べながらの構文です

並べ替えについてです
上手く掲示されないので:で区切ってあります

A:::::::::B::::::::::::::::C:::::::::D:::::::E:::::::::::F
区分::::::形状:::::::::::::長さ:::::数量:::::Kg単価::::製品単価
[−1.2:::15×150×30:::::2000:::::2::::::155::::::::577
[−1.2:::15×150×100:::2000:::::2::::::155:::::::::784
L−1.2:::130×30:::::::::2000:::::2::::::150:::::::::458
L−1.2:::130×100::::::::2000:::::2::::::150::::::::658
PL−1.6::200::::::::::::::2000:::::2::::::120::::::::610
Z−2.3:::50×75×50::::::2000:::::2::::::155::::::::987
[−1.2:::15×150×100:::2000:::::2::::::155:::::::::784

上記の内容
を下記の構文で並べ替えています

まず書き出して

  myKey = myDic.keys
    myItem = myDic.items
        For i = 0 To UBound(myKey)
            myVal3 = Split(myKey(i), "_")
            Cells(i + 2, 8).Value = myVal3(0)
            Cells(i + 2, 9).Value = myVal3(1)
            Cells(i + 2, 10).Value = myVal3(2)
            Cells(i + 2, 12).Value = myVal3(3)
            Cells(i + 2, 13).Value = myVal3(4)
            Cells(i + 2, 11).Value = myItem(i)

        Next
    Set myDic = Nothing

並べ替えしてます
 Range("H1", Range("M" & Rows.Count).End(xlUp)).Sort _

        Key1:=Range("H2"), Order1:=xlAscending, _
        Key2:=Range("I2"), Order2:=xlAscending, _
        Key3:=Range("J2"), Order3:=xlAscending, _
        Header:=xlGuess

        Cells(Rows.Count, 11).End(xlUp).ClearContents

すると下記のようになります

H:::::::::I::::::::::::::::J:::::::::K:::::::M
区分::::::形状:::::::::::::長さ:::::数量::::製品単価
[−1.2:::15×150×100:::2000:::::4:::::::::784
[−1.2:::15×150×30:::::2000:::::2::::::::577
Lー1.2:::130×100::::::::2000:::::2::::::::658
L−1.2:::130×30:::::::::2000:::::2:::::::::458
PL−1.6::200::::::::::::::2000:::::2::::::::610
Z−2.3:::50×75×50::::::2000:::::2::::::::987

実際は下記のように並べ替えしたいです

PL−1.6::200::::::::::::::2000:::::2::::::::610
L−1.2:::130×30:::::::::2000:::::2:::::::::458
Lー1.2:::130×100::::::::2000:::::2::::::::658
[−1.2:::15×150×30:::::2000:::::2::::::::577
[−1.2:::15×150×100:::2000:::::4:::::::::784
Z−2.3:::50×75×50::::::2000:::::2::::::::987

優先順位としては
1、区分でPL、L、[、Zの順
2、形状で文字数の少ない順且つ先頭の数値の小さい順
です
※元の明細には形状はランダムに記入されています

お手数ですが
宜しくお願い致します

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


 これら↓を別列にコピーして、×で振り分けて(区切り位置)
 振り分けられたセルをソートキーに活用しては?

 200
 130×30
 130×100
 15×150×30
 15×150×100
 50×75×50
(BJ) 2020/05/14(木) 13:55

Sub main()
    Dim dt(5000) As Long, c As Range, s As String, i As Long, d As Variant
    For Each c In Range("A2:A" & Rows.Count).SpecialCells(2)
        s = Left(Trim(c.Value), 1)
        dt(Switch(s = "P", 1000, s = "L", 2000, s = "[", 3000, s = "Z", 4000) + Len(c.Offset(, 1).Value) * 10 + Val(Left(c.Offset(, 1).Value, 1))) = c.Row
    Next c
    Range("H1:M1").Value = Range("A1:F1").Value
    For Each d In dt
        If d > 0 Then
            Range("H" & i + 2 & ":M" & i + 2).Value = Range("A" & d & ":F" & d).Value
            i = i + 1
        End If
    Next d
End Sub
(mm) 2020/05/14(木) 14:40

コメント返信:

[ 一覧(最新更新順) ]


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