• ベストアンサー

エクセル ボタンでソートしたい

教えてください エクセル表で各列でソートしたい 列毎のマクロを書くのは大変なので、ボタンを表示しておき、その列のセルをクリックしてactive にしてから、ボタンをクリックしたらソートできるようにしたい。 Dim retuban retuban = XXXXXX strkey1 = retuban Selection.Sort Key1:=Cells(3, strkey1), のようにやればいいと思うのですが XXXXXの列名(AAなど)を取得するマクロがうまくいきません よろしくお願いします。

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

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

リスト形式になっているとします。 第1行に見出しが入っていて、第2行からデータが入っている形式。 データ範囲外をアクチブにしているときは、選択が信用できないとして、エラーにしている。 Private Sub CommandButton1_Click() cl = ActiveCell.Column MsgBox Cells(1, cl) & "列を選択" Set kyoutu = Application.Intersect(ActiveCell, Range("a1").CurrentRegion) If kyoutu Is Nothing Then MsgBox "列選択エラー" Exit Sub Else Range("A1").CurrentRegion.Offset(1, 0).Select Selection.Sort Key1:=Cells(1, cl) End If End Sub 実際データが第2行からでないときは、Offset(1, 0).の1を修正してみてください。

oldhisa
質問者

お礼

回答有難うございます。とても参考になります。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 >列名(AAなど) マクロを作るときにために、R1C1 <-> A1 方式の切り替えボタンを作って、ツールバーに入れておくと便利です。 >Selection.Sort Key1:=Cells(3, strkey1), Selection で取れるのですが、もう少し、考えたほうがよいですね。 それは、Cells(3, strkey1) の「3」は、本当に3でよいのか、ということです。 私は、相対参照方式で考えてみました。 Sub TestSort() Dim RetuBan As Integer '列の番号 Dim AreaRow As Long '行の番号  With ActiveCell.CurrentRegion  '並べ替えの範囲を取る   '違ったところでボタンを押したら、マクロを抜ける   If .Cells.Count < 2 Or .Cells.Rows.Count < 3 Then Exit Sub   RetuBan = ActiveCell.Column   AreaRow = .Cells(2, 1).Row 'その並べ替えの範囲の2行目の行番号を探す     '昇順並べ替え 'タイトルのあるなしは、不明(xlGuess)   .Sort Key1:=Cells(AreaRow, RetuBan), _      Order1:=xlAscending, _      Header:=xlGuess, _      OrderCustom:=1, _      MatchCase:=False, _      Orientation:=xlTopToBottom  End With End Sub

oldhisa
質問者

お礼

回答有難うございます。応用のきくやり方ですね。感謝!

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

#01です。すみません。質問を早とちりしました。 セルを選択してボタンクリックでマクロを起動するなら#02さんの回答で列番号が取得できます。 VBのグリッドコントロールのように表頭のボタンをクリックするだけで並べ替えを行う場合の方法について書きました。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

retuban = ActiveCell.Column でいけるのではないでしょうか。

oldhisa
質問者

お礼

回答有難うございます。 ActiveCell.Column ですと列番号を取得するようで、列名にならないのですが、列番号でソートするマクロがわかりません。

oldhisa
質問者

補足

勘違いしてました。これでいいんですね。有難うございました。うまくいきました。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

各列の先頭にボタンを配置して、ボタンが押された列をキーとして並び替えを行いたいということでしょうか? ActiveSheet.Shapes(Application.Caller).TopLeftCell.column で押されたボタンのカラム番号が取得できますよ。 (私もここで教えていただきました)

oldhisa
質問者

お礼

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

関連するQ&A

  • Excel2000のSORTマクロの質問

    ワークシート内にSortキー指定セルを3つ設定し、これをマクロで読み取って、最大3個までの sortを実行しています。 Selection.Sort Key1:=Range(strKey1), Order1:=xlAscending, Key2:=Range(strKey2), _ Order2:=xlAscending, Key3:=Range(strKey3), Order3:=xlAscending, _ Header:=xlGuess, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin 注)strKey1,strKey2,strKey3にはSortキーを行うセル番号(E11など)が入ります。 これですと、strKey2 と strKey3 に値が入っていないと「1004 アプリケーション定義またはオブジェクト定義のエラーです」と出るので、IF文を使って Sort命令自体を3つに分けて処理しています。 そこで質問なのですが、Selection.Sort 命令以降を『文字列変数』で記述して、strKey1,strKey2,strKey3の入力内容によって命令文を操作して、1つのsort命令で処理したいのですが、可能なのでしょうか? つまり、strKey2 と strKey3 が未入力ならば、 Selection.Sort Key1:=Range(strKey1), Order1:=xlAscending, _ Header:=xlGuess, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin …のようになるように、文字列として書きたいのですが、strKey1だけ指定する場合、 strSortString = "Key1:=Range(""" & strKey1 & """), Order1:=xlAscending, " & _ "Header:=xlGuess, MatchCase:=False, Orientation:=xlTopToBottom, " & _ "SortMethod:=xlPinYin" Selection.Sort strSortString と書きたいのです。 実際に上のようにやってみますと 「1004 入力した文字列は参照名または定義名として正しくありません。」と出ます。 基本的にsort命令はこのような使い方はできないのでしょうか? 分かりにくい説明ですみませんが、よろしくお願いします。

  • エクセルマクロのソートについて

    こんにちわ! エクセルマクロのソートについて質問です。 プロシャージャを使ってソート使いまわそうと思うのですが、範囲、並び替えキーを変えたいと思うのですが可能でしょうか? Sub Sort()    Range("A1:c10000").Sort _ Key1:=Range("a1") , Order1:=xlAscending _ , Header:=xlGuess _ , MatchCase:=False _ , Orientation:=xlTopToBottom _ , SortMethod:=xlPinYin End Sub 一応、動作はしませんが下記のようなイメージで動かしたいです。 Sub Sort() Dim key As String Dim hanni As String key = Range("a1") hanni = Range("A1:c10000") 'セルhanniの範囲のデータをkey列をキーに昇順に並べ替えます hanni.Sort _ Key1:=key _ , Order1:=xlAscending _ , Header:=xlGuess _ , MatchCase:=False _ , Orientation:=xlTopToBottom _ , SortMethod:=xlPinYin End Sub 可能でしょうか? わかる方おりましたらアドバイスの程お願いします。

  • エクセルのソートについて

    エクセルのソートを行なおうとして、下記の手順を行なったのですが ・キーとなる列のセルを 1 つクリック。 ・(昇順で並べ替え) をクリック。 そうしたら「この操作には、同じサイズの結合セルが必要です」と言うエラーメッセージが、出てきました。 どなたか、解決策を教えてください。 何卒宜しくお願い致します。

  • VBAのソートで

    お世話になります。 初歩的な質問なのですが・・。 表のソートをしたいのですが、 表は2行目に見出しがあり3列で100行の構成です。 下記の様な記述で表の範囲をセットするところでエラー がかかってしまうのですが、どうしたらうまくいくでしょうか。 どなたかご教示頂きたく宜しくお願い致します。    記 Sub ソート() Dim myrhg As Range Dim myar As Variant Dim i As Long Sheets("台帳").Range("A1").CurrentRegion.Select Selection.Offset(1, 0).Select Set myrng = Selection.Resize(Selection.Rows.Count - 1).Select myar = Array(1, 2, 3) With myrng For i = 0 To UBound(myar) .Sort key1:=Cells(1, myar(i)), Order1:=xlAscending, header:=xlYes Next End With Set myrng = Nothing End Sub

  • 【VBAでソートを実行したい】

    ExcelVBAでオブジェクトを設定し、ソートを実行したいのですが、エラーになってしまいます。 ロジックは下記のようにしていますが、問題の箇所はマクロの記録でコピーしたものです。 オブジェクトとして実行しているので、エラーになるのでしょうか? どなたか分かる方、回答をお願いいたします。 dim goBook As Object Set goBook = CreateObject("Excel.Application") 'セルをクリアする goBook.Cells.Clear goBook.Range("A1").Select 'ソート実行 goBook.Columns("A:A").Select ''//このロジックでエラーになります↓ goBook.Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin

  • エクセルで離れた行同士をソートする方法

    タイトルでは分かりにくいかもしれませんが。 0 10 0 5 1 9 2 4 2 8 4 3 3 7 4 6 こういった表になっているとき。 0 10 0 5 1 9 2 8 2 4 3 7 4 6 4 3 のようにA列とC列を連動させてソートする方法があれば教えてください。マクロになってしまうのならマクロでも結構です。

  • EXCEL VBA ソートにおいて

    EXCEL 2003 のVBAのsortにおいて、解決できなくて困って おります。 名前,色,産地,品質,味,値段,重さ, りんご,赤,青森,10,10,500,100 みかん,黄,和歌山,10,10,300,50 すいか,緑,群馬,10,8,2000,1000 メロン,黄緑,青森,10,8,2500,500 いちじく,赤,鹿児島,8,8,200,100 名前、品質、値段の順に並びかえたいと思い、 excelのVBAの記録でオートフィルタ後に 並び替えを行ったところ下記のコードが記録されました。 Sub Macro28() Cells.Select Selection.AutoFilter Selection.Sort _ Key1:=Range("A2"), Order1:=xlAscending, _ Key2:=Range("D2"), Order2:=xlAscending, _ Key3:=Range("F2"), Order3:=xlAscending, _ Header:=xlYes, OrderCustom:=1, _ MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, _ DataOption1:=xlSortNormal, _ DataOption2:=xlSortNormal, _ DataOption3:=xlSortNormal end sub ところが、これをオブジェクトのマクロに使用して(2,3行目を自分の使い たいように訂正)みると作動しません。 Private Sub CommandButton1_Click() worksheets(1).Select Selection.AutoFilter Selection.Sort _ Key1:=Range("A2"), Order1:=xlAscending, _ Key2:=Range("D2"), Order2:=xlAscending, _ Key3:=Range("F2"), Order3:=xlAscending, _ Header:=xlYes, OrderCustom:=1, _ MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal, _ DataOption2:=xlSortNormal, DataOption3:=xlSortNormal End Sub watch 式では 3行目までは worksheets(1).Select = TRUE ですし Selection.AutoFilter = TRUE となっているのですが、 sortの反応が分からない状況です。 Selection.Sort _ Key1:=Range("A2"), Order1:=xlAscending, _ Key2:=Range("D2"), Order2:=xlAscending, _ Key3:=Range("F2"), Order3:=xlAscending, _ Header:=xlYes, OrderCustom:=1, _ MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal, _ DataOption2:=xlSortNormal, DataOption3:=xlSortNormal この部分が問題なのかと考えております。 ネットで調べて worksheets(1).RANGE("A1:G6").Select Selection.sort…… とか worksheets(1).RANGE("A1:G6").sort とかも試してみたのですが、だめでした。 sort を使用するときにselectionとの相性や、 rangeとの兼ね合いで決まり等があるのでしょうか。 色々なサイトを回ってはいるのですが、ちょっと解決 にいたることができません。 どなたか、ご教授いただけると幸いです。

  • excelの他シートのソート方法

    VBA初心者です。 excelの他シートのソート方法についての質問です 同一ブック内に作業シートとDATAシートがあり、作業シートを常にアクティブ にしておいて、DATAシートは作業者にはシークレットとしたい。 この条件の中作業シートには入力規則のリストにより語句を選択する事とし リストの語句データーはDATAシート(AA列・AC列・・・)より引用しています。 隣接するAB列・AD列には語句を選択した回数を格納カウンターとして利用 そのカウンターを利用して、作業シートから選択頻度の高い順にソートをか けたいと考え以下のコードを記述し実行したところ”アプリケーション実行時 エラーが出ます。 DATAシートからの実行では問題なく走りますが、DATAはシークレットとした いところから、解決方法が分からず悩んでいます。 どなたか、ご教示の程宜しくお願いします。 ☆以下記述コード Sub Listsort() Dim lCol As Long Dim myRng As Range Dim Key As String For i = 27 To 37 Step 2 Key = Sheets("DATA").Cells(2, i + 1) With Worksheets("DATA") yline = Cells(Rows.Count, i).End(xlUp).Row Set myRng = .Range(Cells(2, i), Cells(yline - 3, i + 1))※補足 myRng.Sort _ Key1:=.Range(Key), _ Order1:=xlAscending, _ Header:=xlYes, _ Orientation:=xlTopToBottom End With Next End Sub ※Cells(yline - 3, i + 1))-3はリスト内の3項目は最終行に固定したいため

  • エクセル VBA セルのソートの際に・・・

    いつも皆様には大変お世話になっております。 今回の質問は、BというファイルのデータをコピーしてAというファイルにい書き込むというマクロを組んでいるのですが(下の構文です)これ自体はうまく動いているのですが、Aのファイルでそのデータをソートかけたときにうまくソートされません。何でソートされないのかもさっぱりです。 セルH7に名前が入っているのですが、名前でソートかけたいのです。でもBファイル構文でコピーした名前はソートできずに終ってしまいます。 手入力で名前を入れた分はソートできます。 皆様よろしくお願いいたします。 Sub Bファイル構文() Dim e e = Range("C3") Windows("A.xls").Activate Cells(65535, 2).End(xlUp).Offset(0, 6) = e ActiveWorkbook.Close SaveChanges:=True End Sub Sub Aファイル構文() Range("A7:BE156").Select Selection.Sort Key1:=Range("H7"),Orer1:=xlDescending,:=Range("B7") _, Order2:=xlAscending, Key3:=Range("C7"), Order3:=xlAscending, Header:= _xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _SortMethod:=xlPinYin, DataOption1:=xlSortNormal, DataOption2:= _xlSortNormal, DataOption3:=xlSortNormal End Sub

  • エクセル マクロ:文字変更

    教えてください。 sheet5にデータがあります。 マクロを実行すると、一番右の列のセルに○があると●と書き換える 一番右の列のセルに△があると▲と書き換えるコードを作成しています。 下記のコードでは時間がかかってしまいます。 省略 If Sheets("sheet5").Cells(r, cmax).Value = "○" Then Sheets("sheet5").Cells(r, cmax).Value = "●" 省略 AutoFilterを使用してマクロを作成しましたが、列に○と△が両方無いと 範囲指定したセルがすべて▲となってしまいます。 下記コードをどのように手直ししたらよいのか教えて頂けないでしょうか。 よろしくお願いします。 Sub 文字変更() Dim c As Integer Dim cmax As Integer Dim rmax As Long With Sheets("sheet5") rmax = .Range("A3").End(xlDown).Row cmax = .Range("A3").End(xlToRight).Column .Rows("1:1").Select Selection.AutoFilter For c = 2 To cmax Selection.AutoFilter Field:=c, Criteria1:="○" .Cells(1, c).Offset(1, 0).Select .Range(Selection, Cells(rmax, c)).Value = "●" Selection.AutoFilter Field:=c, Criteria1:="△" .Cells(1, c).Offset(1, 0).Select .Range(Selection, Cells(rmax, c)).Value = "▲" Selection.AutoFilter Field:=c Next c End With Selection.AutoFilter End Sub

専門家に質問してみよう