[[20080727235645]] 『セル位置を変えずに並べ替えるには?』(甘太郎)  ページの最後に飛ぶ

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

 

『セル位置を変えずに並べ替えるには?』(甘太郎)
 下記の様な表があったとして、エクセルの並べ替え機能(降順)を使うと、
 結果としてセル位置がA1からA5にずれて並べ替えられてしまいますが、
 これをセルの位置は変えずにそのままの位置で降順に並び替える方法(VBAコード)を教えて下さい。
 なお、この数値データはA列の不特定の位置にあるという条件でお願いします。
 version: Excel2002
 OS:WindowsXP 
    A
1
2
3
4  500
5  600
6  700
7
8  200
9  300

 よくわからないのですが、、、
 
	[A]		[A]
[1]			
[2]			
[3]			
[4]	500		200
[5]	600	 → 	300
[6]	700		500
[7]			
[8]	200		600
[9]	300		700
 
 こう言う事でしょうか?
 
 参考程度にって事で・・・
 
Sub TEST()
Dim i As Long, n As Long
Dim MyA As Variant, x() As Variant
    With Range("B:B")
        .Value = Range("A:A").Value
        .Sort Key1:=Range("B1")
        MyA = Range("B1", Range("B" & Rows.Count).End(xlUp)).Value
        .ClearContents
    End With
    ReDim x(1 To Range("A" & Rows.Count).End(xlUp).Row, 1 To 1)
    For i = 1 To UBound(x, 1)
        If Len(Cells(i, 1)) Then
            n = n + 1
            x(i, 1) = MyA(n, 1)
        End If
    Next i
    Range("B1").Resize(UBound(x, 1)) = x()
    Erase MyA, x()
End Sub
 
 A列にあるデータを、B列に出しています。
 A列に出したいのであれば適当に変更してください。
 (キリキ)(〃⌒o⌒)b

 参考までにA列の数値をその右のB列にB1から下に数式で昇順で配置させるものです。(pensioner)

 B1に=IF(COUNT(A1),SMALL(A:A,COUNT(A$1:A1)),"")として下にフィルドラッグです。

並び替えをしたい範囲を選択で《並び替え》クリックでは
不特定の位置での並び替えが自由に


説明不足ですみません。
下記の様に、B列にそのままスライドした形でそれぞれのグループ毎に降順に並び替えたいという事です。宜しくお願いします。

    A       B
1
2
3
4  500     700
5  600     600
6  700     500
7
8  200     300
9  300     200 

 B4=IF(A4="","",LARGE(A:A,COUNTIF($A$4:A4,"<>")))
 ★下にコピー
 (Maron)

 [返信・編集]から返信を行う際は
 既に入っているコメントの下に【書き足して】ください。
 (全て消して書き換えて仕舞うと、これまでのコメントが消えてしまいます。)

 返信は下のコメント欄から行って頂くのが
 宜しいかと思います。

 ちなみに、「グループ毎に降順に」が分かりやすい例を挙げられるのが
 宜しいかと思います。
	[A]	[B]
[1]		
[2]		
[3]		
[4]	500	700
[5]	100	500
[6]	700	100
[7]		
[8]	200	300
[9]	300	200
 と言う事ではないのですか?

 説明不足の点は「昇順ではなく降順が希望だった。」
 と言うだけなら良いですけど。

 (HANA)


 こういうことですか?

 Sub test()
 Dim myAreas As Areas, myArea As Range
 With Selection
     On Error Resume Next
     Set myAreas = .SpecialCells(2).Areas
     On Error GoTo 0
     If myAreas Is Nothing Then Exit Sub
     For Each myArea In myAreas
         myArea.Sort key1:=myArea.Cells(1), order1:=xlDescending, Header:=xlNo
     Next
 End With
 End Sub
 (seiya)
 とりあえず修正

HANAさんのコメントしてくれた通りです。
そのコードが知りたいのですが。

 seiyaさんのコードは実行して見られましたか?
 そこから改造したら出来そうに思いますが。

 (HANA)

勉強不足のためseiyaさんの提示してくれたコードの修正箇所がよく分かりませんでしたが、色々やってみたところ正しく実行する事ができました。
seiyaさん、HANAさん、ありがとうございました。
追加質問で申し訳ないですが、この並び替えを下記の様に該当列だけでなく行毎並び替えたいのですが。
つまり、処理前の行[4][5][6]、[8][9]が処理後に[6][4][5]、[9][8]となる様に行単位での並び替えをしたいのです。
その場合どの様なコードにすればいいのでしょうか?
なお、具体的にはデータは以下の様なセル配置となっています。

1行目は文字列なのでそのままにしておきたいです。

 2行目から9行目まで数値データが存在しています。

(処理前)

    [I] [J] [K] [L] [M] [N] [O] [P] [Q] [R]	
[1]		
[2]		
[3]		
[4]	                               500	
[5]	                               100	
[6]	                               700	
[7]		
[8]	                               200	
[9]	                               300	

(処理後)

    [I] [J] [K] [L] [M] [N] [O] [P] [Q] [R]	
[1]		
[2]		
[3]		
[6]	                700	
[4]	                               500	
[5]	                               100	
[7]		
[9]	                               300	
[8]	                               200	

(甘太郎)


 数値のみを対象にするなら
     Set myAreas = .SpecialCells(2).Areas
 を
     Set myAreas = .SpecialCells(2,1).Areas
                                  ^^^
 に変更するか、その部分を選択しなければ済むのでは?
 (seiya)

コメント返信:

[ 一覧(最新更新順) ]


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