● UWSCでの自動化プログラムの書き方(基本的なミニTIPS)~自動化機能を持たないソフトの自動化~
※まだ書きかけです。すみません。また、自分自身、UWSCでのプログラムを作る際に見るだけなので間違いがあってもそのままです。ヒント、などにしてください。

「UWSC」は大変便利で価値の高いソフトです。が、使ってみた感じ、「各命令の実行のタイミングが重要視されるソフト」のような気がしますので、速度の出ない重いパソコンではそのタイミングがズレてしまい、例えばサンプルのようにはなかなか思いどおりに正常に動かないかもしれません。そのことだけ あらかじめご了承ください。

※関連記事
UWSCの「記録」機能で作成した自動化ファイルを手っ取り早く「 ”ゆっくり動作” から速く動くように作り変える」方法。~記録した内容からマウスの動きを削って、ボタンが押されるタイミングを早くする方法(Excelを使います)~

UWSCにて、管理画面から作成した「現在アクセスされている共有ファイルやフォルダのフルパスのリスト」を使って、「それらを除外してXcopyする」ための「除外リスト」の自動作成の方法

UWSCにて、Windows2000で、現在開かれている共有ファイルのフルパスを文字列で取得する方法(コマンドラインでの処理ができるように)

UWSCでの自動化で、あるファイルの内容を読み込んで別のファイルに書き出しする方法

WordPress・Win10 ~ UWSCとBasp21を使って、キャプチャ画像をFTP自動送信し、その画像のImgタグを自動生成する(「OnePress Image Elevator」プラグインのかわり)

URLリンクのHTML文の自動生成 ~UWSCでの自動化例~

目次
● プログラムを実行直後に中断させる
● 操作対象となるウィンドウを決める
● Windowsのショートカットキーを使う方法
● キーボードを使う
● 特定の画面でダブルクリック
● //ダブルクリックのみ
● 作業中のファイルのウィンドウを閉じる
● 1つのキーを繰り返し押す
● ウィンドウのタイトルが無い場合のIDの取得方法
● アクティブウィンドウのIDをGETしたい場合に、その記述するコードを求める方法
● アクティブウィンドウのクリック可能な部分をGETしてコードを求める
● clkitemの「種別」部分が不明なので知りたい
● ダイアログ等のキャプション内容を取得して条件分岐したい場合
● メニューの階層を踏まえてクリックしたい場合
● 数分待つが、ある場所の文字列で条件分岐したい場合のサンプル
● 文字列表示やSENDSTRに改行を混ぜたい場合
● フォルダの有無を調べて条件分岐するサンプル
● フォルダの中にファイルがあるかどうかを調べて条件分岐するサンプル
● 指定した名前のファイルがあるかどうかで条件分岐するサンプル
● プログラム自体の実行を中断
● FOR、IFF、WHILE、REPEAT、のループを抜ける
● 処理を数秒待つ
● DOSコマンドを実行したい場合
● フォルダを開いて表示し、中身の確認をしたい場合
● アプリ起動
● コマンドプロンプト画面の起動
● 文字列を自動入力したい場合
● デバッグ表示したい場合
● 任意のテキストボックス(または入力可能なリストボックス、コンボボックス)に文字列を入れる
● 対話式ボックスの組み込み
● あらかじめ作ってある本年用のフォルダをダブルクリックで開く
● コマンドプロンプト命令での「"」ダブルクォーテーションの処理
● メッセージで改行させる時の方法
● ジャンプ代わりの関数の呼び出し例
● IEの起動
● Excel起動01
● Excel起動02
● Excelのマクロセキュリティダイアログを開く
● 自作関数と引数のエラーについて
※Shift+TABキー、もしくは、Homeキー、Homeキー+TAB数回、を押すと、目次付近に戻れます。
  
  
● プログラムを実行直後に中断させる

Alt+F2 で止まります。

● 操作対象となるウィンドウを決める

以下のWebサイトに置いてあるスクリプト(プログラム)を使います。
これを実行することによって、「操作対象にしたいウィンドウの設定文字列」や「クリック可能なものに対する命令文字列」などが取得できます。(「UWSCコードの断片生成器」というらしいです。これが無いと僕は何もできません・・・。)

【UWSCの誘惑】
http://nem.symphonic-net.com/uwsct/0610uwsct.html
※素晴らしいサイトなので、ぜひ、皆様ご覧になってみてください。
「眠たい詩人」さま には本当に感謝しています。

例として、ここでは、例えば
http://nem.symphonic-net.com/uwsct/fcuc090117.uws.txt
にあるプログラムを使います。

この内容を「すべて選択」でテキストファイルにコピペしてまずは「txt」の拡張子のまま保存します。
名前を「UWSCコードの断片生成器090117.txt」とします。

できたら、txt拡張子 を 「uws」という拡張子に変更します。
メッセージが出ますが構わず保存します。
名前は「UWSCコードの断片生成器090117.uws」に代わります。

このときこのプログラムを動かす前に、「UWSC.exe」と「uws」という拡張子を関連付けしておきます。(やり方→「ファイル(拡張子)とアプリケーションソフトを関連付けする方法~UWSCを例に~」)

関連付けができたら、操作対象としたいソフトやファイルを開き、「UWSCコードの断片生成器090117.uws」をダブルクリックします。

下図のように「××秒後にアクティブな窓の情報を取得します。」と出るので、その秒数のカウントダウンのあいだに、「操作対象にしたいウィンドウやダイアログなど」のタイトルバー付近をクリックし、アクティブにしておきます。

なお、「操作対象」にできるものは、各アプリケーションソフトの画面、フォルダウィンドウ、各種設定ダイアログボックス画面、各種ウィザード画面、エラーや注意喚起・進行状況等々の各種メッセージ表示、進捗画面(プログレスバー画面)、等々、(反応しようがしまいが)およそクリックできるものはほとんどすべてです。(ただ、画面の作り方が特殊らしい?と操作対象にできない場合があります。)

秒数のカウントダウンがゼロになると操作対象部品の自動取得が始まりますので、しばらく待ちます。
終わるとメモ帳が開いて、デスクトップに、次のような先頭の内容のファイルが出来上がります。

########################################

===== id=2 ========================================
***** status()情報より汎用記述 ********************
// doscmd("C:\Program Files\Internet Explorer\iexplore.exe",TRUE)
exec("C:\Program Files\Internet Explorer\iexplore.exe")
id=getid("http://nem.symphonic-net.com/uwsct/fcuc090117.uws.txt - Internet Explorer","IEFrame")
***** status() ********************

########################################

このうち、
id=getid("http://nem.symphonic-net.com/uwsct/fcuc090117.uws.txt - Internet Explorer","IEFrame")
が、「操作対象にしたいウィンドウの設定文字列」です。
(設定文字列=命令文の事例とお考え下さい。必ずじゃないですが、そのまま命令文としてコピペして使える場合も多いです。なお、exec(・・・・)は、ソフトの起動の命令です。)

id=getid("http://nem.symphonic-net.com/uwsct/fcuc090117.uws.txt - Internet Explorer","IEFrame")
のままだと
タイトルバーの箇所に「http://nem.symphonic-net.com/uwsct/fcuc090117.uws.txt」が表示されたウィンドウを対象にしてくれますし、
id=getid("Internet Explorer","IEFrame")
という感じに削ると、今アクティブのIEのウィンドウを操作対象にすることもできます。
id=getid("タイトルバーの文字列の一部","ソフトの種類?")
みたいな雰囲気です。

id=getid("タイトルバーの文字列の一部")
だけでも大丈夫な場合もあります。

「id=getid(・・・)」の部分の「id」は ウィンドウに付ける名前(変数)です。
好きな名前を付けてOKです。
例えば操作対象にしたいExcelのウィンドウに、例えば「Excel窓01」という名前を付けたかったら、
「Excel窓01=getid("Book1") 」とか
「Excel窓01=getid("excel") 」
などと書きます。
それ以降は、そのウィンドウを「Excel窓01」として扱えます。

たとえばその「Excel窓01」ウィンドウに対して、Ctrl+S(上書き)の操作をしたい場合は、
SCKEY(Excel窓01,VK_CTRL,S)
と書けば、それができます。

※補足
Excel窓01=getid("Book1") と
SCKEY(Excel窓01,VK_CTRL,S) を、
「Excel窓01」を使わずに1行で済ましてしまいたい場合は、
SCKEY(getid("Book1"),VK_CTRL,S)
と書くこともできます。
でもあまりこれを使うと、プログラムコードが読みにくくなるので僕はあまりやりません。

なお、「id=getid(・・・)」の「=」を誤って全角で書かないようにご注意ください。
でないとエラーになってしまうので、必ず半角で書きます。

※なお、この「UWSCコードの断片生成器」で生成されたtxtファイルの中には、「clkitem(tpadwndw,"書式\右端で折り返す",CLK_MENU)」のように、「メニューバーのメニューを押下した操作」の命令文も生成されます。そちらも是非使ってみてください。

● Windowsのショートカットキーを使う方法

Windowsのショートカットキーでの操作を自動化するには、「SCKEY」と、仮想キー の定数を使います。
(「仮想キー」の実際の値については、ヘルプかWeb検索のほうを見てみてください。)

たとえば「Alt+F4」なら次のようにします。

SCKEY(My-ID,VK_ALT,VK_F4)

※上記のMy-IDや下記のGETID("TrueCrypt")の部分は、操作対象のウィンドウのことをさしています。

SCKEY(GETID("TrueCrypt"),VK_ALT,VK_F4)
//TrueCrypt を ALT+F4で閉じる。ALTは押しっぱなしにしないといけないのでKBDではなくSCKEYを使う。SCKEY関数ではVK_ALTを指定しただけで押しっぱなしとみなされる。

アルファベットのキー以外は「VK_」とつくみたいです。
(よくわかってません。)
でもアルファベットのキーに「VK_」を付けても動きます。

Crtl+Sなら、次のようになります。
SCKEY(GETID("TrueCrypt"),VK_CTRL,S)
または
SCKEY(GETID("TrueCrypt"),VK_CTRL,VK_S)

//Ctrl+Aで「すべて選択」する
SCKEY(tpadwndw,VK_CTRL,A)
または
SCKEY(tpadwndw,VK_CTRL,VK_A)

//「貼り付け」する=Ctrlキーを押しながらVキー を押す
SCKEY(貼り付けターゲットの画面ID, VK_CTRL, VK_V)
SCKEY(getid("名前を付けて保存","#32770"), VK_CTRL, VK_V)

//「コピー」する=Ctrlキーを押しながらVキー を押す
SCKEY(貼り付けターゲットの画面ID, VK_CTRL, VK_C)

//TABキーを押す(フォーカス移動など)
KBD(VK_TAB,CLICK,100)

//TABで戻る
SCKEY(貼り付けターゲットの画面ID, VK_SHIFT, VK_TAB)

//ウィンドウをアクティブにする
id01=getid("Yahoo","IEFrame")
CTRLWIN(id01, ACTIVATE)

チェックボックスにレ点マークを入れる・消す→→→スペースキーの繰り返し
ドロップダウンリストを出す→→→Alt+↓キー
メニューバーやリボンへフォーカスを移す→→→Alt
作業の中断→→→ESCやCtrl+C、Ctrl+Break
画面をキャプチャ→→→PrtSc
Fnキー操作→→→Fn
日本語モードの切り替え→→→半角全角キーを押したのち(日本語入力が有効の状態で)、Alt+カタカタひらがなローマ字キー

参考URL
・よく使うショートカットキー:~「ビジネスパソコン操作の基礎と2倍3倍の効率化」「パソコンでの自動化と20倍30倍の効率化」に役立ちます~
https://euc-access-excel-db.com/tips/ct09_biz-pctec/ct090201_biz_pc_basic/shortcutkey

● キーボードを使う

SCKEY

KBD
を使います。

SCKEYは特定のウィンドウやダイアログにキー操作や文字列を送るときに使います。
KBDは特定にウィンドウとは関係なく、ただ、キーを使う感じです。

※ KBDの例
//「はい(Y)」を押す場合のコード
KBD(VK_Y, CLICK)

//TABキーを押す(フォーカス移動など)
KBD(VK_TAB,CLICK,100)

//TABで戻る
SCKEY(貼り付けターゲットの画面ID, VK_SHIFT, VK_TAB)

//Enterキーを押す
KBD(VK_ENTER,CLICK,100)

//←キーを押す
KBD(VK_LEFT,CLICK,100)

//←キーを4回押す
KBD(VK_LEFT,CLICK,100)
KBD(VK_LEFT,CLICK,100)
KBD(VK_LEFT,CLICK,100)
KBD(VK_LEFT,CLICK,100)

● 特定の画面でダブルクリック

clkitem(ウィンドウのID,アイテムの名前,CLK_DBLCLK)

ヘルプで「CLKITEM」で調べると、指定できるアイテムやダブルクリック以外のその他の情報も出てきます。

● ダブルクリックのみ
//BTN(LEFT,DOWN,482,463,562)
//MMV(482,463,10)
//BTN(LEFT,UP,482,463,94)
//MMV(482,463,10)
//BTN(LEFT,CLICK,482,463,110)

● 作業中のファイルのウィンドウを閉じる

【CTRLWINを使う場合】
//「MMCid」というIDのウィンドウを閉じる
CTRLWIN(MMCid, CLOSE)

【SCKEYを使う場合】
//開いたTeraPadのウィンドウを「tpadwndw」という名前で ターゲットウィンドウに設定
tpadwndw=getid("TeraPad","TTeraPadMainForm")
ショートカットキー
//ウィンドウを変更なしで閉じる //Alt+F4で閉じる
//上書きするかどうかのところは、SCKEYを使うと画面が残ってしまうので、KDB命令を使いました。
SCKEY(tpadwndw,VK_ALT,VK_F4)
KBD(VK_TAB,CLICK,0)
KBD(VK_ENTER,CLICK,0)

【SCKEYを使わない場合】
//ウィンドウ内の737,351をクリック
BTN(LEFT,DOWN,737,351,125)
BTN(LEFT,UP,737,351,110)
//Alt+F4で閉じる
KBD(VK_ALT,DOWN,1063)
KBD(VK_F4,DOWN,406)
KBD(VK_F4,UP,125)
KBD(VK_ALT,UP,203)
KBD(VK_TAB,CLICK,0)
KBD(VK_ENTER,CLICK,0)

● 1つのキーを繰り返し押す
//文字列の終端に改行コードを含めないようにするために、
//Deleteキーを適当な回数を押す。
For i = 0 to 10
SCKEY(tpadwndw,VK_DELETE)
Next

● ウィンドウのタイトルが無い場合のIDの取得方法
「UWSCコードの断片生成器」を実行して調べるか、
GETID(GET_ACTIVE_WIN) を使う。

● アクティブウィンドウのIDをGETしたい場合に、その記述するコードを求める方法
「UWSCコードの断片生成器」を実行して4行目の
id=getid("トラックの追加","#32770") というようなものをコピペして使う。
タスクバーが無いようなダイアログの場合、
"トラックの追加"の部分が
""だけになっている場合があるがそのまま使える。
なお、「id」の部分は適宜、「ロ変数・・・」と書き換えてもよい。
変数宣言は一応不要。
ただしその場合は、その後に書くclkitemなどのid部分も「ロ変数・・・」に書き換えること。

● アクティブウィンドウのクリック可能な部分をGETしてコードを求める
● clkitemの「種別」部分が不明なので知りたい
「UWSCコードの断片生成器」を実行して
クリックしたいアイテムのキャプションで検索をかける。
clkitem(id,"編集\登録\トラック",CLK_MENU)
というように、どのように書いたら良いか表示されるのでそれをコピペ

種別がCLK_BTNなどでダメな場合は、CLK_ACCでも試してみる

● ダイアログ等のキャプション内容を取得して条件分岐したい場合
目的のダイアログが表示された状態で「UWSCコードの断片生成器」を実行し
下のほうの「***** getstr() ********************」の行以下を参照する。
そこにたとえば目的の文字列が
「getstr(id,2,STR_STATIC)="正常に終了しました。"」
となっていたら、次のように条件分岐する。
「id」の部分は随意書き換える。
「getstr(id,2・・・」の「2」は多分「文字列が配置されている位置」というような意味合いで理解してよいと思う。

次の例では、ダイアログの特定の(この例では2の)位置の文字列が、「・・・処理中です・・・」から
「正常に終了しました。」に変わったことで条件分岐する。

ifB getstr(id,2,STR_STATIC)="正常に終了しました。" then
BREAK
else
 
endif

● メニューの階層を踏まえてクリックしたい場合
たとえばファイルメニューの終了メニューをクリックしたことにしたい場合は次のように
階層ごとに \ で区切って書く。

clkitem(GETID(id,"ファイル\終了",CLK_MENU)

● 数分待つが、ある場所の文字列で条件分岐したい場合のサンプル

// 曲の吸い込み完了を待つ(10秒に1回チェック)

 FOR i = 1 TO 100 
Sleep(10) // 10秒待つ
    // もし吸い込み完了ダイアログが「正常に終了しました」と表示が変わったら
    // BREAKでForを抜ける。BREAKはVBのEXIT FOR のようなもの。
    // FOR, WHILE, REPEAT のループを中断するのに使う。
ifB getstr(GETID("","#32770"),2,STR_STATIC)="正常に終了しました。" then
BREAK
else
 
endif
 NEXT  

● 文字列表示(メッセージや吹き出し)やSENDSTRに改行を混ぜたい場合

 "ああああ" + "<#CR>" + "いいいいい"

 もしくは

 "ああああ<#CR>いいいいい"

● フォルダの有無を調べて条件分岐するサンプル

// チェック01:Cドライブにmusic_omuniフォルダが無かったら作成して次へ。あれば何もぜずに次へ。
ロ変数フォルダ存在フラグ=FOPEN("C:\music_omuni\",F_EXISTS)

 IfB ロ変数フォルダ存在フラグ=0 Then
 DosCmd("mkdir c:\music_omuni")
 Else

 EndIf

● フォルダの中にファイルがあるかどうかを調べて条件分岐するサンプル
// チェック02:C:\music_omuniにファイルが入っていたら中断
ロ変数CDドライブファイル数=GETDIR("C:\music_omuni")

 IfB ロ変数CDドライブファイル数=0 Then

 Else
  msgbox("以前に取り込んだ曲ファイルがまだ残っています。" +  "<#CR>" + "すべての曲ファイルを他の場所へ移動するか削除するかしてから再操作してください。" +  "<#CR>" +  +  "<#CR>" + "いったんフォルダを開きます。")
DosCmd("explorer /e,c:\music_omuni")
  EXITEXIT             // プログラムの実行を中断
 EndIf

● 指定した名前のファイルがあるかどうかで条件分岐するサンプル
// チェック03:同名のファイルがあれば中断(上書き防止のため)。無ければ次へ。

 ロ変数ファイル存在フラグ=FOPEN("C:\music_omuni\music_omuni" + mfile_name + ".wav",F_EXISTS) // + ".wav"を取らないように注意。ファイルの存在チェックのため、拡張子表示しなくても拡張子が必要な為。

 IfB ロ変数ファイル存在フラグ = 1 Then // ファイルが在れば
  msgbox("これから自動作成するファイルと同名のファイルがすでに存在します。" +  "<#CR>" + "音を鳴らしますので内容を確認してからファイル名変更や削除等をするなどしたのち、再操作してください。")
 DosCmd("explorer /e,c:\music_omuni")
  ClkItem(GETID(GET_ACTIVE_WIN),"music_omuni" + mfile_name,CLK_LSTVEW)
EXITEXIT             // プログラムの実行を中断  
 Else // 無ければ

 EndIf

● プログラム自体の実行を中断
EXITEXIT

● FOR、IFF、WHILE、REPEAT、のループを抜ける
BREAK とだけ書けば抜けられる。

● 処理を数秒待つ
Sleep(秒数)

● DOSコマンドを実行したい場合
DosCmd("mkdir c:\music_omuni")

コマンドの中で「"」を使うときは、「"」を「<#DBL>」に変更して書く。

● フォルダを開いて表示し、中身の確認をしたい場合
DosCmd("explorer /e,c:\music_omuni")
/e を取ると、階層表示なしで普通に開く。

● アプリ起動
EXEC("E:\Program Files\B's Recorder GOLD8\BSGOLD8.EXE")

● コマンドプロンプト画面の起動
EXEC("cmd")
ただし、バージョン4.2では
DosCmd("mkdir c:\music_omuni")
のように、プロンプト画面を開かなくても直接実行できるようになっている。

「"」は、ダブルコーテーションの特殊文字 <#DBL> を使う。


DosCmd("xcopy <#DBL>C:\Documents and Settings\osamu\My Documents\*.*<#DBL> <#DBL>E:\Backupマイドキュメント<#DBL> /d /s /e /y /r /h /c")

● 文字列を自動入力したい場合
SENDSTR

SENDSTR(ウィンドウのID, "自動入力したい文字列")


SENDSTR( ffox, "あいうえおかきくけこ")

● デバッグ表示したい場合
Printを使えばよいが、Printを使ったサンプルプログラムではデバッグウィンドウがすぐに消えてしまうことがある。
なので最後の行で sleep(1000) などと書いて、表示がしばらく表示され続けるようにする。
UWSC.LOGにprintした内容が記録はされるが面倒くさい場合に。

● 任意のテキストボックス(または入力可能なリストボックス、コンボボックス)に文字列を入れる
SENDSTRでやる。
テキストボックス(またはリストボックス、コンボボックス)が上から何番目にあるかを確認
左上から1番、2番・・・と数える。
もし10番目のテキストボックスなら
SENDSTR( ID, "#32770", 10 )
とやれば、そこに "#32770" が入力される。

● 対話式ボックスの組み込み
SLCTBOX

//ここから
SELECT SLCTBOX(SLCT_BTN, 0, "どのアプリケーションを _
<#CR>起動させますか?", "メモ帳", "電卓", "エクスプ _
ローラ","フリーセル","文字コード表","クリップボード _
","コマンドプロンプト")
CASE SLCT_1
Exec("notepad") //メモ帳
CASE SLCT_2
Exec("calc") //電卓
CASE SLCT_3
Exec("explorer") //エクスプローラ
CASE SLCT_4
Exec("freecell") //フリーセル
CASE SLCT_5
Exec("CHARMAP") //文字コード表
CASE SLCT_6
Exec("CLIPBRD") //クリップボード
CASE SLCT_7
Exec("C:\WINDOWS\command.com") //コマンドプロンプト
SELEND
//ここまで

● フォルダツリーの、あらかじめ作ってある本年用のフォルダをダブルクリックで開く
※普通のフォルダのダブルクリックではありません。フォルダツリーの中でのフォルダです。

//今日の日付をメモリ上のどっかに取得
GETTIME()
//GETTIME()で取得した日付から西暦を取得 http://excel20080504.web.fc2.com/uwsc/U4.htm も参考に。
Nenn_folder = G_TIME_YY4 

Sleep(1)
clkitem(idファ保存,Nenn_folder,CLK_DBLCLK)

● コマンドプロンプト命令での「"」ダブルクォーテーションの処理
<#DBL>をつかう。

● メッセージで改行させる時の方法
<#CR>をつかう。

● ジャンプ代わりの関数の呼び出し例

※Callしなくてもいい。ファンクション名を書くだけ。

Fukidasi("ただいまデータをバックアップ処理中です。パソコンをさわらないでください。", 100, 100, 1, 12, "MS 明朝")

DosCmd("taskkill test01.exe")
DosCmd("taskkill test02.exe")
DosCmd("taskkill test03.exe")

//ここから
SELECT SLCTBOX(SLCT_BTN, 0, "バックアップした後に、 _
<#CR>パソコンを終了させますか?", "させる", "させない")
CASE SLCT_1
LAST_DO(1,2)
msgbox("このあとパソコン終了。")
CASE SLCT_2
msgbox("中断")
SELEND

//ここまで

Procedure LAST_DO(a,b)

doscmd("rd <#DBL>D:\gettet1<#DBL> /s /q")
doscmd("echo F | xcopy <#DBL>C:\Documents and Settings\Administrator\My Documents\Getter1_win_3.9.4\*.*<#DBL> <#DBL>d:\gettet1<#DBL> /d /s /e /c /h /y /r")

FEND

● IEの起動

DosCmd("<#DBL>C:\Program Files\Internet Explorer\iexplore.exe<#DBL> http://×××.co.jp")

● Excel起動01
exec("C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE D:\test\TestBook2003_01.xls")

● Excel起動02
//(2000、2003共用)
Dim o_XL = CreateOLEObj("Excel.Application")
Dim o_WB = o_XL.WorkBooks.Add
o_XL.Visible = TRUE // 可視状態にします。

● Excelのマクロセキュリティダイアログを開く
//ショートカットキー動作にて、マクロセキュリティダイアログを開きます。
SCKEY( idExcel, VK_ALT, VK_T, VK_M, VK_S) 

● 自作関数と引数のエラーについて
自作関数を作るとき、引数を省略するとエラーになるので、関数側ではなんでもいいので仮引数を作っておき、実行時は適当にそこへ値をいれる。
(値は入れるだけで、実際には関数側では何も使わない)

【メインプログラム開始の前に、パソコンを終了させるかどうかなどを聞くプログラム例】