Contents
インプットボックスを表示します。第一引数に表示するメッセージ、第二引数にデフォルト値、第三引数にアスタリスク表示にするかのBoolean値を指定します。
[Cancel]もしくは右上の[☒]のときはEmptyが返ります。
- 構文
- return = INPUT( 表示メッセージ, デフォルト値, パスワードフラグ, X, Y )
- 引数
- 表示メッセージ必須
- インプットボックスに表示するメッセージ
- デフォルト値省略可
- デフォルトの値 として表示
- パスワードフラグ省略可
- TRUE にすると文字は全てアスタリスク表示 (デフォルト FALSE)
- X, Y省略可
- 表示位置(デフォルトは中央、-1, -1にて前回位置)
- 戻り値
入力されたデータ(キャンセル時はEMPTY)
ファイルドロップによりファイル名の設定可(複数選択時はタブにて結合される)
- 型
-
- ANSI文字列(AnsiString)
- UNICODE文字列(UString)
プログラム実行例
入力された文字列の計算をする
HASHTBL variable
DIM array[-1]
DIM res = EMPTY
WHILE TRUE
DIM %val% = ""
FOR i = 0 TO LENGTH(variable) - 1
%val% = %val% + variable[i, HASH_KEY] + "=" + variable[i, HASH_VAL] + " "
NEXT
DIM str = INPUT("計算式を入力してください。<#CR><#CR>変数<#TAB>" + %val% + "<#CR>結果<#TAB>" + res)
IFB POS("=", str) THEN
DIM arr = SPLIT(str, "=")
TRY
variable[arr[0]] = EVAL(arr[1])
EXCEPT
FUKIDASI(TRY_ERRMSG)
CONTINUE
ENDTRY
ENDIF
FUKIDASI()
res = EVAL(REPLACE(str, "=", ":="))
IF res = EMPTY THEN BREAK
WEND
-
(7)
(10)
(11)
(12)
(14,21)
(16,20)
(21)
- 結果
INPUT:10>a=2 INPUT:10>b=3 INPUT:10>a*b 6
パスワードを生成
パスワードを10個生成します。
結果は実行する度に変わります。
REPEAT
res = INPUT("何桁のパスワード?")
IF res = EMPTY THEN EXIT
UNTIL CHKNUM(res)
FOR num = 0 TO 10
DIM password = ""
FOR n = 0 TO res
SELECT RANDOM(3)
CASE 0
password = password + CHR(RANDOM(10) + 48)
CASE 1
password = password + CHR(RANDOM(26) + 65)
CASE 2
password = password + CHR(RANDOM(26) + 97)
SELEND
NEXT
PRINT password
NEXT
-
(2)
(4)
(9,11,13,15)
(11,13,15)
- 結果
D659nv9Z6Q1t1MXjXfPUMMe35r012a639 XsQg7139wsUWF2q764f9AiopT451aULBC A8a2t7Iq0Tl7Ij3W4p5RmQ97ElwvkWeG4 u8RTBF1aDt365Y436XC09Uo5X9kWHc4dS AeCg2uNoUrCR9FsjYHtdhHg2bB6S92NhY 3eR4l89x7WGf1SZTlpDcIbBc25IbEgk4a nuT94OR530poRBt9s0wF1b275qAfGDOHa KTRa7wmEHjab2MopiT8u3aPwI6ntWmMt5 Bz626hGf9GS6yeZQyHrIAbEk1N0fs1ZL5 6Nze7rld3Rmd0tU0Y6kgP1AUwab0bjQlR 11C0x8862eOP1AVjVlXz7rEl4nKkR91Hf
二次方程式を解く
DIM frac[2]
DIM coeff = SPLIT(INPUT("係数を入力してください。「ax^2+bx+c=0」の「a,b,c」を入力。"), ",")
DIM a = coeff[0]
DIM b = coeff[1]
DIM c = coeff[2]
// 判別式
DIM D = EVAL("POWER(b, 2) - 4 * a * c")
DIM ans[-1]
DIM digit = -3
SELECT TRUE
CASE D > 0
IFB b = 0 THEN
DIM root = simplifySqrt(D)
frac[0] = root[0]
frac[1] = EVAL("2 * a")
num = GCD(frac)
IFB frac[1] = ABS(num) THEN
res = frac[0] / ABS(num)
ELSE
res = frac[0] + "/" + frac[1]
ENDIF
arrayPush(ans, (IIF(frac[0] / num <> 1, frac[0] / num, "") + IIF(root[1] <> 1, "√(" + root[1] + ")", "")))
arrayPush(ans, (IIF(frac[0] / num <> 1, -frac[0] / num, "") + IIF(root[1] <> 1, "√(" + root[1] + ")", "")))
ELSE
// 約分する
frac[0] = EVAL("-b")
frac[1] = EVAL("2 * a")
num = GCD(frac)
IFB frac[1] = ABS(num) THEN
res = frac[0] / ABS(num)
ELSE
res = frac[0] + "/" + frac[1]
ENDIF
// ルートの中から整数を外に出す
root = simplifySqrt(D)
frac[0] = root[0]
num = GCD(frac)
IFB frac[1] = num THEN
arrayPush(ans, res + "+" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")"))
arrayPush(ans, res + "-" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")"))
ELSE
arrayPush(ans, res + "+(" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + "))/" + (frac[1] / num)))
arrayPush(ans, res + "-(" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + "))/" + (frac[1] / num)))
ENDIF
ENDIF
CASE D = 0
arrayPush(ans, ROUND(EVAL("-b/(2*a)"), digit))
CASE D < 0
IFB b = 0 THEN
root = simplifySqrt(D)
frac[0] = root[0]
frac[1] = EVAL("2 * a")
num = GCD(frac)
IFB frac[1] = ABS(num) THEN
res = frac[0] / ABS(num)
ELSE
res = frac[0] + "/" + frac[1]
ENDIF
arrayPush(ans, (IIF(frac[0] / num <> 1, frac[0] / num, "") + IIF(root[1] <> 1, "√(" + root[1] + ")", "")))
arrayPush(ans, (IIF(frac[0] / num <> 1, -frac[0] / num, "") + IIF(root[1] <> 1, "√(" + root[1] + ")", "")))
ELSE
frac[0] = EVAL("-b")
frac[1] = EVAL("2 * a")
num = GCD(frac)
IFB frac[1] = ABS(num) THEN
res = frac[0] / ABS(num)
ELSE
res = IIF(frac[0] * frac[1] < 0, "-", "") + ABS(frac[0] / num) + "/" + ABS(frac[1] / num)
ENDIF
// ルートの中から整数を外に出す
root = simplifySqrt(ABS(D))
frac[0] = root[0]
num = GCD(frac)
IFB frac[1] = num THEN
arrayPush(ans, res + "+" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")i"))
arrayPush(ans, res + "-" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")i"))
ELSE
arrayPush(ans, res + "+(" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")i)/" + (frac[1] / num)))
arrayPush(ans, res + "-(" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")i)/" + (frac[1] / num)))
ENDIF
ENDIF
SELEND
PRINT REPLACE(IIF(a <> 1, a, "") +"x^2+" + b + "x+" + c, "+-", "-")
PRINT "-----"
FOR item IN ans
PRINT item
NEXT
//////////////////////////////////////////////////
// 【引数】
// num : ルートの中
// 【戻値】
// 整数を外に出す
//////////////////////////////////////////////////
FUNCTION simplifySqrt(num)
HASHTBL root
DIM arr = primeFactorization(num)
DIM a = 1, b = 1
FOR item IN arr
root[item] = root[item] + 1
NEXT
FOR n = 0 TO LENGTH(root) - 1
IF INT(root[n, HASH_VAL] / 2) <> 0 THEN a = a * POWER(root[n, HASH_KEY], INT(root[n, HASH_VAL] / 2))
IF (root[n, HASH_KEY] * (root[n, HASH_VAL] MOD 2)) <> 0 THEN b = b * (root[n, HASH_KEY] * (root[n, HASH_VAL] MOD 2))
NEXT
DIM res[1] = a, b
RESULT = SLICE(res)
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 要素を追加する配列(参照引数)
// str : 追加する要素
// 【戻値】
// 処理後の配列の中の要素の数
//////////////////////////////////////////////////
FUNCTION arrayPush(var arr[], str)
DIM res = RESIZE(arr, UBound(arr) + 1)
arr[res] = str
RESULT = res + 1
FEND
//////////////////////////////////////////////////
// 【引数】
// arr : 最大公約数を求める数値を格納した配列
// 【戻値】
// 最大公約数
//////////////////////////////////////////////////
FUNCTION GCD(arr[])
DIM c = LENGTH(arr)
DIM rem = arr[c-1] MOD arr[c-2]
IFB rem = 0 THEN
IFB LENGTH(arr) = 2 THEN
RESULT = arr[c-2]
EXIT
ENDIF
RESIZE(arr, c-2)
RESULT = GCD(arr)
EXIT
ENDIF
arr[c-1] = arr[c-2]
arr[c-2] = rem
RESULT = GCD(arr)
FEND
//////////////////////////////////////////////////
// 【引数】
// expr : 評価する式
// truepart : 評価した式がTrueのときに返す値
// falsepart : 評価した式がFalseのときに返す値
// 【戻値】
// truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
IFB EVAL(expr) THEN
RESULT = truepart
ELSE
RESULT = falsepart
ENDIF
FEND
//////////////////////////////////////////////////
// 【引数】
// num : 素因数分解する数値
// 【戻値】
// 素因数分解した数値を格納した配列
//////////////////////////////////////////////////
FUNCTION primeFactorization(num)
DIM arr[-1]
// 偶数なら2で割り続ける
WHILE num MOD 2 = 0
arrayPush(arr, 2)
num = num / 2
WEND
FOR n = 3 TO num
WHILE num MOD n = 0
arrayPush(arr, n)
num = num / n
WEND
NEXT
RESULT = SLICE(arr)
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 上限値を求める配列
// 【戻値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(array[])
RESULT = RESIZE(array)
FEND
-
(3)
(3)
(10,20,31,32,52,57,67,68)
(21,33,42,58,69,78)
(22,23,34,35,59,60,70,71,73,76)
(27,28,44,45,47,48,52,64,65,80,81,83,84)
(27.28,44,45,47,48,64,65,73,80,81,83,84,89)
(52)
(89)
- 結果
4x^2+5x+3 ----- -5/8+(√(23)i)/8 -5/8-(√(23)i)/8
数値から月の異名を求める
DIM month[12] = "睦月", "如月", "弥生", "卯月", "皐月", "水無月", "文月", "葉月", "長月", "神無月", "霜月", "師走"
DIM str = INPUT("1〜12の数値を入力してください。")
IFB reTest(str, "[1-9]|1[0-2]") THEN
PRINT month[str- 1]
ELSE
PRINT "1〜12の数値を入力してください。"
ENDIF
//////////////////////////////////////////////////
// 【引数】
// str : 正規表現による検索の対象となる文字列
// Pattern : 正規表現で使用するパターンを設定
// IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse
// Global : 文字列全体を検索する場合はTrue、しない場合はFalse
// 【戻値】
// 正規表現にマッチするかどうか
//////////////////////////////////////////////////
FUNCTION reTest(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
DIM re = CREATEOLEOBJ("VBScript.RegExp")
re.Pattern = Pattern
re.IgnoreCase = IgnoreCase
re.Global = Global
RESULT = re.Test(str)
FEND
-
(3)
(5)
- 結果
INPUT:3>7 文月
解説
- 1行目
- 月の異名を配列に格納
DIM month[12] = "睦月", "如月", "弥生", "卯月", "皐月", "水無月", "文月", "葉月", "長月", "神無月", "霜月", "師走"
- 3行目
- インプットボックスを表示する。
DIM str = INPUT("1〜12の数値を入力してください。")
- 5-9行目
- 条件:正規表現を使い入力された値が1〜12の整数かどうか。
IFB reTest(str, "[1-9]|1[0-2]") THEN PRINT month[str- 1] ELSE PRINT "1〜12の数値を入力してください。" ENDIF
- [1-9]|1[0-2]
- 1~9の整数
- [1-9]|1[0-2]
- 10~12の整数
- [1-9]|1[0-2]
- 「1〜9の整数」または「10~12の整数」→「1〜12の整数」
FALSE(それ以外ならば):「1〜12の数値を入力してください。」を出力。
入力した文字列をANSIでエンコードする
PRINT ENCODE(ENCODE(INPUT("エンコードする文字列を入力してください。"), CODE_ANSI), CODE_URL)
-
(1)
(1)
デスクトップにフォルダを作成
CONST ssfDesktop = 0
DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM Folder = Shell.NameSpace(ssfDesktop)
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
WITH FSO
.CreateFolder(.BuildPath(Folder.Self.Path, INPUT("デスクトップにフォルダを作成します。<#CR>フォルダ名を入力してください。")))
ENDWITH
-
([3,5]; script.function.INPUT:8)
(8)
パス文字列を生成します
CONST ssfDesktop = 0
DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM Folder = Shell.NameSpace(ssfDesktop)
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
PRINT FSO.BuildPath(Folder.Self.Path, INPUT("フォルダ名もしくはファイル名を入力してください。"))
-
([3,5])
(7)
(7)
指定したフォルダが存在するか
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
DIM FolderName = INPUT("フォルダ名を入力してください。")
IFB FSO.FolderExists(FolderName) THEN
MSGBOX("「" + FolderName + "」フォルダは存在します。")
ELSE
MSGBOX("「" + FolderName + "」フォルダは存在しません。")
ENDIF
-
(1)
(2)
- fso.folderexists(4) ([5,6])
指定したファイルが存在するか
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
DIM path = INPUT("ファイルパスを入力してください。")
IFB FSO.FileExists(path) = TRUE THEN
MSGBOX("「" + path + "」は存在します。")
ELSE
MSGBOX("「" + path + "」は存在しませn。")
ENDIF
-
(1)
(2)
([5,7])
(4)
フラッシュ暗算
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
DIM grades[] = "20級(初級)", "19級(初級)", "18級(初級)", "17級(初級)", "16級(初級)", "15級(初級)", "14級(初級)", "13級(初級)", "12級(初級)", "11級(初級)", _
"10級(中級)", "9級(中級)", "8級(中級)", "7級(中級)", "6級(中級)", "5級(中級)", "4級(中級)", "3級(中級)", "2級(中級)", "1級(中級)", _
"初段(上級)", "2段(上級)", "3段(上級)", "4段(上級)", "5段(上級)", "6段(上級)", "7段(上級)", "8段(上級)", "9段(上級)", "10段(上級)", _
"11段(超上級)", "12段(超上級)", "13段(超上級)", "14段(超上級)", "15段(超上級)", "16段(超上級)", "17段(超上級)", "18段(超上級)", "19段(超上級)", "20段(超上級)"
DIM keta[] = 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, _
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _
2, 3, 3, 3, 3, 3, 3, 3, 3, 3, _
3, 3, 3, 3, 3, 3, 3, 3, 3, 3
DIM num[] = 3, 3, 5, 8, 10, 12, 15, 20, 10, 15, _
2, 3, 4, 5, 6, 7, 8, 10, 12, 15, _
15, 4, 6, 8, 10, 12, 15, 15, 15, 15, _
15, 15, 15, 15, 15, 15, 15, 15, 15, 15
DIM time[] = 5, 5, 7, 10, 12, 15, 15, 15, 10, 15, _
4, 6, 7, 8, 9, 10, 11, 12, 12, 13, _
10, 4, 5, 6, 7, 8, 8, 6, 4.5, 3, _
2.8, 2.6, 2.4, 2.2, 2.0, 1.9, 1.8, 1.7, 1.6, 1.5
DIM grade = SLCTBOX(SLCT_CMB OR SLCT_NUM, 60, "レベルを選択", grades)
DIM sum = 0
DIM fontsize = 80
DIM fontname = "abacus2"
DIM fontcolor = $00aa00
DIM bgcolor = 1
FOR i = 1 TO num[grade]
DIM n = POWER(10, keta[grade] - 1) + RANDOM(POWER(10, keta[grade]) - POWER(10, keta[grade] - 1))
sum = sum + n
DIM msg = " " + n + " "
FUKIDASI(msg, G_SCREEN_W, G_SCREEN_H,, fontsize, fontname, fontcolor, bgcolor)
DIM ID = GETID(GET_FUKIDASI_WIN)
FUKIDASI(msg, (STATUS(ID, ST_X) - STATUS(ID, ST_WIDTH))/2, (STATUS(ID, ST_Y) - STATUS(ID, ST_HEIGHT))/2,, fontsize, fontname, fontcolor, bgcolor)
SOUND("BEEP")
SLEEP(time[grade])
FUKIDASI()
NEXT
DIM ans = INPUT("答えは?")
IFB ans = sum THEN
MSGBOX("正解です!(ans." + sum + ")")
ELSE
MSGBOX("残念でした、正解は " + sum + " です。")
ENDIF
PROCEDURE forceQuit()
EXITEXIT
FEND
-
(1)
(19)
(27)
(27)
(30,32,35)
(31)
(32)
(33)
(34)
(38)
(41,43)
解説
- 1行目
- ESCキーで強制終了します。
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
- 3-6行目
- 難易度を格納した配列。難易度は一般社団法人日本フラッシュ暗算検定協会|検定試験についてをもとに作成しています。 keta にケタ、 num に口数、 time にタイムをそれぞれの難易度の項目を格納しています。
DIM grades[] = "20級(初級)", "19級(初級)", "18級(初級)", "17級(初級)", "16級(初級)", "15級(初級)", "14級(初級)", "13級(初級)", "12級(初級)", "11級(初級)", _ "10級(中級)", "9級(中級)", "8級(中級)", "7級(中級)", "6級(中級)", "5級(中級)", "4級(中級)", "3級(中級)", "2級(中級)", "1級(中級)", _ "初段(上級)", "2段(上級)", "3段(上級)", "4段(上級)", "5段(上級)", "6段(上級)", "7段(上級)", "8段(上級)", "9段(上級)", "10段(上級)", _ "11段(超上級)", "12段(超上級)", "13段(超上級)", "14段(超上級)", "15段(超上級)", "16段(超上級)", "17段(超上級)", "18段(超上級)", "19段(超上級)", "20段(超上級)"
- 7-10行目
- 出題される問題の数値の桁数を格納しています。
DIM keta[] = 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, _ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _ 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, _ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
- 11-14行目
- 出題される問題の数(口数)を格納しています。
DIM num[] = 3, 3, 5, 8, 10, 12, 15, 20, 10, 15, _ 2, 3, 4, 5, 6, 7, 8, 10, 12, 15, _ 15, 4, 6, 8, 10, 12, 15, 15, 15, 15, _ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15
- 15-18行目
- 問題1問あたりの表示時間を秒単位で格納しています。
DIM time[] = 5, 5, 7, 10, 12, 15, 15, 15, 10, 15, _ 4, 6, 7, 8, 9, 10, 11, 12, 12, 13, _ 10, 4, 5, 6, 7, 8, 8, 6, 4.5, 3, _ 2.8, 2.6, 2.4, 2.2, 2.0, 1.9, 1.8, 1.7, 1.6, 1.5
- 19行目
- 選択した難易度の配列変数位置を返し grade に代入します。
DIM grade = SLCTBOX(SLCT_CMB OR SLCT_NUM, 60, "レベルを選択", grades)
- 20行目
- 表示した数値の合計値を代入する変数。
DIM sum = 0
- 21行目
- 表示する吹き出し(数値)のフォントサイズ。
DIM fontsize = 80
- 22行目
- フォントを"アバカスフォント2"に設定します。フォントは無料そろばん数字フォント - 伊藤珠算教室「かっぱ先生のそろばん教室」でダウンロードできます。ダウンロードした.ttfファイルを「C:\Windows\Fonts」に置くことで利用できるようになります。
DIM fontname = "abacus2"
- 23行目
- 吹き出しのフォントの色を#00aa00に指定します。
DIM fontcolor = $00aa00
- 24行目
- 吹き出しの背景色を黒に設定します。
DIM bgcolor = 1
- 26,36行目
- 出題する問題の数だけ繰り返し。
FOR i = 1 TO num[grade] … NEXT
- 27行目
- n に出題する問題の値を代入。以下はN桁のランダムの数値を取得するプログラムです。このNの部分にketa[grade]を代入して求めます。
DIM n = POWER(10, keta[grade] - 1) + RANDOM(POWER(10, keta[grade]) - POWER(10, keta[grade] - 1))
PRINT POWER(10, N - 1) + RANDOM(POWER(10, N) - POWER(10, N - 1))
- 28行目
- sum に n を加えます。
sum = sum + n
- 29行目
- 吹き出しに表示する数値に msg に代入。前後の半角スペースは数字の左右に余白をつけるだけのものです。
DIM msg = " " + n + " "
- 30行目
- 問題を画面中央に表示するための幅と高さを取得するために一度画面外に吹き出しを表示しています。
FUKIDASI(msg, G_SCREEN_W, G_SCREEN_H,, fontsize, fontname, fontcolor, bgcolor)
- 31行目
- 吹き出しのIDを取得し ID に代入します。
DIM ID = GETID(GET_FUKIDASI_WIN)
- 32行目
- 画面中央に問題(数値)を表示します。
FUKIDASI(msg, (STATUS(ID, ST_X) - STATUS(ID, ST_WIDTH))/2, (STATUS(ID, ST_Y) - STATUS(ID, ST_HEIGHT))/2,, fontsize, fontname, fontcolor, bgcolor)
- 33行目
- ビープ音を鳴らします。
SOUND("BEEP")
- 34行目
- 待機します。
SLEEP(time[grade])
- 35行目
- 吹き出しを消します。
FUKIDASI()
- 38行目
- 答えを入力するためのインプットボックスを表示します。
DIM ans = INPUT("答えは?")
- 40-44行目
- 答えが当たっていれば正解、外れていれば不正解と表示。
IFB ans = sum THEN MSGBOX("正解です!(ans." + sum + ")") ELSE MSGBOX("残念でした、正解は " + sum + " です。") ENDIF
Googleでの検索結果を取得
DIM IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.Visible = TRUE
IE.Navigate("http://google.com")
BusyWait(IE)
IESETDATA(IE, INPUT("検索ワードを入力"), "q")
IESETDATA(IE, TRUE, "btnK")
BusyWait(IE)
DIM elements = IE.document.getElementsByClassName("rc")
FOR element IN elements
PRINT element.getElementsByClassName("LC20lb").Item(0).textContent
PRINT element.getElementsByClassName("s").Item(0).textContent
PRINT "----------"
NEXT
IE.Quit
//////////////////////////////////////////////////
// 【引数】
// IE : IEオブジェクト
// 【戻値】
//
//////////////////////////////////////////////////
PROCEDURE BusyWait(Var IE)
SLEEP(0.500)
DIM t = GETTIME()
TRY
REPEAT
DIM tm = GETTIME() - t
FUKIDASI("BusyWait:" + tm)
SLEEP(0.010)
IF tm >= 60 THEN BREAK
UNTIL !IE.Busy AND IE.readyState = 4
EXCEPT
IE = getIEObj(-1)
PRINT IE.document.URL + " のIEオブジェクトを取得しました。"
BusyWait(IE)
ENDTRY
FUKIDASI()
FEND
//////////////////////////////////////////////////
// 【引数】
// interval : 加算する時間間隔を表す文字列式(yyyy:年、m:月、d:日、ww:週、h:時、n:分、s:秒)
// num : dateに加算する値。未来は正、過去は負で指定
// date : 時間間隔を加算する日付
// 【戻値】
// 日時(date)に、指定した単位(interval)の時間(num)を加算して返します
//////////////////////////////////////////////////
FUNCTION dateAdd(interval, num, date)
DIM year, month, day, d
GETTIME(0, date)
DIM time = G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2
SELECT interval
CASE "yyyy"
d = (G_TIME_YY + num) + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
IF time <> "00:00:00" THEN d = d + " " + time
CASE "m"
IFB num > 0 THEN
year = G_TIME_YY + INT((G_TIME_MM + num) / 12)
month = REPLACE(FORMAT(((G_TIME_MM + num) MOD 12), 2), " ", "0")
ELSE
year = G_TIME_YY + CEIL((G_TIME_MM + num) / 12 - 1)
month = REPLACE(FORMAT(G_TIME_MM - (ABS(num) MOD 12), 2), " ", "0")
ENDIF
IF month = "00" THEN month = 12
day = G_TIME_DD2
d = "" + year + month + day
IFB !isDate(d) THEN
d = year + "/" + month + "/" + "01"
d = getEndOfMonth(d)
ELSE
d = year + "/" + month + "/" + day
ENDIF
IF time <> "00:00:00" THEN d = d + " " + time
CASE "d"
t = GETTIME(num, date)
d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
CASE "ww"
t = GETTIME(num * 7, date)
d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
CASE "h"
t = GETTIME(num / 24, date)
d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
CASE "n"
t = GETTIME(num / 1440, date)
d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
CASE "s"
t = GETTIME(num / 86400, date)
d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
SELEND
RESULT = d
FEND
//////////////////////////////////////////////////
// 【引数】
// interval : 時間単位(yyyy︰年、q:四半期、m︰月、d︰日、w:週日、ww:週、h:時、n:分、s:秒)
// date1 : 日時1
// date2 : 日時2
// 【戻値】
// date2からdate1を引いた時間間隔を求めます。
//////////////////////////////////////////////////
FUNCTION dateDiff(interval, date1, date2)
DIM y1, y2, m1, m2, d1, d2, d
SELECT interval
CASE "yyyy"
GETTIME(0, date1)
y1 = G_TIME_YY
GETTIME(0, date2)
y2 = G_TIME_YY
d = y2 - y1
CASE "q"
GETTIME(0, date1)
y1 = G_TIME_YY
m1 = G_TIME_MM
GETTIME(0, date2)
y2 = G_TIME_YY
m2 = G_TIME_MM
d = y2 * 4 + CEIL(m2/3) - (y1 * 4 + CEIL(m1/3))
CASE "m"
GETTIME(0, date1)
y1 = G_TIME_YY
m1 = G_TIME_MM
GETTIME(0, date2)
y2 = G_TIME_YY
m2 = G_TIME_MM
d = (y2 - y1) * 12 + m2 - m1
CASE "d"
d1 = GETTIME(0, date1)
d2 = GETTIME(0, date2)
d = (d2 - d1) / 86400
CASE "w"
d = INT(dateDiff("d", date1, date2) / 7)
CASE "ww"
date1 = dateAdd("d", -1 * getWeekday(date1), date1)
d = INT(dateDiff("d", date1, date2) / 7)
CASE "h"
d = dateDiff("d", date1, date2) * 24
CASE "n"
d = dateDiff("d", date1, date2) * 1440
CASE "s"
d = dateDiff("d", date1, date2) * 86400
SELEND
RESULT = d
FEND
//////////////////////////////////////////////////
// 【引数】
// arr : 最大公約数を求める数値を格納した配列
// 【戻値】
// 最大公約数
//////////////////////////////////////////////////
FUNCTION GCD(arr[])
DIM c = LENGTH(arr)
DIM rem = arr[c-1] MOD arr[c-2]
IFB rem = 0 THEN
IFB LENGTH(arr) = 2 THEN
RESULT = arr[c-2]
EXIT
ENDIF
RESIZE(arr, c-2)
RESULT = GCD(arr)
EXIT
ENDIF
arr[c-1] = arr[c-2]
arr[c-2] = rem
RESULT = GCD(arr)
FEND
//////////////////////////////////////////////////
// 【引数】
// date : 日付(”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”)
// m : 第一引数の指定日からプラスマイナス m 月とする
// 【戻値】
// date から m 月後の月末の日付
//////////////////////////////////////////////////
FUNCTION getEndOfMonth(date, m = 0)
date = dateAdd("m", m + 1, date)
GETTIME(0, date)
GETTIME(-G_TIME_DD, date)
RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND
//////////////////////////////////////////////////
// 【引数】
// 文字列 or 数値 : 取得したいIEオブジェクトのタイトル・URLもしくは数値を指定
// 完全一致フラグ : (TRUE : 文字列が完全一致したものを取得、FALSE : 文字列の一部を含むものを取得)
// 【戻値】
// Internet Explorerオブジェクト
//////////////////////////////////////////////////
FUNCTION getIEObj(str, flg = FALSE)
DIM Shell = CREATEOLEOBJ("Shell.Application")
SELECT CHKNUM(str)
CASE TRUE
DIM cnt = 0
SELECT TRUE
CASE str > 0
FOR n = 0 TO Shell.Windows.Count - 1
TRY
IFB Shell.Windows.Item(n).Name = "Internet Explorer" THEN
cnt = cnt + 1
IFB str = cnt THEN
RESULT = Shell.Windows.Item(n)
EXIT
ENDIF
ENDIF
EXCEPT
ENDTRY
NEXT
CASE str < 0
FOR n = Shell.Windows.Count - 1 TO 0 STEP -1
TRY
IFB Shell.Windows.Item(n).Name = "Internet Explorer" THEN
cnt = cnt + 1
IFB ABS(str) = cnt THEN
RESULT = Shell.Windows.Item(n)
EXIT
ENDIF
ENDIF
EXCEPT
ENDTRY
NEXT
CASE str = 0
FOR n = 0 TO Shell.Windows.Count - 1
TRY
IF Shell.Windows.Item(n).Name = "Internet Explorer" THEN cnt = cnt + 1
EXCEPT
ENDTRY
NEXT
RESULT = cnt
EXIT
SELEND
CASE FALSE
DIM t = GETTIME()
REPEAT
FOR n = 0 TO Shell.Windows.Count - 1
TRY
DIM targetObj = Shell.Windows.Item(n)
IFB targetObj.Name = "Internet Explorer" THEN
SELECT flg
CASE TRUE
IFB targetObj.document.title = str OR targetObj.LocationURL = str THEN
RESULT = Shell.Windows.Item(n)
EXIT
ENDIF
CASE FALSE
IFB POS(str, targetObj.document.title) OR POS(str, targetObj.LocationURL) THEN
RESULT = Shell.Windows.Item(n)
EXIT
ENDIF
SELEND
ENDIF
EXCEPT
ENDTRY
NEXT
UNTIL GETTIME() - t >= 5
SELEND
RESULT = ERR_VALUE
FEND
//////////////////////////////////////////////////
// 【引数】
// date : (”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”)
// 【戻値】
// 曜日 (0:日曜…、6:土曜)
//////////////////////////////////////////////////
FUNCTION getWeekday(date)
GETTIME(0, date)
RESULT = G_TIME_WW
FEND
//////////////////////////////////////////////////
// 【引数】
// 数値 : GETTIMEで取得した曜日の番号(G_TIME_WW=0:日曜….6:土曜)
// フォーマット : 以下のアルファベットは数値で指定した対応する曜日に置き換えられます。(aaa : 日〜土、aaaa : 日曜日〜土曜日、ddd : Sun〜Sat、dddd : Sunday〜Saturday)
// 【戻値】
// 数値をフォーマットした文字列を返します。
//////////////////////////////////////////////////
FUNCTION getWeekdayName(num, format = "aaa")
DIM re = CREATEOLEOBJ("VBScript.RegExp")
DIM aaa[] = "日", "月", "火", "水", "木", "金", "土";
DIM aaaa[] = "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日";
DIM ddd[] = "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat";
DIM dddd[] = "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday";
match = reExecute(format, "(a|d)+")
type = match.Item(0).Value
RESULT = reReplace(format, EVAL(type + "[" + num + "]"), type)
FEND
//////////////////////////////////////////////////
// 【引数】
// serial : 時間を表すシリアル値を指定
// 【戻値】
// 例)0…00、0.5…12、1.0…24
//////////////////////////////////////////////////
FUNCTION Hour(serial)
RESULT = INT(serial * 24) MOD 24
FEND
//////////////////////////////////////////////////
// 【引数】
// expr : 評価する式
// truepart : 評価した式がTrueのときに返す値
// falsepart : 評価した式がFalseのときに返す値
// 【戻値】
// truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
IFB EVAL(expr) THEN
RESULT = truepart
ELSE
RESULT = falsepart
ENDIF
FEND
//////////////////////////////////////////////////
// 【引数】
// date : YYYYMMDD
// 【戻値】
// TRUE : 日付として認識できる、FALSE : 日付として認識できない
//////////////////////////////////////////////////
FUNCTION isDate(date)
DIM Pattern = "^(?!([02468][1235679]|[13579][01345789])000229)(([0-9]{4}(01|03|05|07|08|10|12)(0[1-9]|[12][0-9]|3[01]))|([0-9]{4}(04|06|09|11)(0[1-9]|[12][0-9]|30))|([0-9]{4}02(0[1-9]|1[0-9]|2[0-8]))|([0-9]{2}([02468][048]|[13579][26])0229))$"
DIM Match = reExecute(date, Pattern)
RESULT = IIF(Match.Count <> 0, TRUE, FALSE)
FEND
//////////////////////////////////////////////////
// 【引数】
// str : 正規表現による検索の対象となる文字列
// Pattern : 正規表現で使用するパターンを設定
// IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse
// Global : 文字列全体を検索する場合はTrue、しない場合はFalse
// 【戻値】
// 正規表現で検索した結果をMatchesコレクションとして返します。
//////////////////////////////////////////////////
FUNCTION reExecute(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
DIM re = CREATEOLEOBJ("VBScript.RegExp")
re.Pattern = Pattern
re.IgnoreCase = IgnoreCase
re.Global = Global
RESULT = re.Execute(str)
FEND
//////////////////////////////////////////////////
// 【引数】
// str1 : 置換される文字列
// str2 : 置換後の文字列
// Pattern : 置換する文字列のパターン
// IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse
// Global : 文字列全体を検索する場合はTrue、しない場合はFalse
// 【戻値】
// 正規表現置換後の文字列
//////////////////////////////////////////////////
FUNCTION reReplace(str1, str2, Pattern, IgnoreCase = TRUE, Global = TRUE)
DIM re = CREATEOLEOBJ("VBScript.RegExp")
re.Pattern = Pattern
re.IgnoreCase = IgnoreCase
re.Global = Global
RESULT = re.Replace(str1, str2)
FEND
//////////////////////////////////////////////////
// 【引数】
// str : 正規表現による検索の対象となる文字列
// Pattern : 正規表現で使用するパターンを設定
// IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse
// Global : 文字列全体を検索する場合はTrue、しない場合はFalse
// 【戻値】
// 正規表現にマッチするかどうか
//////////////////////////////////////////////////
FUNCTION reTest(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
DIM re = CREATEOLEOBJ("VBScript.RegExp")
re.Pattern = Pattern
re.IgnoreCase = IgnoreCase
re.Global = Global
RESULT = re.Test(str)
FEND
//////////////////////////////////////////////////
// 【引数】
// inputs : 繰り返す文字列
// multiplier : inputsを繰り返す回数
// 【戻値】
// inputsをmultiplier回を繰り返した文字列を返します
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
DIM res = ""
FOR n = 1 TO multiplier
res = res + inputs
NEXT
RESULT = res
FEND
//////////////////////////////////////////////////
// 【引数】
// serial : シリアル値
// format : フォーマット
// 【戻値】
// 数値を表示書式に基づいて変換した文字列
//////////////////////////////////////////////////
FUNCTION text(serial, format, hour12 = FALSE)
HASHTBL startDate
startDate["明治"] = "1868/01/25"
startDate["大正"] = "1912/07/30"
startDate["昭和"] = "1926/12/25"
startDate["平成"] = "1989/01/08"
startDate["令和"] = "2019/05/01"
DIM baseDate = "1899/12/30"
SELECT TRUE
CASE reTest(format, "\[h+\]")
Matches = reExecute(format, "\[(h+)\]")
DIM hour = iif(hour12, Hour(serial) MOD 12, Hour(serial))
RESULT = text(hour, strRepeat("0", LENGTH(Matches.Item(0).SubMatches(0))))
CASE reTest(format, "^h+$")
Matches = reExecute(format, "^(h+)$")
hour = iif(hour12, Hour(serial) MOD 12, Hour(serial))
RESULT = text(hour MOD 24, strRepeat("0", LENGTH(Matches.Item(0).SubMatches(0))))
CASE reTest(format, "\[m+\]")
Matches = reExecute(format, "\[(m+)\]")
RESULT = text(serial * 1440, strRepeat("0", LENGTH(Matches.Item(0).SubMatches(0))))
CASE format = "m"
GETTIME(serial, baseDate)
RESULT = text(G_TIME_MM, "0")
CASE format = "mm"
GETTIME(serial, baseDate)
RESULT = G_TIME_MM2
CASE format = "n"
GETTIME(serial, baseDate)
RESULT = G_TIME_NN
CASE format = "nn"
GETTIME(serial, baseDate)
RESULT = G_TIME_NN2
CASE format = "s"
GETTIME(serial, baseDate)
RESULT = text(G_TIME_SS, "0")
CASE format = "ss"
GETTIME(serial, baseDate)
RESULT = G_TIME_SS2
CASE format = "yyyy"
GETTIME(serial, baseDate)
RESULT = G_TIME_YY4
CASE format = "yy"
GETTIME(serial, baseDate)
RESULT = COPY(G_TIME_YY4, 3, 2)
CASE format = "e"
SELECT TRUE
CASE dateDiff("d", startDate["令和"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(serial, "yyyy") - 2018
CASE dateDiff("d", startDate["平成"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(serial, "yyyy") - 1988
CASE dateDiff("d", startDate["昭和"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(serial, "yyyy") - 1925
CASE dateDiff("d", startDate["大正"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(serial, "yyyy") - 1911
CASE dateDiff("d", startDate["明治"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(serial, "yyyy") - 1867
SELEND
CASE format = "ee"
SELECT TRUE
CASE dateDiff("d", startDate["令和"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(text(serial, "yyyy") - 2018, "00")
CASE dateDiff("d", startDate["平成"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(text(serial, "yyyy") - 1988, "00")
CASE dateDiff("d", startDate["昭和"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(text(serial, "yyyy") - 1925, "00")
CASE dateDiff("d", startDate["大正"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(text(serial, "yyyy") - 1911, "00")
CASE dateDiff("d", startDate["明治"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(text(serial, "yyyy") - 1867, "00")
SELEND
CASE format = "g"
SELECT TRUE
CASE dateDiff("d", startDate["令和"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "R"
CASE dateDiff("d", startDate["平成"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "H"
CASE dateDiff("d", startDate["昭和"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "S"
CASE dateDiff("d", startDate["大正"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "T"
CASE dateDiff("d", startDate["明治"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "M"
SELEND
CASE format = "gg"
RESULT = COPY(text(serial, "ggg"), 1, 1)
CASE format = "ggg"
SELECT TRUE
CASE dateDiff("d", startDate["令和"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "令和"
CASE dateDiff("d", startDate["平成"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "平成"
CASE dateDiff("d", startDate["昭和"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "昭和"
CASE dateDiff("d", startDate["大正"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "大正"
CASE dateDiff("d", startDate["明治"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "明治"
SELEND
CASE format = "mmmmm"
RESULT = COPY(text(serial, "mmmm"), 1, 1)
CASE format = "mmmm"
DIM month[] = "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
RESULT = month[text(serial, "m") - 1]
CASE format = "mmm"
RESULT = COPY(text(serial, "mmmm"), 1, 3)
CASE format = "dd"
GETTIME(serial, baseDate)
RESULT = text(G_TIME_DD2, "00")
CASE format = "d"
GETTIME(serial, baseDate)
RESULT = text(G_TIME_DD, "0")
CASE reTest(format, "^[ad]{3,4}$")
Matches = reExecute(format, "([ad]{3,4})")
GETTIME(serial, baseDate)
RESULT = getWeekdayName(G_TIME_WW, Matches.Item(0).SubMatches(0))
CASE reTest(format, "(0+\.?0+)?%")
Matches = reExecute(format, "(0+\.?0+)?%")
RESULT = text(serial * 100, Matches.Item(0).SubMatches(0)) + "%"
CASE reTest(format, "^\[DBNum\d{1,4}\](.*?)$")
Matches = reExecute(format, "^\[DBNum(\d{1,4})\](.*?)$")
DIM value = VAL(Matches.Item(0).SubMatches(0))
DIM sss = text(serial, Matches.Item(0).SubMatches(1))
Matches = reExecute(sss, "(\D+)?(\d+)(\D+)?")
DIM res = ""
FOR m = 0 TO Matches.Count - 1
serial = Matches.Item(m).SubMatches(1)
SELECT value
CASE 1, 2
DIM n[][9] = "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九", + _
"", "壱", "弐", "参", "四", "伍", "六", "七", "八", "九"
DIM a[][3] = "", "十", "百", "千", + _
"", "拾", "百", "阡"
DIM b[][3] = "", "万", "億", "兆", + _
"", "萬", "億", "兆"
DIM r = ""
DIM j = 0
type = value - 1
REPEAT
DIM str = ""
DIM n4 = serial MOD 10000
FOR i = LENGTH(n4) TO 1 STEP -1
s = COPY(n4, i, 1)
IFB s = 1 AND a[type][LENGTH(n4)-i] <> "" THEN
str = IIF(s, a[type][LENGTH(n4)-i], "") + str
ELSE
str = n[type][s] + IIF(s, a[type][LENGTH(n4)-i], "") + str
ENDIF
NEXT
IF str <> "" THEN r = str + b[type][j] + r
j = j + 1
serial = INT(serial / 10000)
UNTIL serial = 0
res = res + Matches.Item(m).SubMatches(0) + r + Matches.Item(m).SubMatches(2)
CASE 3
res = res + Matches.Item(m).SubMatches(0) + STRCONV(serial, SC_FULLWIDTH) + Matches.Item(m).SubMatches(2)
CASE 4
res = res + Matches.Item(m).SubMatches(0) + STRCONV(serial, SC_HALFWIDTH) + Matches.Item(m).SubMatches(2)
SELEND
NEXT
RESULT = res
CASE reTest(format, "^(.*?)(AM\/PM|am\/pm|A\/P|a\/p)(.*?)$")
Matches = reExecute(format, "^(.*?)(AM\/PM|am\/pm|A\/P|a\/p)(.*?)$")
DIM array = SPLIT(Matches.Item(0).SubMatches(1), "/")
ampm = array[IIF(serial - INT(serial) >= 0.5, 1, 0)]
hour12 = TRUE
res = ""
WITH Matches.Item(0)
res = text(serial, .SubMatches(0), hour12) + ampm + text(serial, .SubMatches(2), hour12)
ENDWITH
RESULT = res
CASE reTest(format, "([^ymdagehns]{0,})?(([ymdagehns])\3{0,})([^ymdagehns]+)?")
Matches = reExecute(format, "([^ymdagehns]{0,})?(([ymdagehns])\3{0,})([^ymdagehns]+)?")
FOR n = 0 TO Matches.Count - 1
IF n = 0 THEN res = Matches.Item(n).SubMatches(0)
NEXT
FOR n = 0 TO Matches.Count - 1
WITH Matches.Item(n)
res = res + text(serial, .SubMatches(1), hour12) + .SubMatches(3)
ENDWITH
NEXT
RESULT = res
CASE format = "0/0"
DIM separator = POS(".", serial)
DIM g = 0
IFB separator <> 0 THEN
DIM keta = LENGTH(serial)
DIM shift = POWER(10, keta - separator)
IFB shift >= POWER(10, 15) THEN
DIM position = 0
FOR i = 0 TO 14
IFB serial * POWER(10, i) - serial >= 1 THEN
position = i
BREAK
ENDIF
NEXT
tmp = serial * POWER(10, position)
FOR i = 1 TO 15
r = (tmp * POWER(10, i)) / serial - (tmp / serial)
a1 = tmp * POWER(10, i) - tmp
IF a1 = INT(a1) THEN BREAK
NEXT
DIM frac[] = a1, r
g = GCD(frac)
RESULT = (a1/g) + "/" + (r/g)
ELSE
DIM molecule = serial * shift // 分子
DIM denominator = shift // 分母
DIM nums[] = molecule, denominator
g = GCD(nums)
molecule = molecule / g
denominator = denominator / g
RESULT = molecule + "/" + denominator
ENDIF
ELSE
RESULT = serial + "/1"
ENDIF
CASE reTest(format, "(0+)\.?(0+)?") AND UBound(SPLIT(format, ".")) <= 1
Matches = reExecute(format, "(0+)\.?(0+)?")
len1 = LENGTH(Matches.Item(0).SubMatches(0))
len2 = LENGTH(Matches.Item(0).SubMatches(1))
DIM arr[] = LENGTH(INT(serial)), len1
IFB POS(".", format) THEN
RESULT = REPLACE(FORMAT(serial, CALCARRAY(arr, CALC_MAX) + len2 + 1, len2), " ", "0")
ELSE
RESULT = REPLACE(FORMAT(serial, CALCARRAY(arr, CALC_MAX)), " ", "0")
ENDIF
SELEND
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 上限値を求める配列
// 【戻値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(array[])
RESULT = RESIZE(array)
FEND
-
(1)
(2)
(3)
([6,7])
(6)
(10)
([)
入力した文字列をUTF8でURLエンコードする
PRINT ENCODE(ENCODE(INPUT("エンコードする文字列を入力してください。"), CODE_UTF8), CODE_URL)
-
(1)
(1)
アラビア数字をローマ数字に変換
HASHTBL Roman
Roman[1] = "I"
Roman[2] = "II"
Roman[3] = "III"
Roman[4] = "IV"
Roman[5] = "V"
Roman[6] = "VI"
Roman[7] = "VII"
Roman[8] = "VIII"
Roman[9] = "IX"
Roman[10] = "X"
Roman[40] = "XL"
Roman[50] = "L"
Roman[90] = "XC"
Roman[100] = "C"
Roman[400] = "CD"
Roman[500] = "D"
Roman[900] = "CM"
Roman[1000] = "M"
DIM arr[] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000
DIM num = INPUT("アラビア数字を入力して下さい。")
// 0以下4000以上の数字は無理
IF num <= 0 OR num >= 4000 THEN EXIT
DIM res = ""
n = UBound(arr)
REPEAT
SELECT TRUE
CASE num / Roman[n, HASH_KEY] >= 1
res = res + Roman[n, HASH_VAL]
num = num - Roman[n, HASH_KEY]
DEFAULT
n = n - 1
SELEND
UNTIL num = 0
PRINT res
//////////////////////////////////////////////////
// 【引数】
// array : 上限値を求める配列
// 【戻値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(array[])
RESULT = RESIZE(array)
FEND
-
(24)
MSGBOXの種別の数値から表示されるボタンを取得
HASHTBL type
type[BTN_YES] = "はい"
type[BTN_NO] = "いいえ"
type[BTN_OK] = "OK"
type[BTN_CANCEL] = "キャンセル"
type[BTN_ABORT] = "中止"
type[BTN_RETRY] = "再試行"
type[BTN_IGNORE] = "無視"
DIM num = INPUT("数値を入力してください。")
IF VAL(num) = ERR_VALUE THEN EXIT
PRINT num
PRINT "----------"
FOR n = 0 TO 6
IF (num AND POWER(2, n)) <> 0 THEN PRINT type[POWER(2, n)]
NEXT
MSGBOX("以下のボタンが表示されます", num)
-
(11)
(13)
(19)
(22)
- 結果
22 ---------- キャンセル はい 中止
関連記事
- MSGBOX (スクリプト関数)
- メッセージボックスを表示します。