• 締切済み

VBAで統合セルの並び替えは可能ですか?

表題のとうりなのですが・・・ Sub 並番号() With ActiveSheet.Sort .SortFields.Clear .SortFields.Add Key:=Range("M4") .SetRange Range("A4:M242")   .Apply End With End Sub とプログラムしてるのですが、M4からM242までがセルを3個ずつ 統合したセルになっております。 統合セルの並び替えは出来ないのでしょうか? ご教授お願いいたします。

みんなの回答

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

自分でも使いたい場面がありましたので、作成してみました。誤動作するかもしれないので、必ずバックアップを取ってから試してみてください。当方XL2000です。作業シートを作成して、そちらに並べ替えてコピーし、元の範囲に書き戻します。 '選択範囲の1列目(文字列、結合セル対応)をキーに並べ替え Sub test() Dim targetRange As Range If TypeName(Selection) <> "Range" Then Exit Sub Set targetRange = Selection Call sortMergeCells(targetRange) End Sub Private Sub sortMergeCells(targetRange As Range) Dim data() As Variant, dataRange() As Range Dim myCell As Range Dim i As Long Dim newSheet As Worksheet Const sortDirection As Long = 1 '昇順 Application.ScreenUpdating = False Set myCell = targetRange.Cells(1) i = 1 Do ReDim Preserve data(1 To i), dataRange(1 To i) data(i) = myCell.Value Set dataRange(i) = myCell.MergeArea.Resize(, targetRange.Columns.Count) Set myCell = myCell.Offset(1, 0) i = i + 1 Loop Until Intersect(myCell, targetRange) Is Nothing Call BubbleSortStrings(data, dataRange, sortDirection) Set newSheet = Sheets.Add Set myCell = newSheet.Range("a1") For i = 1 To UBound(data) dataRange(i).Copy myCell Set myCell = myCell.Offset(1, 0) Next i newSheet.UsedRange.Copy targetRange.Cells(1) Application.DisplayAlerts = False newSheet.Delete Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub 'Microsoftのバブルソートを改造 'direction 1:昇順、-1 降順 Private Sub BubbleSortStrings(sArray() As Variant, rArray() As Range, direction As Long) Dim lLoop1 As Long Dim lLoop2 As Long Dim lTemp As String Dim rTemp As Range For lLoop1 = UBound(sArray) To LBound(sArray) Step -1 For lLoop2 = LBound(sArray) + 1 To lLoop1 If StrComp(sArray(lLoop2 - 1), sArray(lLoop2)) = direction Then lTemp = sArray(lLoop2 - 1) Set rTemp = rArray(lLoop2 - 1) sArray(lLoop2 - 1) = sArray(lLoop2) Set rArray(lLoop2 - 1) = rArray(lLoop2) sArray(lLoop2) = lTemp Set rArray(lLoop2) = rTemp End If Next lLoop2 Next lLoop1 End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • kenpon24
  • ベストアンサー率64% (66/102)
回答No.3

一応、例1をコーディングしてみました。。 セル結合が3セル限定だし、結合セルが横にも続いていると 意図したとおりに動かないと思われますが、質問の例なら動くんじゃないかと思います。 もっと汎用性を持たせたかったらセルのサーチの際にMergeAreaを考慮して作る必要があると思います。 Sub temp() Call MGCellSortTest("M4:M242") 'ソートしたい範囲 End Sub '結合セルのソート (縦限定) Sub MGCellSortTest(RangeAdrs As String) Dim RangeHdr As String 'ソートする箇所のヘッダ Dim TempRange As Range Dim TempRange2 As Range RangeHdr = Range(RangeAdrs)(1).Address 'ソート範囲の結合セルを解除する For Each TempRange In Range(RangeAdrs) If TempRange.MergeCells = True Then TempRange.MergeCells = False End If '空白だったら1セル上の値を入れておく If TempRange.Row <> 1 And TempRange = "" Then TempRange = TempRange.Offset(-1, 0) End If Next 'ソート 2007は未テスト With ActiveSheet.Sort .SortFields.Clear .SortFields.Add Key:=Range(RangeHdr) .SetRange Range(RangeAdrs) .Apply End With '警告を消す Application.DisplayAlerts = False Dim i As Long Dim col As Integer col = Range(RangeAdrs).Column '入力セルの先頭から最終行まで With Range(RangeAdrs) For i = .Row To .Rows(.Rows.Count).Row '次のセルが同じ値だったら3セル分結合する If Cells(i, col) = Cells(i + 1, col) Then Range(Cells(i, col), Cells(i + 2, col)).Merge i = i + 2 End If Next End With Application.DisplayAlerts = True End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • kenpon24
  • ベストアンサー率64% (66/102)
回答No.2

コードを書くのは面倒なのでどういう事をすればいいかを書きます。 例1の方が簡単かな。 例1: 1,まずソートしたい箇所のセル結合を解きます。 2,結合が解除された箇所は先頭を除いて空欄になるので、結合されていた箇所と同じ値を入れます。 3,ソートを実行します。 4,同じ値が入っているセルを3セルずつ?結合しなおします。 例2: 1,バブルソートでもクイックソートでもいいので自前でソート関数を実装します。 2,結合セルから値を取得して配列に格納します。 3,実装したソート関数で並べ替えます。 4,並べ替えた順に元のセルに値を入れます

casino5
質問者

お礼

回答ありがとうございます。 非常に難しい感じですが挑戦してみます。

全文を見る
すると、全ての回答が全文表示されます。
  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

結合したセルは、Sortで並べ替えする事は出来ません。 (最新のExcelとかなら改善されているかも知れませんが。) マクロで結合したセルの値を入れ替えるユーザー定義関数を作って、並べ替え処理を自作とか。

casino5
質問者

補足

早速の解答ありがとうございます。 質問ばかりで申し訳ないのですが・・・ 総合したセルの値を入れ替えるとはどのようなことでしょうか? ご教授お願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • マクロ 並び替え

    Sub 並べ替え() With Worksheets("Sheet1").Sort .SortFields.Clear .SortFields.Add Key:=Range("e6"), _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ CustomOrder:="金,銀,銅" .SetRange Range("a6:Cl16").CurrentRegion .Header = xlNo .Apply End With End Sub 6行目~16行目で並び替えを行ってほしいのですが、1行目から並び替えになります。 .SetRange Range("a6:Cl16").CurrentRegion と記入しているので6列目からになると思っていたのですが。 マクロ初心者のため詳しい方がいれば教えて下さい。

  • VBA ソートについて

    win7、Excelは2013を使用しています。 VBAでソートのコーディングをしたいのですが、 画像の様に、途中で空白のセルを順番指定して並べ替りできますか? 下記の ここに空白セルを指定する のところに空白セルを指定したいのですが、 そもそもそういう事が出来るものなのでしょうか..... よろしくお願い致します。 Sub ソート() With ActiveSheet.Sort.SortFields .Clear .Add key:=Range("D2"), SortOn:=xlSortOnValues, _ Order:=xlAscending, CustomOrder:= _ "A,D,H,G,F,D,B,ここに空白セルを指定する,R" _ , DataOption:=xlSortNormal End With With ActiveSheet.Sort .SetRange Range(Cells(2, 4), Cells(9, 4)) .Apply End With End Sub

  • 元のセル位置で並び替え

    添付画像にあるように「並び替え実行前」⇒「並び替え実行後」になる「ユーザー設定の基準」で並び替えるマクロを書きましたが、「悪い例」のようになってしまいます。 元のセル位置で並び替えるには「.SetRange Range("A1:E1")」のところを変えればいいと思い、いろいろ試してみましたが、うまくいきません。マクロを掲載しますので、修正点をご教示いただければ幸いです。 Sub Macro1() ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveSheet.Sort.SortFields.Add _ Key:=Range("A1"), _ Order:=xlAscending, _ CustomOrder:="松,竹,梅", _ DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").Sort .SetRange Range("A1:E1") .Header = xlNo .MatchCase = False .Orientation = xlLeftToRight .SortMethod = xlPinYin .Apply End With End Sub

  • Excel VBA UsedRange範囲ソート

    図のような中抜の一覧ができているとき、商品コードで空行を飛ばして並び替えをしたいのですが、下記だと空行まで(チョコからわたがしまで)しか対象になりません。 ---------------------------- Sub 並べ替え() With ActiveSheet.Sort .SortFields.Clear 'Key:=Range("A3")でソートする列とタイトル位置を指定 .SortFields.Add Key:=Range("A3"), SortOn:=xlSortOnValues, _ Order:=xlAscending '.「商品コード」("A3").でソート .SetRange Range("A3").CurrentRegion ' 先頭行をタイトル行と見なす .Header = xlYes .Apply End With End Sub ------------------------- 範囲をCurrentRegion ではなくUsedRangeに広げるには、どこをいじったらいいでしょうか。 求める結果としては「商品コード」の列が登り順に揃ってほしいのです。 データ処理としてはソートをかければいいだけですが、UsedRange(範囲内のセルを選択し、Ctrl+Shift+Endキーで選ばれる範囲)をみつけてソートをかける方法を知りたいのです。

  • VBA SORT Applyでエラー

    今日パソコンが新しくなり、office2003から2010になりました。 2003で作成したマクロで、SORTメソッドを書き換え実行したところ、『実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです』とメッセージが… デバッグでみると、Applyのところが黄色になっていました。 何が悪いのか教えてもらえますか? Worksheets("営業所順位表").Activate Application.Calculation = xlCalculationAutomatic '再計算自動 With ActiveSheet.Sort.SortFields .Clear .Add Key:=Range("E3"), Order:=xlDescending End With With ActiveSheet.Sort .SetRange Range("A3:S68") .Header = xlYes .Apply ←ここが黄色に End With

  • エクセルのvba(最終行を取得する並び替え)

    初めまして、エクセルのvbaについて質問をさせてください。 マクロの記録を使って、以下の通りF列→M列→J列の順に優先して、A列からAL列を昇順に並び替えるvbaを作成したのですが、10000行までとう不恰好な書き方になっています。最終行までという書き方に変えたいのですが、色々試したもののうまくいきません…!この場合、最終行を取得するにはどのような書き方にすれば良いのでしょうか…??(T-T) '並び替え ActiveWorkbook.Worksheets("当月").Sort.SortFields.Clear ActiveWorkbook.Worksheets("当月").Sort.SortFields.Add Key:=Range("F2:F10000"_ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortTextAsNumbers ActiveWorkbook.Worksheets("当月").Sort.SortFields.Add Key:=Range("M2:M10000"_ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("当月").Sort.SortFields.Add Key:=Range("J2:J10000"_ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("当月").Sort .SetRange Range("A1:AL10000") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With

  • エクセルVBAでデータ並べ替え

    マクロ記録をとると次のようになりました。 これをA列をキーに並べるもっと簡単なコードを教えてください。 Range("A2:G501")となっていますが、これ以上でも対応できるようにしたいです。 どなたか教えていただけないでしょうか。 Sub Macro1() Range("A1").Select ActiveWorkbook.Worksheets("***").Sort.SortFields.Clear ActiveWorkbook.Worksheets("***").Sort.SortFields.Add Key:=Range("A1"), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("***").Sort .SetRange Range("A2:G501") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub

  • マクロ記録で作成した並べ替えのコードを修正したい

    Windows7 Excel2007 使用しているマクロ初心者です。 マクロ記録で、次の2個のスクリプトをつくりました。 二つとも正常に実行できています。 しかし、このコードは .SetRange Range("A3:N26")の部分をいちいち手動で変更しなくてはなりません。 この部分を自動で設定し、しかもどちらの一覧表でも使えるコードにしたいです。 どう修正したらよろしいでしょうか? .Header = xlNo以下のコード省略できますか? Sub 一覧表1のソート() Range("B2").Select Worksheets("一覧表1").Sort.SortFields.Clear Worksheets("一覧表1").Sort.SortFields.Add Key:=Range("B2"), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With Worksheets("一覧表1").Sort .SetRange Range("A3:N26") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub ---------------------------------------------------- Sub 一覧表2のソート() Range("B2").Select Worksheets("一覧表2").Sort.SortFields.Clear Worksheets("一覧表2").Sort.SortFields.Add Key:=Range("B2"), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With Worksheets("一覧表2").Sort .SetRange Range("A3:P28") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub

  • 【VBA】全てのシートを並び替え 反映せず

    For Each Ws In Worksheets Ws.Activate 「並び替えの処理」 Next Ws を記述したのですが、 「並び替えの処理」を記憶マクロからコピペした為、 ("Sheet1")しか並び替えの処理がされません。(全シート並び替えの処理がしたい) 下記コードをどの様に修正すれば良いでしょうか。 ご教示願います。 '5行目から最終行迄範囲選択し、W列で昇順に並び替え Rows("5:5").Select Range(Selection, Selection.End(xlDown)).Select ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("W5:W40") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").Sort .SetRange Range("A5:X40") .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With

  • エクセルVBA

    よろしくお願いいたします。 エクセルのVBAですが、下記のコードを実行すると処理が遅いです。処理が早くなるコード教えてください。 よろしくお願いいたします。 Sub Macro3() Dim aa As Variant Dim i As Variant Application.ScreenUpdating = False Range("A14:i46").Select aa = ActiveSheet.Name ActiveWorkbook.Worksheets(aa).Sort.SortFields.Clear ActiveWorkbook.Worksheets(aa).Sort.SortFields.Add Key:=Range("B15:B46"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets(aa).Sort.SortFields.Add Key:=Range("C15:C46"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets(aa).Sort .SetRange Range("A14:i46") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With For i = 0 To 31 Cells(15 + i, 7).Select If Selection.Value = 0 Then Selection.EntireRow.Hidden = True End If Next i Range("A1").Select Application.ScreenUpdating = True End Sub

専門家に質問してみよう