なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

なでしこに画像のトリミングをやってもらう

ブラウザゲームスクリーンショットを撮りました。
ブラウザゲームはデータを参照するたびにロードを挟むので時間がかかります。
そこでスクショを撮ってローカルでぱぱっと見比べようとしたわけ。

f:id:tkizzz:20201123212612j:plain
2020年11月現在たいへん勢いのあるゲーム

ここで必要な情報はゲーム部分だけなので、上下左右はいらない。
なでしこでゲーム部分だけ切り抜いて画像保存しようという試みです。 f:id:tkizzz:20201123212503j:plain

プログラムの雰囲気

トリミングのサイズを調べる → 画像部分コピー → 画像保存でよさそう。
サイズを調べる部分以外は簡単です。

作業イメージとはイメージ
保存用イメージとはイメージ
fileとは変数
「*.jpg」ファイル列挙 //スクショのjpgがたくさんある
反復
 file=対象
 トリミングサイズ取得(file)//ここx,y,w,h調べる
 
 保存用イメージW=w
 保存用イメージH=h
 保存用イメージ画面クリア
 作業イメージ画像file
 作業イメージx,y,w,h保存用イメージ0,0画像部分コピー
 //作業イメージをfileへ画像保存 

●トリミングサイズ取得(file)
 //ここでx,y,w,hを調べて返す

x,y,w,hを固定して決め打ちすれば簡単にできるのですが、今回はブラウザゲーのトリミングです。
その日のブラウザの幅によってx,y地点が変わってしまいます
なので、左上の地点x,yをプログラムで探します!

f:id:tkizzz:20201123213119j:plain

色を取得する

「点取得」と「画像色取得」命令がありますがたぶん同じです。
点取得はx,yの色コードを取得します。
RGB(r,g,b)で返ってくるやつと同じで1677万色($FFFFFF)だか。

画像の左端あたりから点取得して、ゲームの「額縁」を探せばいいのです……?

y=200//てきとう
x10から200まで繰り返す
  色X[回数]=作業イメージx,y点取得 
  もし色X[回数]???ならば抜ける

色を決め打ちできれば楽なのですが、jpg画像は「それっぽい色」に劣化しているので「全く同じ色」になりません。
近い色を簡単に扱う方法は何かあったかな……?

画像グレイスケールを使う

f:id:tkizzz:20201123213226j:plain
画像グレイスケールしたところ
画像グレイスケールという命令があります。
これを使うと画像が白黒になります。
白黒になった画像から点取得すると、RGB(r,g,b)のrとgとbが同じ値、たとえばRGB(100,100,100)のような色になります。

RGB(r,g,b)のrgbが同じ値ということは、256色です。
1677万色が256色に減りました。
RGB(r,g,b)は$rrggbbなので、256で割った余りがbの値になります。

繰り返し点取得して256で割った余りを見てみます。

f:id:tkizzz:20201123213411j:plain
xを10から200まで点取得

0に近いほど黒で、255に近いほど白になります。
このゲームの場合、額縁は黒っぽくなっていって、白い部分があるのが特徴です。
前の点との差分で、急に20くらい白くなったら額縁だと思います。

f:id:tkizzz:20201123213533j:plain
xは29

さらにその点から上方向を見ます。
額縁にあたると黒くなるののでそこで「抜ける」

f:id:tkizzz:20201123213636j:plain

作業イメージとはイメージ
作業イメージ位置「0,0」
作業イメージ画像「20201123_00.jpg」
作業イメージ画像グレイスケール
y=200
x10から200まで繰り返す
  色=作業イメージx,y点取得
  色x[回数]=%256
  作業イメージx,y赤色点描画
  もし回数1ならば続ける
  もし色x[回数]>色x[回数-1]+20ならば//20以上白くなった
    母艦タイトル「x={x}」
    抜ける

yy-1から10まで繰り返す
  色=作業イメージx,y点取得
  色y[回数]=%256
  作業イメージx,y赤色点描画
  もし回数1ならば続ける
  もし色y[回数]<色y[回数-1]-20ならば//20以上黒くなった
    母艦タイトル「x={x},y={y}」
    抜ける

w,hも同様に額縁をつたって端まで行けばOKです。
額縁の白いところが判明したので、あとはてきとうにx,yから定数を引いて左上ということにします。

グレイスケールした画像は捨てて、もう一度作業イメージに画像をロード。

f:id:tkizzz:20201123212612j:plain
トリミング前

「作業イメージのx,y,w,hを保存用イメージの0,0へ画像部分コピー」して……
出来上がり!

f:id:tkizzz:20201123213829j:plain
トリミング後

なでしこの配列カスタムソートについて理解したい

配列カスタムソート、あんまり使ったことがない……
マニュアル見てもよくわからない……
いじって試すしかない。

配列カスタムソート ( はいれつかすたむそーと )
引数 {参照渡し=?}AをSで|Aに
説明 配列AをプログラムS(文字列で与える-比較用変数はAとB)でソートする。Aの内容を書き換える。

マニュアル探査艦にサンプルがあるのでまず見てみる。

名簿「やすし,30
かつじ,20
ただお,12
ますじ,18」

名簿「年令順処理」配列カスタムソートして表示。

●年令順処理
  A「,」区切る。A=INT(A\1)
    B「,」区切る。B=INT(B\1)
    それ、A-B
//ファイル名の配列を更新日時順にカスタムソートするサンプル
ファイル列挙する。
それ「AとBでファイル更新日時比較」配列カスタムソート
それメモ記入

●ファイル更新日時比較(AとBで)
 A日時とは文字列=Aファイル更新日時
 B日時とは文字列=Bファイル更新日時
 もしA日時B日時ならば-1戻す
 違えば1戻す

いじってわかったこと
・A,Bは比較用変数という。
・配列カスタムソートから呼ばれる関数はA,Bに値が入った状態で始まる
・A=配列[0] B=配列[1]みたいに要素が入ると思えばOK
・関数終了時の戻り値(「それ」や「戻した値」)を使う。
 ・戻り値がマイナスの時、Aを上に配置する。(AがB未満)
 ・戻り値がプラスの時と0の時はBを上に配置する。(BがA以下)

「年令順処理」の元データをいじって同年齢の人を配置してみたところ、
下に配置した人が上にソートされる。
A-Bが0の時、つまり同じ値だと入れ替えが起こるのは表ソートも同じ。

そうそう、表ソートの命令は同じ値だと入れ替えするんですよね……
エクセルのソートでは同じ値は入れ替えしないので、エクセルに慣れているとソート後の順序が違って戸惑う。

配列カスタムソートではエクセル風ソートができる。
A-Bが0の時に入れ替えがおこらなくすればよい。
同じ値の時は0ではなく-1を戻すと入れ替えにならない。

//サンプル
「1,A
2,B
3,C
1,D」CSV取得
それ0表ソート //→D,A,B,C の順 Dが同値のAと入れ替わって上にくる
表示

「1,A
2,B
3,C
1,D」CSV取得
それ「配列カスタムソート用」配列カスタムソート //→A,D,B,C の順
表示

●配列カスタムソート用
 もし(A[0]>B[0])ならば1戻す //Bより大きい場合は入れ替えて上へ
 違えば-1戻す //同値はこっち

まとめ!
・配列カスタムソートは配列から2つとってきてA,Bに入れて比較
・比較結果(戻り値)がマイナスの時はAを上に送る(Aが小さいので、小さい順で上)
・比較結果(戻り値)がプラスの時と0の時はBを上に送る(0だと入れ替えが起こる)
・表ソートでは同値は入れ替えになるが、配列カスタムソートでは同値の入れ替えを防げる
 ・0のときは-1を戻すようにすればよい

おまけ!
・配列カスタムソートで呼ばれる関数に「Aを表示」などを入れると計算順序がわかる
 ・たぶんマージソートと呼ばれるアルゴリズム


応用

A,Bはグループであっても動作する。
ゲーム作りをする場合、配列に入れたグループをHP順にする時などに使える。

■キャラ型
 ・名称
 ・HP
 ・攻撃

//キャラを4体作る
r0から3まで繰り返す
 c[r]キャラ型して作成
 c[r]名称=「ロボ{r}号」
 c[r]HP=乱数(100)
 c[r]攻撃=乱数(100)

●キャラ表示
 txtとは変数
 r0から3まで繰り返す
   「名称,HP,攻撃」「,」区切って反復
     txtc[r]対象追加 //←パラメータのとりだし
     txtタブ追加
   txt改行追加
 txt表示

●キャラカスタムソート(項目)
 それ=(A項目 - B項目) //←A,Bはキャラ型のグループ A→HP など。
 

//カスタムソート表示
「名称{タブ}HP{タブ}攻撃」表示
キャラ表示

「HP順」表示
c「キャラカスタムソート("HP")」配列カスタムソート
キャラ表示

「攻撃順」表示
c「キャラカスタムソート("攻撃")」配列カスタムソート
キャラ表示

f:id:tkizzz:20201024123418j:plain

なでしこの「無限ループの書きだし」を考える

今回は(も?)あまり役に立たないことを考えます。
具体的には「無限ループの書きだし」を考察します。

1ループ //←ここ
  回数表示
  もし回数>=3ならば抜ける

いつも手癖で「1でループ」と書いていますが、なぜこう書いているんだろうかと疑問に思いました。
どこかで例を見たのか、自分で決めつけたか……

「1でループ」じゃなくてもうすこし一般的な日本語に近くなりませんかね?

「ループ」「間」どちらを使うか

「ループ」と「間」は同じ命令です。
 (条件)
 (条件)ループ
で記述し、(条件)のところにループ条件を入れます。
今回は無限ループなので条件には「真になるもの」が入ります。

サンプルやネットで無限にループする例を見てみます。
結果は……

 オンの間  真の間  1の間

「1で」どころか「ループ」じゃなくて「間」が一般的……?
「ループ」のリファレンスも確認。

『(条件式)のループ...』で条件式が真の時...の文を繰り返し実行する。
説明 『~の間~』と同じ意味です。

結論:「ループ」よりも「間」が優勢。 ループは少数派!

検索性を考える

「ループ」…「グループ」が大量にひっかかる(グループコピーなど)
「間」 …「時間」と「部品間隔」がひっかかる(システム時間など)

どっちもどっちか?

条件の部分を考える

『(条件)の間~』の条件部分は(真)相当になるものをいれて無限ループとします。
なでしこの(真)に相当する定数をあてはめてみましょう。

 はいの間  必要の間  オンの間  真の間
 成功の間  OKの間  1の間

どれも一般的な日本語に近い感じがない……
「必要の間」はすこしいい雰囲気を出している気はします。

結論:保留

「1でループ」の「で」ってなんだ?

リファレンスをみて気づいたのが「で」の扱いです。
「で」は助詞です。

たとえば表示の場合は「を」「と」が助詞として使用できます。

【名前】表示 (ひょうじ)
【引数】{=?}Sを|Sと
【説明】画面に文字列Sを表示する

『(条件)の間』『(条件)のループ』という説明しかないのに「1でループ」は動いているのです。
『(条件)(助詞)間』『(条件)(助詞)ループ』の形をとればなんでもいけるのでは?
助詞とされているものを手あたり次第試してみました。

結構多くのものが通りました。
「1はループ」「1とはループ」は通りませんでした。

[成立するもの]
 1からループ  1までループ  1までをループ
 1までのループ  1でループ  1をループ
 1のループ  1がループ  1にループ  1へループ
 1とループ  1してループ  1だけループ
 1くらいループ  1なのかループ  1としてループ
 1よりループ  1ほどループ  1などループ
 1ってループ  1ではループ  1てループ

番外編で、「1,ループ」は成立しました。

結論:助詞は比較的自由!

再び条件の部分を考える

『(条件)(助詞)間』『(条件)(助詞)ループ』の条件をもう一度。
なでしこは0以外の数値もしくは0文字でない文字列が真ですから、大きな数や長い文字列はTRUEとなります。


 πの間  // ぱいのあいだ
 赤色の間 // セキショク ノ マ

↑ πや色定数は数値なので無限ループを形成できます。(黒色以外)
意味不明度が増すだけなのでやめましょう。


 無限にループ //!変数宣言が必要だと使えない
 ずっとループ //!変数宣言が必要だと使えない

↑未定義の変数名「無限」「ずっ」が2文字なので無限ループになります。
!変数宣言が必要 になっているとエラーが出るので不便です。


 成功するまでループ

↑パスワードなどの入力を繰り返し聞くときには有能そうです。
逆にループの中身が「失敗するまで繰り返す」だと意味不明になります。


 今年の間     //【名前】今年 (ことし)  【説明】今年が何年かを返す。
 来年までループ  //【名前】来年 (らいねん) 【説明】来年が何年かを西暦で返す。

↑「今年」「来年」は関数です。西暦を値で返すので真になるでしょう。
ちなみに年をまたいでも止まりません。微妙にわかりにくい。


 「永遠」にループ  //文字列は0文字でなければ真

↑文字列を条件に使うのは自由度が高そうです。
意図が伝わりにくいでしょうか。もう一息!


 「抜ける」までループ
 「戻る」までループ

↑……読みやすいかもしれない!
すこしプログラムに慣れた人は混乱するかも。


「抜ける」までループ
  回数表示
  もし回数>=3ならば抜ける

やりきった感がありますが、たぶんまた「1でループ」って書くと思う。

なでしこの作業フォルダにご注意する

windowsのタスクバーにピン止めしてある
 .nakoファイルのショートカットを起動すると、
  作業フォルダがsystem32になる。

以上です。
全国共通かどうかは知らない!

詳細

まずwindowsのタスクバーについて。
スタートボタンを含む帯状の、起動中のウィンドウのアイコンがでるエリア…で通じる?
右クリックからピン留めすると気軽に固定できる。

マイピクチャに保存した「test.nako」で確認。

//test.nakoの中身
作業フォルダ表示
母艦パス表示

「test.nako」をダブルクリックで起動すると……作業フォルダはマイピクチャ
「test.nako」をタスクバーから起動すると……作業フォルダはSYSTEMパス
いずれの場合も母艦パスはマイピクチャと表示される。

作業フォルダがSYSTEMパスだとどうなる?

隣のファイルを参照するときに問題になる。
「設定.txt」開く などの相対パスを指定した場合、作業フォルダから探す。
母艦パスの設定.txtを開くことはないので、ファイルが見つからずエラーになる。

画像の指定やファイル列挙などの相対パス指定も作業フォルダが基準なので、ピン留めから起動したときだけエラーになったりファイルが見つからなかったりする。

保存画像保存も危うい。
相対パスで.nako近くに保存先を指定したつもりがSYSTEMパスにどんどん放り込まれるのでは。

対策

「{母艦パス}設定.txt」 のようにフルパスで指定しておけばエラーにならない。

母艦パス作業フォルダ変更 とプログラムの先頭に書いておくのも手かもしれない。
ただし、忘れたころに見直して「この一行無駄だな」って言って消すことはあるかもしれない。

なでしこでクリックイベント中にクリックイベントが発生したら、どうなる?

クリックすると1から100まで数字がカチャカチャ増えていくラベルを作る。

ラベルAとはラベル
そのクリックした時
 100回
   ラベルAテキスト回数
   0.05秒待つ

100になるまで5秒かかる。
じゃあ5秒以内にまたクリックしたらどうなる?

つまり「クリックした時」のイベントでループが動いているときに 「クリックした時」が発生するとどうなるか。
実験!

実験用のプログラムは以下。
ラベル1個だとよくわからないので、5個にしてテスト。

r1から5まで繰り返す
  bbb[r]ラベルして作成
  bbb[r]テキスト「0」
  bbb[r]タグ=r
  bbb[r]クリックした時
    ループ様子(イベント部品タグ)
 
●ループ様子(n)
 100回
   bbb[n]テキスト回数
   0.05秒待つ

[プログラムの内容]
・ラベルを5つ作る(bbb[1]~bbb[5])
・ラベルをクリックすると、ラベルのテキストが1→100まで変化(0.05秒おき)

このラベルbbb[1]をクリックし、テキストが50くらいの時にラベルbbb[2]をクリックするとどうなるか。
実行してラベルをぺちぺち!

[実験結果]
・1度目のクリックでラベルの数値が1.2.3...と増える
・別のラベルクリックした時、1つ目のラベルは「45」で停止
・2つ目のラベルは数値が1.2.3…100と変化
・2つ目が100になったあと、1つ目のラベルが46.47.48…100と変化

[結論]
イベント中にイベントが発生すると、最初のは一時停止、2個目が実行される。
2個目が終了すると最初やつの続きからになる。

スタックに積んで新しいイベントを先に消化するようだ。


リストのクリックでフォルダを選んで中の画像をパラパラアニメにして表示するプログラム、クリック時は~で無限ループ使っていた。
めっちゃポチポチするとスタックオーバーフローすることが予想される。
どうせ公開していないので、自分だけ気を付ける。

なでしこで変数分配を使い倒してみる

2020/7/27 訂正・追記:
母艦のサイズを例にした部分「x,y,w,h」の変数に入れていますが、
サイズが返す値は「x1,y1,x2,y2」なので以下は読み替えてください。
(後から気づいた)


「変数分配」っていう命令があります。

【名前】変数分配 (へんすうぶんぱい)
【引数】{=?}AをSへ|AからSに
【説明】配列Aの要素の各値を文字列Sの変数リスト「変数,変数,変数...」へ分配する。

結構便利なのですがややマイナーか。使用例をいくつか。

//抽出文字列+変数分配で使う例
 今日「(####)/(##)/(##)」ワイルドカードマッチ
 抽出文字列「yyyy,mm,dd」変数分配

//区切る+変数分配で使う例
 母艦サイズ「,」区切って「x,y,w,h」変数分配

//二次元配列を反復+変数分配で使う例
 窓列挙してCSV取得
 反復
   対象「handle,クラス名,テキスト,id」変数分配

うん、結構便利!

問題点と工夫

●テスト
  xとは変数
  yとは変数
  母艦サイズ「,」区切って「x,y,w,h」変数分配
  x表示 //→ローカル変数
  y表示 //→ローカル変数
  w表示 //→グローバル変数
  h表示 //→グローバル変数

関数内で変数宣言がされているものはローカル変数になり、
されていないものはグローバル変数に入ります。
これは!変数宣言必要とちょっと相性が悪い感じ。

!変数宣言必要
母艦サイズ「,」区切って「x,y,w,h」変数分配
w表示 //→エラー 厳密に宣言してください

ゲームを作るなら!変数宣言必要にしたほうがよいので工夫します。

//グループメンバに変数分配する
!変数宣言必要
■SIZE型
 ・x
 ・y
 ・w
 ・h

テスト
●テスト
  sizeとはSIZE型
  sizeについて  //~~についてのブロック内で
    母艦サイズ「,」区切る
    それ「x,y,w,h」変数分配 //変数分配すると、メンバに入る
    x表示 //→ size.x が表示される

「(グループ)について」のブロック内で変数分配を使うとメンバに入ります。
結構便利!

便利に使う

csvのデータを加工する際に、見出しをそのまま変数名にすることもできます。

「id,カード名,コスト
1,槍,100
2,斧,200」CSV取得
反復
  もし回数==1ならば
    見出し=対象「,」配列結合 // 見出し=「id,カード名,コスト」
  違えば
    対象見出し変数分配
    カード名表示 //→槍、斧

↑お手軽なプログラム向き

↓重厚なプログラム向き

!変数宣言必要
■カード型
 ・id
 ・カード名
 ・コスト
 
カードとは変数
カードリストとは変数
「id,カード名,コスト
1,槍,100
2,斧,200」CSV取得してカードリスト代入

//カード[id]にCSVのデータをいれる
カードリストロード
●カードリストロード
 cardとはカード型
 見出しとは変数
 カードリスト反復
   もし回数==1ならば
     見出し=対象「,」配列結合
   違えば
     cardについて
       対象見出し変数分配
       cardカード[id]ループコピー

カード[1]カード名表示 //槍
カード[2]カード名表示 //斧

csvデータの列が増えることを見越した書き方になったと思います。
結構便利!
(別件で、自作のシンタックスハイライトが「グループコピー」の「ループ」に反応したので何か考えます)


文字列型になることに注意

言い忘れたことがあります。
変数分配で入った変数は「文字列型」になります。
型によるバグは……あるかもしれないし、ないかもしれない。

 母艦サイズ「,」区切って「x,y,w,h」変数分配
 デバッグ

f:id:tkizzz:20200715202610j:plain
文字列型になる

なでしこで自動クリックツールを自作する

自動でクリックしてくれるプログラムを作りました。
汎用ではなく、特定のウィンドウ専用のやつ。
3日で2回作り直しました。
その時のメモです。


簡単だと思ったのに!

なでしこにはこのツールに必要な命令が分かりやすくそろっています。
・x,yへマウス移動
・マウスクリック
・s秒待つ
これらをループして混ぜればできあがり!...のはずでした。

・ウィンドウの位置が変わると微調整が必要
・スクロールが必要だった
・ロード時間が超長い時がある
順番に解決していきます。

ウィンドウ位置を変更する

操作対象のウィンドウの位置を固定しましょうか……

HANDLESIZE窓ハンドルサイズ設定

この命令はハンドルとサイズを渡すと移動と幅と高さの設定をしてくれます。
いきなり要求レベルが上がった気がします。

ちょろく生きたいので、母艦の左上のカドを操作対象の左上に合わせてクリックで座標取得することにしました。

窓位置エディタとはエディタ
そのテキスト座標
そのクリック時
  窓位置エディタテキスト母艦位置

エディタなら取得後にコピーも簡単。
これを基準値にして相対座標で記述していけば位置関連は解消。

//操作対象の左上からの相対座標(x,y)をクリック
●マウス移動B(x,y)
 txt=窓位置エディタテキスト
 窓位置X = txt「,」まで切り取る
 窓位置Y = txt「,」まで切り取る
 x=x+窓位置X
 y=y+窓位置Y
 x,yマウス移動
 0.02秒待つ

スクロールさせる

普段は何気なくホイールを回す操作ですが思ったより面倒な奴です。
ホイールのスクロール量はwindowsの設定で変えられるので久しぶりに起動したら暴走する未来が見えます。

キーボードの下キーやPgDown、HomeやEndをキー送信するほうがよさそうです。

●下キー送信
 『{DOWN}』キー送信
 0.02秒待つ

マニュアル探査艦でキー送信を検索すると出てくる通り、『{DOWN}』とかで指定します。

ロード時間に対応する

ネット関連でなくとも外付けHDDだったり、巨大jpgだったり、不定の時間を「待つ」必要が出てきました。
この待ち時間を適切にとらないと、先のキー送信が無視されたり、あらぬところにキー送信されたりしてしまいます。

長めにとるのが簡単ですが、その想定を超えると事故が起こります。
具体的には、バックで開いていたブラウザの広告バナーをめっちゃ連打しました。
やはり「ロードが終わってからマクロを進める」を実装する必要があります。

//カーソル位置が赤なら抜けるサンプル
imgとはイメージ
img可視オフ
1ループ
  x=机上マウスX
  y=机上マウスY
  img「デスクトップ」窓キャプチャ
  col=imgx,y点取得
  col=RGB分解(col)
  母艦タイトルcol
  もしcol=="255,0,0"ならば抜ける //赤色ならば抜ける
  0.2秒待つ

//RGB(r,g,b)を"r,g,b"に戻す
●RGB分解(color)
 rgbとは変数
 rgb[0]=INT(color/256/256)
 rgb[1]=INT(color/256)%256
 rgb[2]=INT(color%256)
 rgb「,」配列結合
 それ戻す

そこで使ったのは 「窓キャプチャ」と「点取得」です。
窓キャプチャはイメージ部品に画像をキャプチャする命令で、点取得はイメージのx,yから色を取得する命令です。
ロードが終わったら何かが表示されるはずなので、それを色で読み解こうということです。

マクロを途中から始める

たとえば「A画面でクリック→B画面がでるまで待つ→B画面でクリック→C画面がでるまで待つ→C画面でクリック→最初に戻る」というマクロを作っている時、すでに画面がB画面である場合。

次イベントとはコンボ
そのアイテム「A画面クリック,B画面クリック,C画面クリック」「,」区切る
そのテキスト「A画面クリック」

実行ボタンとはボタン
そのクリックした時実行ループ

●実行ループ
 1ループ
   script=次イベントテキスト
   それ=0
   scriptナデシコする
   もしそれ==0ならば抜ける //マクロ終了
 母艦タイトル「実行終了」

//ナデシコするで呼ばれる
●A画面クリック
 次イベント「B画面クリック」
 //ここにロード待ちループ
 //ここにクリックイベント
 2秒待つ
 1戻す

●B画面クリック
 次イベント「C画面クリック」
 //ここにロード待ちループ
 //ここにクリックイベント
 2秒待つ
 1戻す

●C画面クリック
 次イベント「A画面クリック」
 //ここにロード待ちループ
 //ここにクリックイベント
 2秒待つ
 1戻す

コンボボックスを作って、そのテキストをナデシコするで関数を呼び出ししました。
「1を戻す」で成功扱いです。
ロードが終わらないなどのトラブルがあったら「0を戻す」で実行ループを抜けます。
途中から始められることと、コンボボックスを手動で空にすることでマクロを途中停止することができます。
途中から動作と停止は開発中に特に役に立ちます。


これらをループして混ぜればできあがり!