- ベストアンサー
EXCEL2010で2つの区分で並び替えたい方法教えてください
- EXCEL2010でA列とB列を2つの区分で並び替える方法について教えてください。A列にはA,B,Cといった文字列データが配置され、B列にはRRR~ZZZまでの文字列データがランダムに配置されています。A列のデータは各文字列がひとまとめになるように配置し、B列のデータも最初の3つのデータが存在しない場合は空欄にするようにしたいです。
- EXCEL2010でA列とB列を2つの区分で並び替える方法を教えてください。A列にはA,B,Cといった文字列データが配置され、B列にはRRR~ZZZまでの文字列データがランダムに配置されています。A列のデータはまとめて表示し、B列のデータも最初の3つのデータが存在しない場合は空欄にする方法を教えてください。
- EXCEL2010のA列とB列を2つの区分で並び替える方法について教えてください。A列にはA,B,Cといった文字列データが配置され、B列にはRRR~ZZZまでの文字列データがランダムに配置されています。A列のデータはグループ化して表示し、B列のデータも最初の3つのデータが存在しない場合は空欄にする方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Alt+F11よりVBEを開き、標準モジュールを挿入して下記のコードを貼り付けてください。 Alt+Qまたは右上の×よりVBEを終了し、Alt+F8または表示→マクロから マクロ一覧を表示して「A列並び替え」を実行してください。 (条件) ・A列は1行目からデータが入力されている必要がある ・A列データ群の最終行以降に余計なデータが存在しない 現状は上記条件下で動作しますが、 セル選択した範囲を対象としたいや、一定ルールで変化する範囲を対象としたいなど 要望があれば補足願います。 ■VBAコード Sub A列並び替え() Dim myDat As Variant Dim tmp As Variant Dim cnt(1) As Integer myDat = Range("A1", Cells(Rows.Count, "A").End(xlUp)) cnt(0) = 1 cnt(1) = 4 For Each tmp In myDat Cells(cnt(Int(tmp Like "*実") + 1), "B") = tmp cnt(Int(tmp Like "*実") + 1) = cnt(Int(tmp Like "*実") + 1) + 1 Next tmp Range("B1:B3").Sort Key1:=Range("B1"), order1:=xlAscending Range("B4", Cells(cnt(1), "B")).Sort Key1:=Range("B4"), order1:=xlAscending End Sub
その他の回答 (1)
- Nouble
- ベストアンサー率18% (330/1783)
済みません、理解できませんでした、お教えください。 A列は変更しない B列の列びのみを変更する 「実」と、いう字が付くものの 其の前はアルファベット一文字 この時、A~Cの3パターンのみである 「実」と、いう字が付かないものもあり 其の場合はアルファベット3文字と、なる この時、其の3文字のアルファベットは 同じものが並び 其れは、R~Zの、最大9パターンである。 よって、合わせて 最大12パターンからなる 此の際、重複は無い 場合によってA~Cの内 一つが掛ける事がある 其の際は、 其の掛けたものに相当する 並べかえ後の欄は 空にする と、いう事でしょうか? ニュアンス的には D1からD3、D4からD12まで、 各々において、 個々に割り振った個別の1文字の有無を 調べさせる 此の際、調べる文字は D1からD3にはAからCを、 D4からD12にはRからZに至るまでを 各々個々に個別に D4にはRのみを D5にはSのみを と、いったように 一対一対応で、担当させる そして、 あれば其処の文字列を 無ければ空を帰させる 文字D以降の空を並びから弾き出し 並びを連続させる D列の、結果を B列に反映させる と、いうもので いいのでしょうか?
お礼
回答ありがとうございました。困惑させてしまい申し訳ありませんでした。
補足
分かりづらくて申し訳ありません。 A列は変更しない →はい B列の列びのみを変更する →A列の並び替え結果をB列に配置です 「実」と、いう字が付くものの 其の前はアルファベット一文字 この時、A~Cの3パターンのみである →アルファベット1文字ではありません。文字数は不定。 実の前の文字は3パターンではありません。不定です。 「実」と、いう字が付かないものもあり 其の場合はアルファベット3文字と、なる この時、其の3文字のアルファベットは 同じものが並び 其れは、R~Zの、最大9パターンである。 →実が付かない場合もアルファベット3文字とは限りません。 同じものが並ぶとも限りません。 最大9パターンです。 よって、合わせて 最大12パターンからなる 此の際、重複は無い →そうです。 場合によってA~Cの内 一つが掛ける事がある 其の際は、 其の掛けたものに相当する 並べかえ後の欄は 空にする →そうです。 と、いう事でしょうか? ニュアンス的には D1からD3、D4からD12まで、 各々において、 個々に割り振った個別の1文字の有無を 調べさせる 此の際、調べる文字は D1からD3にはAからCを、 D4からD12にはRからZに至るまでを 各々個々に個別に D4にはRのみを D5にはSのみを と、いったように 一対一対応で、担当させる そして、 あれば其処の文字列を 無ければ空を帰させる 文字D以降の空を並びから弾き出し 並びを連続させる D列の、結果を B列に反映させる と、いうもので いいのでしょうか → そんな感じです。 ちなみにこれを質問してからも考えて、次の様な方法としていました。 C列に1から12までの順番を振る。 D列にA列末尾が実かどうかのフラグ判定をつける。A列末尾が実であれば0、それ以外は1。実を前側にもってきたい為の処理。 E列にD列のフラグが0であれば、フラグ0とA列を結合した文字列にする。 それ以外は先頭にC列の順番の番号とA列を結合。 E列を値で固定し昇順に並び替え。 これでE列に末尾が実を先頭とし、その後に末尾が実以外のデータが並びます。 F列にRIGHT関数で先頭のフラグを削除したデータを作成します。 E列3行目のデータ末尾に実が無ければ空欄にする処理は、次の通りです。 Range("F1")=IF(RIGHT(E1,1)="実",E1,"") Range("F2")=IF(RIGHT(E1,1)="実",E1,"") Range("F3")=IF(RIGHT(E1,1)="実",E1,"") Range("F4")=IF($F$3="",E3,E4) Range("F5")=IF($F$3="",E4,E5) … F12セルまで G列で1行目から3行目まではそのまま。4行目から12行目まで先頭1文字削除したデータとする。 といった感じにしました。
お礼
回答ありがとうございます。早々に回答頂き大変助かりました(*^。^*)
補足
条件に追加があります。 元々A列にある並びはそのままです。 なので、 Range("B1:B3").Sort Key1:=Range("B1"), order1:=xlAscending Range("B4", Cells(cnt(1), "B")).Sort Key1:=Range("B4"), order1:=xlAscending の部分は削除しました。 これで望み通りの並びになりました。