プロが教えるわが家の防犯対策術!

添付画像のBC列の表を、B列を基準して並び替えてEF列のように並べ替えたい。

とりあえすの発想で
1項目2行 → 1項目1行へ変形 → B列でソート → 1項目2行へ復元
ではなんか無駄だらけな気がして。

VBAで考えてました。
いい方法があれば教えて下さい。

「結合セルを含んだ並べ替え VBA」の質問画像
教えて!goo グレード

A 回答 (4件)

分解して、また、くっ付けてです。




Dim StartR, LastR, R, RR
Dim N
Dim OrgNo

Application.ScreenUpdating = False

StartR = 2
LastR = Cells(Rows.Count, "B").End(xlUp).Row + 1
    
Columns("B").UnMerge
For R = StartR To LastR Step 2
    Cells(R + 1, "B") = Cells(R, "B")
Next R

N = 1
Columns("C").Insert
For R = StartR To LastR
    Cells(R, "C") = N
    N = N + 1
Next R

Range(Cells(StartR, "B"), Cells(LastR, "D")).Sort _
key1:=Columns("B"), order1:=xlAscending, _
key2:=Columns("C"), order2:=xlAscending

Columns("C").Delete

Application.DisplayAlerts = False
For R = StartR To LastR Step 2
    Range(Cells(R, "B"), Cells(R + 1, "B")).Merge
Next R
Application.DisplayAlerts = True

Application.ScreenUpdating = True
    • good
    • 0

方法はあるのかもですが画像のような『簡単な数値・英字』での作業なのか、もっと複雑な語句になるのかでも変わりそう。


特に『漢字』とか『英数字混合』とかになるとまた違うでしょうし。

と初級レベルなジジィは思い浮かびました。
それにWIN10では今後を考えると使用すべき手法ではないので、代替え方法が難しいかな?
    • good
    • 0

#1です。

よく読まず申し訳ありません
ご質問の回答になっておりませんでした。

#1は、既に発想されている処理を書いただけでした。

結合セルB列とC列に関連性があるのであれば、発想されている通り
私も一項目にデータ化して処理するのが良いと思います。
むしろ、関連付けとしては合理的な気がします。

すみません。
    • good
    • 0

こんばんは


良い方法か分かりませんが、べたに考えると
B列セルとC列セル2行は関連性があるので文字列としてつなげてソートして
元のセルフォーマットに戻すという手順で考えてみました。

E列F列は通常セルで実行します。
決め打ちのところは適時変更してください。

Sub sample()
Dim i As Long, j As Long, n As Long
Dim ary, tmp

Range("B3:C14").Copy Range("E3")
Application.CutCopyMode = False

ReDim ary((Cells(Rows.Count, "F").End(xlUp).Row - 2) / 2)
For i = 3 To Cells(Rows.Count, "F").End(xlUp).Row Step 2
ary(n) = Cells(i, 6).Offset(, -1) & "|" & Cells(i, 6) & "|" & Cells(i, 6).Offset(1)
n = n + 1
Next

For i = UBound(ary) To LBound(ary) Step -1
For j = LBound(ary) To i - 1
If ary(j) > ary(j + 1) Then
tmp = ary(j)
ary(j) = ary(j + 1)
ary(j + 1) = tmp
End If
Next j
Next i

n = 1
For i = 3 To Cells(Rows.Count, "F").End(xlUp).Row Step 2
Cells(i, 6).Offset(, -1) = Split(ary(n), "|")(0)
Cells(i, 6) = Split(ary(n), "|")(1)
Cells(i, 6).Offset(1) = Split(ary(n), "|")(2)
n = n + 1
Next
End Sub
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング