
.
添付の如く、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個までしかソートできません。
セルの結合数がいくつでもソート可能にする方法はございませんか?
宜しくお願い致します。
以上

No.2ベストアンサー
- 回答日時:
こんにちは
すでに解決されているようですね・・
シートタグを見て投稿します。回答ではなく余談ですが、
A列には画像があるのかなぁ・・みたいに思いました
そうするとちょっと何かをしたい時にシート機能を使いたくなりますね
21行間のデータが何なのか分かりませんが・・
やはり、結合セルは好ましくないように思います。
C列以降の用途が分からないので、いい加減な事を記しているとは思いますが、結合を解除して結合エリアの高さを1行の高さにするのはどうでしょう
画像が設置されている場合、結合を解くのも大変になるかと思いますが、
そこはVBAで処理すれば容易ではないかと思います。
Qchan1962 さん、ご回答ありがとうございます。
>A列には画像があるのかなぁ・・みたいに思いました
A列に画像などありません文字列だけです。
>C列以降の用途が分からないので、いい加減な事を記しているとは思いますが、
この添付ファイルは、ここでの質問用に作成したものです。
なので質問に関係ない情報は入力していない、なのでC列以降には何も入力しておりません。
>本来必要があってVBAでプログラミングしたものは、セルの結合行数21個、データ数は858個です。
上記の如く、私が悩みにぶち当たったのは上記の、セルの結合行数21個、データ数は858個のデータに対するプログラミングです。
excelの一覧表のシートから、マクロを実行させると新たにシートが追加され、そこにカードが作成されると云うものです。
それをそのまま出したら情報量が多すぎ、見た方も訳が分からなくなってしまうので質問に必要な事だけを書いたのを出しただけです。
>結合を解除して結合エリアの高さを1行の高さにするのはどうでしょう
なるほどそれでもできますね。
然し再結合が大変ですね。
データ数が10数個程度なら良いですが、858個となるともう一つプログラムが必要になりますので、得策とは云えません。
以上
No.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列も不要ですしソートも不要なので、もっと簡単になるでしょう。
No.4
- 回答日時:
#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
Qchan1962さん、再び有り難うございます。
シートからQSLカードだってバレちゃいましたね。。。。。
>>然し再結合が大変ですね。
>VBAでは、そんなに時間のかかる難しい処理のようには思いません
出来上がったカードの結合部分を、一旦結合解除して、逆並びにして、もう一度再結合する。それをVBAでやるとすると、プログラムが2つ必要だから煩雑で嫌だなと思ったのですが、最初から結合せずにうまくやればそんなでもないですね。
私がexcelVBAで作成するQSLカードは、必要な情報は全て表面に記載してあります。
裏面は、JARL転送用のコールサインのみです。
その21個を結合したセルに、JARL転送用の相手のコールサインが入ります。
添付ファイルの寿司ネタが入った部分です。
セル結合数が21個の理由は、カード1枚分のセル数だからです。
No.3
- 回答日時:
作業用のシートを使ってソートするようにしました。
①空のシート:作業用 を作成しておいてください。
②結合セルをもつシートのシート名は、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
tatsumaru77 さん、ありがとうございます。
今の私のレベルではよくわかりませんが、取り敢えずやってみます。
ありがとうございました。
以上
No.1
- 回答日時:
こんにちは
>セルの結合数がいくつでもソート可能にする方法はございませんか?
一般解としてかんがえるなら・・
VBAを利用なさっているのなら、シートの機能を利用するのではなく、VBA内でソートしてしまえばよいでしょう。
ソートのロジックに関しては、検索すれば代表的なアルゴリズムが何種類か見つかると思います。
ただ、ご質問文では「単純に逆順にしたい」だけのようにも読めますので、逆順にするだけであればソートの必要もありません。
一旦、読み込んで、逆順に書き出せば良いだけです。
あるいは、「最初と最後から順番にデータを入れ替える」という方法でも実現可能です。(こちらだとデータをまとめて読み込む必要はなくなります)
どうしてもシートのソート機能を利用したければ、(結合無しの)空きセルにデータを転記してソートし、また戻すという処理にしておくことでも可能でしょう。
fujillin さん、いつもありがとうございます。
>VBAを利用なさっているのなら、シートの機能を利用するのではなく、VBA内でソートしてしまえばよいでしょう。
そうですね。よく考えれば、いやいや、よく考えなくても、そのくらいすぐ分かるのが普通ですよね。
取り合えず稚拙な方法ですが、VBAを使って逆に並べることは出来ました。
>ソートのロジックに関しては、検索すれば代表的なアルゴリズムが何種類か見つかると思います。
一応できはしましたが、もっとスマートな方法でやりたいので、アドバイス通り適したアルゴリズムを使用して実現したいと思っております。
ありがとうございました。
以上
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 重複しているか否かをソートせずに判断する方法ありますか? 2 2022/07/06 21:16
- その他(Microsoft Office) Excel 2列分のDATAの並べ替え 1 2023/01/01 17:12
- Visual Basic(VBA) エクセルVBAについて 2 2023/01/31 16:21
- Excel(エクセル) Excelの50音順ソートを全ての行列に適用するには? 4 2022/12/05 11:28
- Excel(エクセル) 関数EXACT(文字列,文字列)とexcelVBA 3 2022/04/14 15:07
- Excel(エクセル) Excelのソート(並べ替え) 2 2022/05/15 22:54
- Excel(エクセル) Excelで数式をそのままコピーしたい どうすればいいですか? 4 2022/09/16 02:16
- Excel(エクセル) Excel>マクロ>特定のセルで同じ情報が登録されている行を1行にまとめたい(文字連結) 6 2023/01/05 16:30
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Visual Basic(VBA) 【VBA】データを入力後に,同一シート内に履歴として転記するVBAコードを教えていただきたいです。 3 2022/11/16 01:37
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Excel関数】UNIQUE関数で"0"...
-
エクセルで特定の文字列が入っ...
-
特定の文字がある行以外を削除...
-
Excel ウインドウ枠の固定をす...
-
アクティブになっている行をマ...
-
EXCELで最後の行を固定
-
Excel グラフのプロットからデ...
-
Excelのフィルター後の一番上の...
-
excel 小さすぎて見えないセル...
-
[EXCEL]ボタン押す→時刻が表に...
-
エクセルのセルに指定画像(.jpg...
-
excelのデータで色つき行の抽出...
-
エクセル マクロ オートフィ...
-
エクセル 時間の表示形式AM/PM...
-
エクセルVBA 最終行を選んで並...
-
(エクセルVBAマクロ)オーバーフ...
-
エクセルVBA:リストに登録した...
-
連続データが入った行の一番右...
-
Val関数をVBAで使うには?
-
直近の5個の平均を求めたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字がある行以外を削除...
-
【Excel関数】UNIQUE関数で"0"...
-
エクセルで特定の文字列が入っ...
-
[EXCEL]ボタン押す→時刻が表に...
-
エクセル マクロで数値が変っ...
-
Excel グラフのプロットからデ...
-
結合されたセルをプルダウンの...
-
エクセル マクロ オートフィ...
-
エクセル 上下で列幅を変えるには
-
excel 小さすぎて見えないセル...
-
Excel ウインドウ枠の固定をす...
-
Excelのフィルター後の一番上の...
-
エクセル 時間の表示形式AM/PM...
-
エクセルのセルに指定画像(.jpg...
-
VBAで色の付いているセルの行削除
-
excelのデータで色つき行の抽出...
-
A1に入力された文字列と同じ文...
-
アクティブになっている行をマ...
-
電話番号の入力方式が違うデー...
-
連続データが入った行の一番右...
おすすめ情報