• ベストアンサー

【VBA】手作業で選択した行を並び替え

選択する行は毎回変わる為、選択自体は都度手作業で行います。 (セルを囲う手数を省略したいので、行単位で選択します) 行が選択された状態から、C列昇順、A列昇順の優先度で並び替えがしたいです。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • SI299792
  • ベストアンサー率47% (774/1618)
回答No.5

' Sub Macro1() ' Selection.Sort Key1:=Selection(3), Order1:=xlAscending, _ Key2:=Selection(1), Order2:=xlAscending End Sub

0611birth
質問者

お礼

ご教示有難うございます。 シンプルで、思った通りに動きました。 ひな形として活用させて頂きます。

その他の回答 (4)

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.4

No.2の追加です。 選択した後の並び替えの範囲がA列からF列までだとしたら With .Sort .SetRange Range(Rows(Selection(1).Row), Rows(Selection(Selection.Count).Row)) の部分を .Sort.SetRange .Range(.Cells(Selection(1).Row, "A"), .Cells(Selection(Selection.Count).Row, "F")) With .Sort にしてください。

0611birth
質問者

お礼

いつもご教示有難うございます。 勉強させて頂きます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

#1です。 #1で考えた方式で、やって見た。 データ例 Sheet1 A2:C11 性別 氏名 点数 男 山田 23 女 杉田 13 男 大山 45 女 杉山 36 女 木原 20 男 河原 69 女 川田 78 男 木谷 46 女 大野 44 A列データの男、女の「女」のセルをクリックする、ものとする。 すべての該当行のA列をクリックすると。 Sheet2 A1:C7 性別 氏名 点数 女 杉田 13 女 木原 20 女 杉山 36 女 大野 44 女 川田 78 ーー VBAは Private Sub Worksheet_SelectionChange(ByVal Target As Range) r = Target.Row k = Worksheets("Sheet2").Range("A10000").End(xlUp).Row Target.EntireRow.Copy Worksheets("Sheet2").Cells(k + 1, 1) Application.CutCopyMode = False End Sub これをソートして 性別 氏名 点数 女 杉田 13 女 木原 20 女 杉山 36 女 大野 44 女 川田 78 VBAは Sub test02() k = Worksheets("Sheet2").Range("A10000").End(xlUp).Row Worksheets("Sheet2").Range("A3:C" & k).Sort key1:=Worksheets("Sheet2").Range("c1") End Sub 質問者の場合に合わせて ・シート名 ・範囲 ・抽出の元となるデータ列(上記ではA列)、データ行の指定(操作者=利用者頼り) ・見出しの有無、位置 (上記では第2行目) ・ソートキーのデータの列(上記では点数列=C列) は実情にあわせてVBAコードを修正する必要がある。 ーー ソートへの自動実行は、今回は逃げた。 ==== ・反省など こういう「イベントの利用」は、自分が操作する場合は、まだしも、他人が操作する場合は、避けるべきとは思う。 質問に「選択する」と書いてあったので、まずこれを思いついたものだが。 ーー 空き列に抽出のサイン(同じ1文字など)を入力し、その文字を入れた行データをフィルタで抽出し、適宜コピー・(他シートなどへ)貼り付けして、後の処理をする方がよいとは思う。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.2

マウロの記録で取得したコードを変更したものです。 Sub Test() With Sheets("Sheet1") .Sort.SortFields.Clear .Sort.SortFields.Add Key:=.Range(.Cells(Selection(1).Row, "C"), .Cells(Selection(Selection.Count).Row, "C")), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .Sort.SortFields.Add Key:=.Range(.Cells(Selection(1).Row, "A"), .Cells(Selection(Selection.Count).Row, "A")), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With .Sort .SetRange Range(Rows(Selection(1).Row), Rows(Selection(Selection.Count).Row)) .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End With End Sub

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

選択行が多くなければ、(VBAの質問に持ち込まなくても)操作でやれば済むだろう。 (1)CTRLキーを押しながら、行を選択。 (2)コピーして、他シート(か他セル範囲)に貼り付け (3)ソートする、またはフィルタに持ち込む (4)その後の処理をする。 この後の処理で、何をするのか、質問に書かないと、回答に影響あるはず。 ーー VBAでやるにしても、どういう手順を考えているのか、VBAをやるレベルなら、自分で考えて 、それを質問に記述(文章で)すべきだ。 選択した行の未使用の、特定列にサインを立てて、フィルタを使うとかも考えられる。 こういう処理手順を考えることが、VBAでは大切。 手順が適当かどうかは、全体の処理の中で、決まる。 ーー 色んな手順が考えられるが、質問者の意向に合わない手順の回答は、無駄になるだろう。 中間に置いて、作業シートを使うか、配列を使うとか。 エクセルでは、ソートを使うのは現実にシートにデータを作らないとダメだろう。 ーー 小生なら、 (1)シートのクリックイベントを使い、 (2)他シート(特定の作業シート)に選択したデータを集めて、 (3)ソート (4)処理ーー>何をするのか書かないと。この辺は質問者に任せておけということか?不思議。 気が向けば、後刻、コード例を挙げるつもり。 ーー なぜ回答が出ないのか不思議だ。

0611birth
質問者

お礼

いつも甘辛ご教示有難うございます。 勉強させて頂きます。

関連するQ&A

専門家に質問してみよう