- ベストアンサー
エクセルで多項目の並べ替えをしたい(2)
- エクセルで多項目の並べ替えを行いたい場合について、マクロを使用して順序を整える方法が紹介されています。
- データはA列からL列まで入力されており、特定の列の優先順に並べ替えたい場合には、指定されたマクロを使用することで実現できます。
- マクロには条件に応じて昇順または降順の順序を指定する設定があり、空白セルも含めてデータを整理することができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 質問の意図が分かりました。 直接の解答というよりも、あくまでも、Excel VBAの一般論から、以下についてお答えしておきます。 >前回の補足欄に記述したようなDO~LOOPを使わなければならないという発想は私の勘違いでしょうか、 前回の補足にあった、コードをもう一度、読ませていただいたけれども、ここまで来るとなんともいえないですね。ただ、Excel VBAでは、Do~Loop は、それほど多くないということです。 Excel VBAのコーディングの原則論(「最適化」とMSでは言っています。)からですけれども、ループの判定のために、セルを使いますね。そのときに、もっとも良いのは、配列変数に入れたものを使うことですが、そうでないときにも、直接、セル(Rangeオブジェクト)にアクセスして判定すると、そのマクロの処理自体を遅らせるので避けたほうが良い提唱されています。 これは、原則的な話なので、別に、Do Loop でもよいですが、私個人としては、やはり、コードとして難しくなるような気がします。 http://oshiete1.goo.ne.jp/qa3413127.html #6 補足のコードに関して 動かしていないので断言できませんが、以下の Exit For は、生きていないように見えますね。Do Do ~ Loop Loop ですと、ループからの抜け出し Exit Do は、子供側から抜けられますが、孫側は、Exit Do を使えば、子供側に戻るだけで、完全には終わりません。一体、どこに飛んでるのかは、動かさないと分からないのです。 そういう場合は、もちろん、Exit Sub は別として、こういうコードは読みにくいです。 こういう場合は、片方を、For i ~ to などのFor と組み合わせ、Do For ~ Next Loop ( 逆もあり)にするという意見もあります。それは、あえて、Do For の組み合わせにするとか、抜け出しに Goto ステートメントにするかは、ユーザー選択の範囲です。読みにくいのは、他人の勝手な意見かもしれません。ただ、自分の読みにくいだろうと思います。それと、Do か、Loop 側に、Until とか、While など条件文をつけたほうがよいのですが、このつけ方も、なかなか気をつけないと間違えることがあるのです。 --- Do Do ・ ・ If Cells(k, 7).Value = "" Then r3 = r1 Exit For End If If Cells(k, 7).Value <> Cells(k + 1, 7).Value Then Exit For End If ・ ・ Loop Loop 最後に、こういうことを書いてあるテキストがあるのかっていうと、あるような・ないようなって思います。「最適化」に関しては、Microsoft MSDNのライブラリにも残っていますが、他に関しては、個々に存在しているわけではなくて、掲示板の中での寄せ集めです。
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 前の私のコードや今のコードに、どなたかが、判定を加えるというなら、かなり話は違ってくると思うのですが、今回の質問で出されたコード自体は、別に複雑なものではありませんから、エラーがなく、希望通りなら、別に問題ないと思います。 ただ、大事なことは、最初はどのような状態で、どんな結果にしたいかということだと思います。それは、前回、話が明確にされなかったのだったと思います。結果、まったく逆さましていたことに気がついたわけですよね。ExcelのVBAを何年もしている人なら気がつくことでも、最初は気がつきにくいわけです。 今、私が見た内容のコードからすると、前の話と違うような気がするのです。 それは、7列目の★の部分を、一旦、寄せ集めておいてから、並べ替える話だと解釈していました。逆に、★のないものは追い出しになるわけです。 だから、最初に、並べ替えで★を集めて、その範囲を取り直し、並べ替えをして行って、最後に、もう一度7列目の★を並べ替えるということだ思いました。それとは違うのでしょうか?
お礼
Wendy02さん、こんばんは。 いつもお世話になっております。 今回もご回答ありがとうございました。 この度は様々な記述の仕方や考え方などで大変勉強になりました。 改めて感謝いたします。 今後ともよろしくお願いいたします。
補足
>大事なことは、最初はどのような状態で、どんな結果にしたいかということだと思います :全くおっしゃるとおりで、目的が明確でなかったために色々ご迷惑をおかけいたしております。 7列目に入るデータは蔵書に対する個人的な評価なのですが、ランク順に、下記のようにしています。 1、★★★★★ 2、☆☆☆☆☆ 3、☆☆☆☆ 4、☆☆☆ 5、☆☆ 6、☆ 7、*(既読且つ未決) 8、空白(=未読) この1~8の【各ランク(の集団)】について、それそれ下記のような並べ替えをしたいということです。(前回質問時と並べ替え順は変えましたが) ア、個人評価(列7) イ、ジャンル(列11) ウ、作者(列9) エ、書名(列8) オ、m社評価(列2) カ、b社評価(列3) キ、c社評価(列4) ク、b社特記(列6) ケ、m社特記(列5) コ、b・c社評価年(列1) サ、廃棄の有・無(列12) シ、出版社(列10) 前回はランクとして★★★★★だけより明記していませんでした。 また、並べ替え順もコロコロ変わったので回答者の方にすると大変回答しづらかったのではないかと思います。 >7列目の★の部分を、一旦、寄せ集めておいてから、並べ替える話だと解釈していました。 :私もそのつもりで考えていたので、一旦(寄せ集めた)★★★★★について並べ替えをした後、次に☆☆☆☆☆以下を同様に並べ替えるためにDO~LOOPを使って、教えていただいた FOR EACH~NEXT を適用すればいいのかなと考えたわけです。 それで、前回最後の補足に書いたようなややこしいマクロになってしまいました。 希望通りにはなったのですが後日、DO~LOOP を使わなくてもWendy02さんに教えていただいた FOR EACH~NEXT だけですっきり解決できるのではないかと考えて書き直してみました。 試してみたところ希望通りになっているみたいなのですが、何か不安で確認をさせていただこうと思い質問を立てさせていただいた次第です。 つまり、今回の質問の眼目は、 私の意図する並べ替えは FOR EACH~NEXT だけで解決できるものであって、前回の補足欄に記述したようなDO~LOOPを使わなければならないという発想は私の勘違いでしょうか、といったようなことになるでしょう。
お礼
Wendy02さん、ご回答ありがとうございました。 前回の#6補足は、おっしゃるとおり読みにくいコードになっていますよね。 すっきりしない記述は何か問題があるような気がしますし、検証するのも厄介なのですが、何しろ頭のほうが元々厄介にできているので、それがコードにも出てしまうのだと思われます。(^^; >直接、セル(Rangeオブジェクト)にアクセスして判定すると、そのマクロの処理自体を遅らせるので避けたほうが良い :何となくわかりそうで多分すっかり理解しきれていないと思いますが、機会あるごとにまた教えていただきたいと思います。 面倒な(意味不明な)質問に根気良く、また真摯にご回答いただき本当にありがとうございました。 貴重なお時間を割いていただき心より感謝いたします。 今後ともよろしくお願い申し上げます。