• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel VBAで2列セットでソートする方法)

Excel VBAで2列セットでソートする方法

このQ&Aのポイント
  • Excel VBAを使用して、2列のデータをソートする方法について教えてください。
  • 指定したシートから2列のデータをコピーしてきて、別のシートでB列を使ってソートする方法を教えてください。
  • データの使い勝手を向上させるために、指定した配列のデータを特定の方法で並び替えたいです。どのようなマクロを使えば良いでしょうか?

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

  • ベストアンサー
回答No.1

マクロでなければならないのでしょうか? 単純にソート機能を使う際に、最優先するキーにA、2番目に優先されるキーをBとしてソートすればお望みのソートが 可能ですが。 もし、それをマクロ化したいのであれば、その一連の動作をマクロで記録して、必要に応じていじるだけですぐ出来る と思いますよ。

quindecillion
質問者

お礼

ボタン一つで全てのデータを整理できるようにと思ってやってますので、どうしてもマクロなのです。 「Excel VBA マクロ」という質問条件ですのでそこをご理解ください。 普通に「データ」-「並べ替え」をしても並び変わらずに四苦八苦していたので質問させて頂きました。 既に「Bで並び変えた」状態のデータだった為、「Bで並び変えてAで並び変える」ができなかったのではないかと思われます。 並べ替えの指定順序を「Bの次にA」としていたのから「Aの次にB」と変更すると無事並び替えができ、そのマクロを記録し、内容を確認しました。 その結果、自分が記載していたマクロが 範囲指定 キー1、オーダー1でB並びかえ 範囲指定 キー2、オーダー2でA並びかえ としていたことが並び変えができない原因であると判明致しました。 記載の仕方がおかしかったようです。 お手数をお掛け致しました。

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

その他の回答 (1)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

sub macro1()  worksheets("Sheet1").range("A:C").copy destination:=worksheets("Sheet2").range("A1")  worksheets("Sheet2").select  range("A:C").sort key1:=range("A1"), order1:=xlascending, _   key2:=range("B1"), order2:=xlascending, header:=xlno end sub といったカンジでしょうか。

quindecillion
質問者

お礼

ご返事ありがとうございます。 range("A:C").sort key1:=range("A1"), order1:=xlascending, _   key2:=range("B1"), order2:=xlascending ここの部分を range("A:C").sort key1:=range("A1"), order1:=xlascending range("A:C").sort key2:=range("B1"), order2:=xlascending としていたことが間違いでエラーがでていたと判明いたしました。 「ピリオド」を使用し、 range("A:C").sort key1:=range("A1"), order1:=xlascending, _   key2:=range("B1"), order2:=xlascending としたことで無事解決致しました。 お手数をお掛けして申し訳ありません。

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

関連するQ&A

  • VB2005からExcelのソートを行う方法

    現在、VB2005からExcelを動かしていますが、Excelのセルに番号を振っておき、それに応じてソートやオートフィルターなどを行うことって可能ですか? ExcelVBAなら、 Sub sort1() 'ソートを実行するサンプル Range("B10:C16").Sort Key1:=Columns("B") End Sub →B10からC16までをB列によりソートする。 みたいにできるようなんですが・・・。 あと、VBからExcelを動かすような場合、役立つ本とかありましたらあわせて教えてください。

  • 配列のソートについて

    配列をソートした時、もともとデータのあった配列番号を記憶しておきたいのですが いい方法はないでしょうか (31,55,84,20,96,14); //1 2 3 4 5 6 ↓ (14,20,31,55,84,96) //6 4 1 2 3 5    ※ソート前の配列番号 いくつかの行(配列A)の、違う列にあるデータを抜き出して配列Bにまとめた後、配列Bをソート その後、配列Bのもともとの順番の位置の行にあるデータを上からコピーしていく感じで行ごとのソートを考えています イメージはこんな感じです a[0]=[1,512,200]; a[1]=[3,100,1]; a[2]=[4,100,265]; a[3]=[8,300,1]; //ソート対象を抜き出す b[0]=a[0][1]; b[1]=a[1][2]; b[2]=a[2][0]; b[3]=a[3][1]; b.sort(); c[0]=a[b[0]のソート前の配列番号]; c[1]=a[b[1]のソート前の配列番号]; c[2]=a[b[2]のソート前の配列番号]; c[3]=a[b[3]のソート前の配列番号];

  • ★エクセルマクロコード教えていただけますでしょうか

    マクロのコードを組みたいと考えておりますが、 ほとんど初心者のため、お詳しい方の力を貸していただきたい次第でございます。 m(__)m ○オートフィルターーでデータをソートし、そのソートごとのシートを自動作成。  その後、そのシートを各フォルダに保存したい。 あるデスクトップ上にあるエクセルシート「管理DB」の「sheet1」にある管理データ A列(グループa~e)、B列(登録日)、C列(ステータス)によって構成されているシートで、 1.A列「グループ」「a」でオートフィルター 2.その中でB列、「登録日」が「2012年9月」以前のものをオートフィルター 3.その中で、さらに「ステータス」が「在庫中」のものをオートフィルター 4.3段階のオートフィルター後にできた結果を、別のエクセルシートとして作成。 5.そのエクセルシートをデスクトップにある「フォルダX本部」に保存。 1~5の一連の作業をグループがなくなるまで繰り返したいと考えています。 1.A列「グループ」「b」でオートフィルター 2.その中でB列、「登録日」が「2012年9月」以前のものをオートフィルター 3.その中で、さらに「ステータス」が「在庫中」のものをオートフィルター 4.3段階のオートフィルター後にできた結果を、別のエクセルシートとして作成。 5.そのエクセルシートをデスクトップにある「フォルダY本部」に保存。 ※一連の作業の中で、グループ名と、シートの保存先が変わる以外、この作業の繰り返し。 以上の作業を実行するマクロを組むことは可能でしょうか。 また、マクロのコードを教えていただけると幸いです。 マクロについてお詳しい方、何卒よろしくお願いいたします。

  • エクセルでのソート

    こんにちは いつもお世話になっています エクセルのソートについて教えてください。 以下のようなデータがA列にあります。 Sheet1 Aグループ 愛知県 青森県 秋田県 Bグループ 石川県 茨城県 岩手県 愛媛県 Cグループ 大分県 大阪府 岡山県 沖縄県 香川県 鹿児島県 B列以降にデータがあり、複数グループが複数シートに渡ってあります。 ソート手順は例えば、Aグループ、愛知から秋田を範囲選択しソート、次にB、石川から愛媛を範囲選択しソート、以下同じ、Sheet1が済んだらSheet2へ、という作業手順です。 グループごとの件数は異なるが、ソートする優先キー(列)は第一がB列、第二がC列で同じです。 ソート処理自体はマクロの自動記録でやっていますが、グループごとに範囲選択しマクロを使う手順です。 ここで質問ですが、複数シートに複数グループがあります。各シートの各グループの件数は不一致です。これらのグループをなるべく簡単に上記のような同一基準でソートするにはどうすればいいでしょうか。

  • Excel VBA - 列をシート別に分ける

    Excelブックにsheet1のみあり、A~BIを使った表があります。 G列が社名で、20社(A社、B社、C社・・・)くらいが出てきます。 このうち、特定の4社(B社, D社, G社, I社)のみのデータを、その社名をシート名にして書き出したいと思っています。 つまり、以下を4社分やるということです。 1. G列を"B社"でオートフィルタをかけて、フィルタ結果をコピーする。 2. 新規シートを挿入して、シート名を"B社"にして、フィルタ結果を貼り付ける。 お願いします。

  • エクセル マクロ VBA での部分参照ソート

    エクセル2003で 下記のようなデータをソートし、 【ソート前】 2208550 92059184 92059174 92059174B 92059174A 92059174C 1348535 19777225 2519034 2519034D 2519034B 2519035A 2519035C 【ソート後】 1348535 19777225 2208550 2519034 2519035A 2519034B 2519035C 2519034D 92059184 92059174 92059174A 92059174B 92059174C 上記ソート後の結果を得られるマクロを作りたいです。 文字列の右にABCが付与されるコードです。 よろしくお願いいたします。

  • こんなソートがしたいです。教えてください!

    エクセル2003で 下記のようなデータをソートし、 【ソート前】 2208550 92059184 92059174 92059174B 92059174A 92059174C 1348535 19777225 2519034 2519034D 2519034B 2519035A 2519035C 【ソート後】 1348535 19777225 2208550 2519034 2519034B 2519034D 2519035A 2519035C 92059184 92059174 92059174A 92059174B 92059174C 上記ソート後の結果を得られるマクロを作りたいです。 よろしくお願いいたします。

  • マクロ ソートをしたいのですが、組み込めますか

    マクロの説明 1.Sub Sample7()はsheet4の列をソートするマクロです。 (単独では、このマクロでソートできる) 2.Sub sample2()はsheet4のソート以外は完成しています。 やりたいこと Sub sample2()の中にsheet4の重複データを削除したもののソートのコードを組み込みたい。 但し、組み込むとしてSub Sample7()のコードでよいのか、初心者なのでよくわかりません。 なお、Sub sample2()のマクロは途中省いています。 Sub Sample7() Sheets("sheet4").Range("A1:A1135").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes End Sub Sub sample2() Dim data As Variant 'データコピー用の使いまわし配列 Dim dic As Object Dim i As Long Set dic = CreateObject("Scripting.Dictionary") 'Sheet4~5のA列をリセット Sheets("Sheet4").Range("A2:A" & Rows.Count).ClearContents Sheets("Sheet5").Range("C3:C" & Rows.Count).ClearContents            ↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 'Sheet4に重複していないデータを書き込み With Sheets("Sheet4") .Cells(Rows.Count, "A").End(xlUp).Offset(1).Resize(dic.Count).Value = Application.Transpose(dic.keys) 'Sheet4のC列をSheet5にコピー data = .Range("C2:C" & .Cells(Rows.Count, "A").End(xlUp).Row).Value End With Sheets("Sheet5").Range("C3").Resize(UBound(data)).Value = data Set dic = Nothing End Sub

  • Excel VBA: オートフィルターの処理

    いつもお世話になります。 オートフィルターの処理をマクロでやれという指令がきました。具体的に言うと、 #|キー -+- 1|A<=カーソル位置 2|B 3|A 4|A 5|C 6|A 7|B のようなシートがあった場合、ツールバーのボタンをクリックするたびに #|キー -+- 1|A<=カーソル位置 =====隠れ 3|A 4|A =====隠れ 6|A ★ #|キー -+- =====隠れ 2|B<=カーソル位置 =====隠れ 7|B ★ #|キー -+- =====隠れ 5|C<=カーソル位置 =====隠れ のように遷移しなさいという問題です。 やっかいなのは、ボタンを押す間に別の作業が入る(同じマクロの連続実行の中で遷移させることができない。Excelを終了して(フィルター状態は保存)途中からやることもあることです。 最初は (1)フィルターがないときはカーソル位置のデータでフィルターする (2)フィルターがあるときは ((1))フィルターを解除する ((2))カーソル位置のキーを覚えておく ((3))下になめていって、覚えているのと違うキーが出てきたらその値でフィルターする みたいにしていたのですが、カーソル位置を常に見つかったのの中で先頭に戻しなさい、と言われたので、使えなくなってしまいました。(今ここです) キーの値のバリエーションを配列に入れて、言わば自前でフィルターを作ってやればいいのかもしれませんが、マクロを実行するたびに全データをスキャンすることになるので、遅くなると思います。 手動で「データ」=>「オートフィルタ」をやったときのフィルターの一覧を取り出して配列に入れることができれば一番いいと思うのですが、その方法が見出せませんでした。 ということで、 質問1:「データ」=>「オートフィルタ」をやったときのフィルターの一覧を取り出して配列に入れることはできるでしょうか 質問2:上の題意でどのようなプログラムが考えられるでしょうか 次は、同じ問題の発展形なのですが、  |キ|キ  |イ|イ #|1|2 -+---- 1|A|あ<=カーソル位置 2|B|あ 3|A|あ 4|A|い 5|C|い 6|A|い 7|B|う のようになったとき、ボタンを押すたびに、  |キ|キ  |イ|イ #|1|2 -+---- 1|A|あ<=カーソル位置 =====隠れ 3|A|あ =====隠れ ★  |キ|キ  |イ|イ #|1|2 -+---- =====隠れ 2|B|あ<=カーソル位置 =====隠れ ★  |キ|キ  |イ|イ #|1|2 -+---- =====隠れ 4|A|い<=カーソル位置 =====隠れ 6|A|い =====隠れ のように遷移しろというものですが、これもエレガントな書き方があるでしょうか。 一応キー1、キー2の値を配列にとって、キー1の個々の値でフィルターして、次にキー2の個々の値でフィルターする、ただし、キー1の値によってはありえないキー2の値でフィルターしてしまうかもしれないので気を付ける、というやり方は思いつくのですが・・・。 以上、よろしくお願いします。

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

専門家に質問してみよう