プロが教える店舗&オフィスのセキュリティ対策術

.
 添付の如く、A列は5行ごとに結合されており、寿司ネタが入力されております。
 5行ごとに結合したセル数は260個です。
 やりたい事は、このA列のデータを上から逆に並び替えることです。
 その為に、B列に同じく5行ごとに結合したセルを並べ、数字を1から260まで並べております。

 さて、ソートのウィンドゥを出し、最優先されるキーを「列B」、順序を「大きい順」にして[OK]とやってもできません。
 「この操作を行うには、すべての結合セルを同じサイズにする必要があります[OK]」とでます。

 然し、選択するセル数が少なければ可能です。
 A列にもB列にも結合セルが260個あって、B列には260までの数が並んでいますが、260個全部やろうとすると上記の如くダメで、204までならソート可能です。205個以上やろうとすると上記の如くNGとなります。

 この寿司ネタの入力されたexcelはここで質問するために作成したもので、セルの結合行数5個、データ数は260個ですが、本来必要があってVBAでプログラミングしたものは、セルの結合行数21個、データ数は858個です。そして、寿司ネタエクセルは204個までならソート可能でしたが、セルの結合行数21個のだと48個までしかソートできません。

 セルの結合数がいくつでもソート可能にする方法はございませんか?

 宜しくお願い致します。

 以上

「結合セルのソートについて」の質問画像

A 回答 (5件)

No1です。



逆順になれば良いのか、「B列をキーにソートしたい」のかわかりませんけれど、ひとまず、後者で・・

・セルの結合はそのままで処理します。
・シートの空き列を利用して、シートのソート機能を利用しています。
・そのまま結果を上書きしますので、コピーなどでテストしてください
・A列とB列の結合状態が同じであることが前提です、
 (そのチェックは行っていません)

Sub Q12912242()
Dim col As Long, rw As Long
Dim rng, v

col = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column + 1
rw = Cells(Rows.Count, 1).End(xlUp).Row
v = Range("A1:B1").Resize(rw + 1).Value
Set rng = Cells(1, col).Resize(UBound(v), 2)
rng.Value = v
rng.Sort key1:=rng(1, 2), order1:=xlDescending
rw = Cells(Rows.Count, col).End(xlUp).Row

v = Cells(1, col).Resize(rw + 1, 2).Value
Set rng = Range("A1")
For rw = 1 To UBound(v)
rng.Value = v(rw, 1)
rng.Offset(, 1).Value = v(rw, 2)
Set rng = rng.Offset(1)
Next rw
Columns(col).Resize(, 2).ClearContents
End Sub


※ もしも、逆順にするだけなら、B列も不要ですしソートも不要なので、もっと簡単になるでしょう。
    • good
    • 0

#2です


>excelの一覧表のシートから、マクロを実行させると新たにシートが追加され (この段階で結合セルは必要なのでしょうか?)
21行を結合する必要性が分かりませんが、必要なのだと思います。

仕様はだいぶ違うと思いますが、実は私もQSLの管理を自前のVBAで行っています。(電子QSLとか多くなったので)

>然し再結合が大変ですね。
VBAでは、そんなに時間のかかる難しい処理のようには思いません

A列B列にデータがあるとして 一応、プロシージャを分けていきました
Application.ScreenUpdatingを会えてるかいませんが

Sub UnMerge_Sample() ’結合を解いて並び替え
Dim h As Double, r As Range, rr As Range
h = Range("A1").MergeArea.Height
Range("B1").CurrentRegion.UnMerge
For Each r In Range(Cells(1, "B"), Cells(Rows.Count, "B").End(xlUp))
If Not r <> "" Then
If rr Is Nothing Then Set rr = r Else Set rr = Union(rr, r)
End If
Next
If Not rr Is Nothing Then rr.EntireRow.Delete
Call Range("B1").CurrentRegion.Sort(Key1:=Range("B1"), Order1:=xlDescending)
’結合行の高さに1行を設定しています。画像が無いなら不要
Range("A1", Cells(Rows.Count, "A").End(xlUp)).RowHeight = h
End Sub

Sub Merge_Sample() ’結合を戻す
Dim h As Double, i As Long, n As Long
Dim ary As Variant
Const r As Integer = 5 '結合行数
h = Cells(Rows.Count, "B").Height
ary = Range("A1", Cells(Rows.Count, "B").End(xlUp))
Range("A1", Cells(Rows.Count, "B").End(xlUp)).ClearContents
n = 1
For i = 1 To UBound(ary)
Cells(n, 1).Resize(r).Merge
Cells(n, 2).Resize(r).Merge
Cells(n, 1) = ary(i, 1)
Cells(n, 2) = ary(i, 2)
n = n + r
Next
Range("A1", Cells(Rows.Count, "A").End(xlUp)).RowHeight = h
End Sub
    • good
    • 1
この回答へのお礼

Qchan1962さん、再び有り難うございます。

 シートからQSLカードだってバレちゃいましたね。。。。。

>>然し再結合が大変ですね。
>VBAでは、そんなに時間のかかる難しい処理のようには思いません

 出来上がったカードの結合部分を、一旦結合解除して、逆並びにして、もう一度再結合する。それをVBAでやるとすると、プログラムが2つ必要だから煩雑で嫌だなと思ったのですが、最初から結合せずにうまくやればそんなでもないですね。

 私がexcelVBAで作成するQSLカードは、必要な情報は全て表面に記載してあります。
 裏面は、JARL転送用のコールサインのみです。
 その21個を結合したセルに、JARL転送用の相手のコールサインが入ります。
 添付ファイルの寿司ネタが入った部分です。
 セル結合数が21個の理由は、カード1枚分のセル数だからです。

お礼日時:2022/04/23 07:01

作業用のシートを使ってソートするようにしました。


①空のシート:作業用 を作成しておいてください。
②結合セルをもつシートのシート名は、Sheet1にしています。
必要に応じてマクロの中のシート名("Sheet1")を変えてください。

Option Explicit
Public Sub 並べ替え()
Const MGROW As Long = 21 '結合セルの行数
Dim maxrow1 As Long
Dim maxrow2 As Long
Dim row1 As Long
Dim row2 As Long
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("作業用")
maxrow1 = sh1.Cells(Rows.count, "A").End(xlUp).row
If (maxrow1 - 1) Mod MGROW <> 0 Then
MsgBox ("最大行数エラー")
End If
sh2.Cells.ClearContents
row2 = 1
For row1 = 1 To maxrow1 Step MGROW
sh2.Cells(row2, "A").Value = sh1.Cells(row1, "A").Value
sh2.Cells(row2, "B").Value = sh1.Cells(row1, "B").Value
row2 = row2 + 1
Next
maxrow2 = row2 - 1
sh2.Range("A1:B" & maxrow2).Sort Key1:=Range("B1"), Order1:=xlDescending, Header:=xlNo
row1 = 1
For row2 = 1 To maxrow2
sh1.Cells(row1, "A").Value = sh2.Cells(row2, "A").Value
sh1.Cells(row1, "B").Value = sh2.Cells(row2, "B").Value
row1 = row1 + MGROW
Next
MsgBox ("完了")
End Sub
    • good
    • 1
この回答へのお礼

tatsumaru77 さん、ありがとうございます。

 今の私のレベルではよくわかりませんが、取り敢えずやってみます。
 ありがとうございました。

 以上

お礼日時:2022/04/23 07:04

こんにちは


すでに解決されているようですね・・
シートタグを見て投稿します。回答ではなく余談ですが、
A列には画像があるのかなぁ・・みたいに思いました
そうするとちょっと何かをしたい時にシート機能を使いたくなりますね
21行間のデータが何なのか分かりませんが・・
やはり、結合セルは好ましくないように思います。
C列以降の用途が分からないので、いい加減な事を記しているとは思いますが、結合を解除して結合エリアの高さを1行の高さにするのはどうでしょう
画像が設置されている場合、結合を解くのも大変になるかと思いますが、
そこはVBAで処理すれば容易ではないかと思います。
    • good
    • 0
この回答へのお礼

Qchan1962 さん、ご回答ありがとうございます。

>A列には画像があるのかなぁ・・みたいに思いました
 A列に画像などありません文字列だけです。

>C列以降の用途が分からないので、いい加減な事を記しているとは思いますが、

 この添付ファイルは、ここでの質問用に作成したものです。
 なので質問に関係ない情報は入力していない、なのでC列以降には何も入力しておりません。

>本来必要があってVBAでプログラミングしたものは、セルの結合行数21個、データ数は858個です。

 上記の如く、私が悩みにぶち当たったのは上記の、セルの結合行数21個、データ数は858個のデータに対するプログラミングです。
 excelの一覧表のシートから、マクロを実行させると新たにシートが追加され、そこにカードが作成されると云うものです。
 それをそのまま出したら情報量が多すぎ、見た方も訳が分からなくなってしまうので質問に必要な事だけを書いたのを出しただけです。

>結合を解除して結合エリアの高さを1行の高さにするのはどうでしょう

 なるほどそれでもできますね。
 然し再結合が大変ですね。
 データ数が10数個程度なら良いですが、858個となるともう一つプログラムが必要になりますので、得策とは云えません。

 以上

お礼日時:2022/04/22 17:42

こんにちは



>セルの結合数がいくつでもソート可能にする方法はございませんか?
一般解としてかんがえるなら・・
VBAを利用なさっているのなら、シートの機能を利用するのではなく、VBA内でソートしてしまえばよいでしょう。
ソートのロジックに関しては、検索すれば代表的なアルゴリズムが何種類か見つかると思います。

ただ、ご質問文では「単純に逆順にしたい」だけのようにも読めますので、逆順にするだけであればソートの必要もありません。
一旦、読み込んで、逆順に書き出せば良いだけです。
あるいは、「最初と最後から順番にデータを入れ替える」という方法でも実現可能です。(こちらだとデータをまとめて読み込む必要はなくなります)

どうしてもシートのソート機能を利用したければ、(結合無しの)空きセルにデータを転記してソートし、また戻すという処理にしておくことでも可能でしょう。
    • good
    • 1
この回答へのお礼

fujillin さん、いつもありがとうございます。

>VBAを利用なさっているのなら、シートの機能を利用するのではなく、VBA内でソートしてしまえばよいでしょう。

 そうですね。よく考えれば、いやいや、よく考えなくても、そのくらいすぐ分かるのが普通ですよね。
 取り合えず稚拙な方法ですが、VBAを使って逆に並べることは出来ました。

>ソートのロジックに関しては、検索すれば代表的なアルゴリズムが何種類か見つかると思います。

 一応できはしましたが、もっとスマートな方法でやりたいので、アドバイス通り適したアルゴリズムを使用して実現したいと思っております。

 ありがとうございました。

 以上

お礼日時:2022/04/22 15:13

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


人気Q&Aランキング