Excelマクロで元のセル位置で並び替えする方法

このQ&Aのポイント
  • Excelマクロを使用して、元のセル位置でデータを並び替える方法について説明します。
  • 提供されたマクロは、「ユーザー設定の基準」に従ってデータを並び替えるものですが、機能上の問題があります。
  • マクロの修正方法についてアドバイスを提供します。
回答を見る
  • ベストアンサー

元のセル位置で並び替え

添付画像にあるように「並び替え実行前」⇒「並び替え実行後」になる「ユーザー設定の基準」で並び替えるマクロを書きましたが、「悪い例」のようになってしまいます。 元のセル位置で並び替えるには「.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

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

  • ベストアンサー
  • SI299792
  • ベストアンサー率48% (715/1480)
回答No.1

そのような並べ方をするのは不可能です。 並べ替えの後   [E1] = [C1]   [C1] = [B1]   [B1].ClearContents 又は   Dim Colu As Integer '   For Colu = 3 To 2 Step -1     Cells(1, Colu).Insert xlToRight   Next Colu の様にデータを移動するしかありません。 これらは元データが必ず1つ鳶の状態が前提です。 元データ位置が決まっていない場合、ソート前にデータを記憶、ソートしてから元あった位置にデータを当てはめるプログラムが必要になります。

KIKAIDER01
質問者

補足

最終結果が添付画像の「並び替え実行後」のようになればいいので、これで充分です。ありがとうございました。 このマクロをSheet1ではなく、アクティブシートで実行するには、 「Worksheets("Sheet1")」 を「ActiveSheet」に変えれば、よろしいでしょうか?

その他の回答 (4)

  • SI299792
  • ベストアンサー率48% (715/1480)
回答No.5

>「Worksheets("Sheet1") 」を「ActiveSheet」に変えれば、よろしいでしょうか? やってみたらどうですが。 私の所ではうまくいきました。 元プログラムは、Worksheets("Sheet1")とActiveSheetが混在しているので、統一した方がいいと思います。 ちなみに、 ActiveWorkbook. も消して大丈夫です。

KIKAIDER01
質問者

お礼

ありがとうございました。ご教示のおかげで、素晴らしいシステムが出来上がりました。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.4

誤字があったので差し替え 力技ですが、以下のコードはいかがでしょうか。 Sheet2を作業シートに使っています。 ざっくり言えば Sheet1をSheet2に複写 Sheet2上で並べ替え Sheet2の1行目、1列目から、 sheet1の1行目で値の埋まっているセルに順番に転記しています。 <==訂正 Sub aaa()    Dim i As Long  Dim j As Long  Dim k As Long    With ActiveWorkbook   'データをSheet2に複写   .Worksheets("Sheet2").Cells.ClearContents   .Sheets("Sheet1").Rows(1).Copy .Sheets("Sheet2").Rows(1)      'Sheet2上で並べ替え   With .Worksheets("Sheet2")    .Sort.SortFields.Clear    .Sort.SortFields.Add _     Key:=Range("A1"), _     Order:=xlAscending, _     CustomOrder:="松,竹,梅", _     DataOption:=xlSortNormal    With .Sort     .SetRange Range("A1:Z1")     .Header = xlNo     .MatchCase = False     .Orientation = xlLeftToRight     .SortMethod = xlPinYin     .Apply    End With   End With      i = 1   j = 1   k = 0   Do    If .Sheets("Sheet2").Cells(1, i).Value = "" Then Exit Do    k = 0    j = 1    Do     If .Sheets("Sheet1").Cells(1, j).Value <> "" Then      k = k + 1     End If     If i = k Then      .Sheets("Sheet1").Cells(1, j).Value = .Sheets("Sheet2").Cells(1, i).Value      Exit Do     End If     j = j + 1    Loop    i = i + 1   Loop    End With End Sub

KIKAIDER01
質問者

お礼

参考になりました。ありがとうございました。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.3

力技ですが、以下のコードはいかがでしょうか。 Sheet2を作業シートに使っています。 ざっくり言えば Sheet1をSheet2に複写 Sheet2上で並べ替え Sheet2の1行目、1列目から、 sheet1の1行目で値の埋まっていないセルに順番に転記しています。 Sub aaa()    Dim i As Long  Dim j As Long  Dim k As Long    With ActiveWorkbook   'データをSheet2に複写   .Worksheets("Sheet2").Cells.ClearContents   .Sheets("Sheet1").Rows(1).Copy .Sheets("Sheet2").Rows(1)      'Sheet2上で並べ替え   With .Worksheets("Sheet2")    .Sort.SortFields.Clear    .Sort.SortFields.Add _     Key:=Range("A1"), _     Order:=xlAscending, _     CustomOrder:="松,竹,梅", _     DataOption:=xlSortNormal    With .Sort     .SetRange Range("A1:Z1")     .Header = xlNo     .MatchCase = False     .Orientation = xlLeftToRight     .SortMethod = xlPinYin     .Apply    End With   End With      i = 1   j = 1   k = 0   Do    If .Sheets("Sheet2").Cells(1, i).Value = "" Then Exit Do    k = 0    j = 1    Do     If .Sheets("Sheet1").Cells(1, j).Value <> "" Then      k = k + 1     End If     If i = k Then      .Sheets("Sheet1").Cells(1, j).Value = .Sheets("Sheet2").Cells(1, i).Value      Exit Do     End If     j = j + 1    Loop    i = i + 1   Loop    End With End Sub

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

エクセルで、思考的に、標準では、並べ替えは、行方向(縦方向)データのソートです。 列方向ソートは、何かと難しい、何かと注意が必要。このことを初心者はよく知ったええで、表の設計をするべきです。特にVBAを使う場合なども。 ーー ソートには、並べる基準となるデータがも、レコード内に必要です。 普通は(第1には、文字列の左からの文字の文字コードで行われる。数字や日本語のカナは常識的な順番(それも昇順)になるように、文字コード自体が設定(設計)してあります。 また、エクセルのユーザー定義による順番は、特別なもので、1段階前の処理がエクセルでなされているものと察します。エクセルから学習に入った初心者は、この機能が普通と考えると思うが、他のソフトやプログラムなどで実現するのは、一発では、済まない内容です。 ーー 基本論は、当初の状態を再現できるような、データを、前もってシートに作っておかないとなりません。たとえば行番号(数字か記号やカナなどで) それに基づき、再ソートして、元に戻すほかない。 ーー 本件はユーザー定義の並び替え機能(ユーザー設定リストによる並べ替え) を使ったのかどうかもはっきりしない。質問文に、結果の図示だけで説明できると思うのは間違いだといつも力説している。エクセルの課題で、回答をする立場になるとわかる。 ーー 操作的に直前に戻る、などは可能な場合があるが、いろいろ処理が進んだ後で当初に戻すのは、それなりの事前の仕掛けデータが必要。 ーー 「excel ユーザー定義 並べ替え」「excel ユーザー設定リスト  並べ替え」などでGoodleででも照会し、勉強してから質問したらどうか。奥が深いか所だと思う。

関連するQ&A

  • エクセル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

  • マクロのシートでのコピーができません。

    ビスタ エクセル 2007を使用しています。B2~E12まで簡単な表を作り E列で昇り順に並べ替えしました。そして並べ替えからこの表を印刷するまでマクロで完成しました。 ところが、別のシートにコピーすると印刷はされますが、並べ替えがされずに印刷だけされます。同じ表を30枚作成し、それぞれ同じ操作と印刷のマクロを組みたいのですが・・・・どなたか助けてください。 Sub ボタン5_Click() ' ' ボタン5_Click Macro ' ' Columns("E:E").Select ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("E1"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").Sort .SetRange Range("B2:E12") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ActiveWindow.SelectedSheets.PrintOut Copies:=1 End Sub

  • EXCELでマクロが

    昨日から、期待する動きでなくなりました。 シートに新たに数式を加え、rank関数ではきちんと表示するのですが、マクロを動かすと、 期待した動きでなくなりました。 Sub Sheet2STD昇順並べ替え() ' ' Sheet2STD昇順並べ替え Macro ' ' Range("B6:V24").Select ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Range("C7:C24") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet2").Sort .SetRange Range("B6:V24") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("A1").Select End Sub 図にある下向きの矢印にマクロを登録しています。

  • マクロ 並び替え

    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列目からになると思っていたのですが。 マクロ初心者のため詳しい方がいれば教えて下さい。

  • エクセルのマクロ記録を他のシートでも実行したい

    エクセル2010を使用しています。 シート1でマクロ記録を使用しデータの並び替えをし、 同じブック内にシート1をコピーしてシート2としました。 このシート2でもシート1で行ったデータの並び替えをしたいのですが シート2ではマクロは実行されませんでした。 わからないながらもVBAを見たところ下記のように 記述されおりましたが、どのような修正をすればよいかご教授いただけると助かります。 ちなみに、シート1でマクロを記録し、そのシートを同ブック内に複数コピーして それぞれのシートでマクロを実行させるということを考えています。 Sub Macro1() ' ' Macro1 Macro ' ' Range("A11:Q17").Select ActiveWorkbook.Worksheets("1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("1").Sort.SortFields.Add Key:=Range("B11:B17"), _ SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:="日,月,火,水,木,金,土" _ , DataOption:=xlSortNormal ActiveWorkbook.Worksheets("1").Sort.SortFields.Add Key:=Range("A11:A17"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("1").Sort .SetRange Range("A11:Q17") .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub

  • フォルダ内の全てのファイルを降順で並べ替え

    VBAは本を入門書を読み始めたばかりの初心者です。 一つのフォルダ内にエクセルファイルとcsvファイルが混在(400くらいずつ)あります。このうちエクセルファイルのみ降順で並べ替えをしたいと思います。データの範囲はA1:I501で1行目は見出しでA列は日付が入っているのですが、日付が昇順で入っているため日付を基準にして降順にしたいです。全てのファイルにシートは一つしかありません。 マクロの記録で作成したところ Sub 並べ替え降順() ' ' 並べ替え降順 Macro ' ' Columns("A:A").ColumnWidth = 10.63 '先ずA列の幅を整える Range("A1:I501").Select ActiveWorkbook.Worksheets(1).Sort.SortFields.Clear ActiveWorkbook.Worksheets(1).Sort.SortFields.Add Key:=Range("A1"), _ SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets(1).Sort .SetRange Range("A2:I501") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub こんな感じになったのですが、これをフォルダ内の全てのエクセルファイルにおなじ処理をするにはどうしたらよいのでしょうか?詳しい方いらっしゃいましたらどうぞよろしくお願いします。

  • マクロ 並び替え エラーがでる

    マクロの記録で以下のようなマクロを作りましたが、実行するとエラー91「オブジェクト変数またはブロック変数が設定されていません」とでます。どう直したらよいでしょうか? Sub Macro6() Columns("A:L").Select Selection.AutoFilter ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Add Key:=Range _ ("A1:A497"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _ xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("B2").Select End Sub

  • 【Excel2010マクロ】シート名を固定したくな

    マクロには全然詳しくないので、マクロの記録を利用して下記のようなデータの並び替えのマクロを作成したのですが、sheet名が「Sheet2」(大文字小文字区別無し)じゃないとマクロが動きません。 -------------------- Sub 並び替え() ' ' 並び替え Macro ' ' Columns("A:A").Select Columns("A:AR").Select With ActiveWorkbook.Worksheets("Sheet2").Sort .SortFields.Clear .SortFields.Add Key:=Range("AN:AN"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AC:AC"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AD:AD"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AF:AF"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AG:AG"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AH:AH"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AJ:AJ"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AK:AK"), Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("AN:AN"), Order:=xlAscending, DataOption:=xlSortNormal .SetRange Range("A:AR") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub -------------------- マクロを実行するsheet名は都度変わりますので、sheet名を固定しなくてもデータを並び替えられるようにするには、どのようにしたらよろしいのでしょうか?

  • エクセルの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

専門家に質問してみよう