[32] マクロでのソート処理
いかくん [2005/10/15 07:16:04]
初めまして。簡単な一覧を作りたくて使用させていただい
てます。
今まで手動でやっていた作業をマクロに任せようかと思い
8bitのBASIC以降ご無沙汰だったプログラムもどきを作ろ
うとマクロ作成に挑戦しているのですが、一カ所引っかか
ってしまったので質問させてください。
マクロにてソート処理を指定する方法が本体同梱のヘルプ
には載っていないのですが、このサイトのリファレンスに
は「Sort();」が載ってますね。この関数を利用すると、
手動の時と同じく行、列他を指定する開くのですが、逆順
、昇順を指定する事は不可能なのでしょうか?
具体的には、RPGアイテムの所持リストの処理みたいな
ものです。欲しい物「○」入手済み「○」の様な欄が有り
欲しい物「高>安」入手済み「高>安」不要品「高>安」
の順に並べたいんです。
逆ソートが出来ないので
欲しい物「安>高」入手済み「安>高」不要品「安>高」
まではなんとか出来そうなのですが。
どなたかご存じでしたらよろしくご指導ください。
Re: [32] マクロでのソート処理
あすかぜ [2005/10/15 14:22:52]
ちょうどishiさんの掲示板でもソートの話題が出てますね。
http://keikichi.hp.infoseek.co.jp/cassava/
現状では、Sort(); はソートパネルを開くだけなので、マクロでソートを実行するにはソートのロジックを自作しなければなりません。
例えば、1列目に「欲しい物」、2列目に「入手済み」、3列目に値段があるとすると、次のマクロで全体をソートできます。
-------------------------------------------------------
function compare(y1,y2){
// 1列目の比較
if([1,y1] == "○" && [1,y2] != "○"){ return 1; }
if([1,y1] != "○" && [1,y2] == "○"){ return (-1); }
// 1列目が同じなら2列目の比較
if([2,y1] == "○" && [2,y2] != "○"){ return 1; }
if([2,y1] != "○" && [2,y2] == "○"){ return (-1); }
// 2列目も同じなら3列目の比較
if([3,y1] > [3,y2]){ return 1; }
if([3,y1] < [3,y2]){ return (-1); }
return 0;
}
for(y1 = 1; y1 < Bottom; y1++){
maxy = y1;
for(y2 = y1; y2 <= Bottom; y2++){
if(compare(y2, maxy) > 0){
maxy = y2;
}
}
for(x = 1; x <= Right; x++){ swap([x,y1],[x,maxy]); }
}
-------------------------------------------------------
条件の修正は compare 内をいじってください。現状では、1列目、2列目に"○"があれば"○"のついたほうを上位に置き、1列目と2列目が同じならば3列目を数値比較しています。
1行目に列名があるならばy1のfor文を2から始めてください。
マクロの標準機能としてソートもほしいところですね(^^;
早速のご返答有り難う御座います
いかくん [2005/10/15 22:01:32]
なるほど。最終的には、そっちの方向で頑張るかと思って
いたのですが、答え聞いちゃった(笑)(^^;
早速のご返答有り難う御座いました。これでなんとかなり
そうです。
Re: 早速のご返答有り難う御座います
あすかぜ [2005/10/16 00:19:42]
どういたしまして。
せっかくなので、クイックソートを実行するマクロをマクロページで公開しました。
http://www.asukaze.net/soft/cassava/macro/
びっくり
いかくん [2005/10/16 01:50:28]
先ほど、クイックソートの方拝見してびっくりしました。
ここまで対応して下さって有り難うございます。恐縮です。
当方の要望、なんとか実現できそうですので頑張ってみ
ます。上に記述して下さったサンプルでの数字比較すべ
き列が全角数字なので、これをfunction内で一度半角変
換してcompareして再度下記戻ししようかな?(文字コー
ド返せるのかな?)ってのと、メインループが正常に終わ
ってない?(100000回でストップ)ので、ここらへんを自
分の条件に合わせて効率化してみようかと思ってます。
うむー。20年のブランクは大きいですわ(笑)
Re: びっくり
いかくん [2005/10/16 01:52:54]
追記。TransCharn発見(^^;
Re: びっくり
あすかぜ [2005/10/16 11:51:02]
そういえば TransCharn なんてありましたねぇ。
対象が選択範囲(Sel*で指定)なんで気をつけてください。
ループ回数が上限に達するなら、クイックソートのコードを使うのもいいかもしれません。
再帰の時は数を数えてないんで、100000回の制限はありません。
かわりに、スタックオーバーフローするとCassavaごと落ちます(汗)
ブランクがどうとかいうより、Cassavaマクロの仕様がデタラメすぎるってのが問題な気もしますが・・・。