TEXT

数値を表示書式に基づいて変換した文字列を返します。

構文
TEXT( serial, format )
引数
serial
シリアル値
format
フォーマット
戻値
数値を表示書式に基づいて変換した文字列

プログラム

////////////////////////////////////////////////// // 【引数】 // serial : シリアル値 // format : フォーマット // 【戻値】 // 数値を表示書式に基づいて変換した文字列 ////////////////////////////////////////////////// FUNCTION TEXT(serial, format) SELECT TRUE CASE reTest(format, "\[h+\]") Matches = reExecute(format, "\[(h+)\]") RESULT = TEXT(Hour(serial), strRepeat("0", LENGTH(Matches.Item(0).SubMatches(0)))) CASE reTest(format, "^h+$") Matches = reExecute(format, "^(h+)$") RESULT = TEXT(Hour(serial) 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, "1899/12/30") RESULT = TEXT(G_TIME_MM, "0") CASE format = "mm" GETTIME(serial, "1899/12/30") RESULT = G_TIME_MM2 CASE format = "s" GETTIME(serial, "1899/12/30") RESULT = TEXT(G_TIME_SS, "0") CASE format = "ss" GETTIME(serial, "1899/12/30") RESULT = G_TIME_SS2 CASE format = "yyyy" GETTIME(serial, "1899/12/30") RESULT = G_TIME_YY4 CASE format = "yy" GETTIME(serial, "1899/12/30") RESULT = COPY(G_TIME_YY4, 3, 2) CASE format = "e" SELECT TRUE // 令和 CASE dateDiff("d", "2019/05/01", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = TEXT(serial, "yyyy") - 2018 // 平成 CASE dateDiff("d", "1989/01/08", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = TEXT(serial, "yyyy") - 1988 // 昭和 CASE dateDiff("d", "1926/12/25", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = TEXT(serial, "yyyy") - 1925 // 大正 CASE dateDiff("d", "1912/07/30", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = TEXT(serial, "yyyy") - 1911 // 明治 CASE dateDiff("d", "1868/01/25", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = TEXT(serial, "yyyy") - 1867 SELEND CASE format = "g" SELECT TRUE // 令和 CASE dateDiff("d", "2019/05/01", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "R" // 平成 CASE dateDiff("d", "1989/01/08", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "H" // 昭和 CASE dateDiff("d", "1926/12/25", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "S" // 大正 CASE dateDiff("d", "1912/07/30", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "T" // 明治 CASE dateDiff("d", "1868/01/25", 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", "2019/05/01", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "令和" // 平成 CASE dateDiff("d", "1989/01/08", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "平成" // 昭和 CASE dateDiff("d", "1926/12/25", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "昭和" // 大正 CASE dateDiff("d", "1912/07/30", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "大正" // 明治 CASE dateDiff("d", "1868/01/25", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "明治" SELEND CASE format = "mmmmm" RESULT = COPY(TEXT(serial, "mmmm"), 1, 1) CASE format = "mmmm" SELECT TEXT(serial, "m") CASE 1; RESULT = "January" CASE 2; RESULT = "February" CASE 3; RESULT = "March" CASE 4; RESULT = "April" CASE 5; RESULT = "May" CASE 6; RESULT = "June" CASE 7; RESULT = "July" CASE 8; RESULT = "August" CASE 9; RESULT = "September" CASE 10; RESULT = "October" CASE 11; RESULT = "November" CASE 12; RESULT = "December" SELEND CASE format = "mmm" RESULT = COPY(TEXT(serial, "mmmm"), 1, 3) CASE format = "dd" GETTIME(serial, "1899/12/30") RESULT = TEXT(G_TIME_DD2, "00") CASE format = "d" GETTIME(serial, "1899/12/30") RESULT = TEXT(G_TIME_DD, "0") CASE format = "aaaa" GETTIME(serial, "1899/12/30") RESULT = getWeekdayName(G_TIME_WW, "aaaa") CASE format = "aaa" GETTIME(serial, "1899/12/30") RESULT = getWeekdayName(G_TIME_WW, "aaa") CASE format = "dddd" GETTIME(serial, "1899/12/30") RESULT = getWeekdayName(G_TIME_WW, "dddd") CASE format = "ddd" GETTIME(serial, "1899/12/30") RESULT = getWeekdayName(G_TIME_WW, "ddd") CASE reTest(format, "(0+\.?0+)?%") Matches = reExecute(format, "(0+\.?0+)?%") RESULT = TEXT(serial * 100, Matches.Item(0).SubMatches(0)) + "%" CASE reTest(format, "^(.*?)\/(.*?)$") // 分母、分子 DIM demon, numer // 分数 DIM frac[1] DIM Pattern = "(\d+\.\d*?(\d+)\2+)" IFB reTest(serial, Pattern) THEN Matches = reExecute(serial, Pattern) // 循環節の桁数 digit = LENGTH(Matches.Item(0).SubMatches(1)) denom = POWER(10, digit) - 1 numer = serial * POWER(10, digit) - serial // 分子が小数なら整数に通分する num = POWER(10, LENGTH(numer) - POS(".", numer)) denom = denom * num numer = numer * num ELSE denom = POWER(10, LENGTH(serial) - POS(".", serial)) numer = serial * denom ENDIF frac[0] = denom frac[1] = numer // 最大公約数を求める n = GCD(frac) denom = frac[0] numer = frac[1] // 既約分数にする denom = denom / n numer = numer / n RESULT = numer + "/" + denom CASE reTest(format, "((#+),?)+") RESULT = reReplace(serial, "$1,", "(\d)(?=(\d{3})+(?!\d))") CASE reTest(format, "(0+)\.?(0+)?") 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 CASE reTest(format, "(.+)?((?:AM?|am?)\/(?:PM?|pm?))(.+)?") DIM arr[2] Matches = reExecute(format, "(.+)?((?:AM?|am?)\/(?:PM?|pm?))(.+)?") res = "" FOR n = 0 TO Matches.Item(0).SubMatches.Count - 1 arr[n] = Matches.Item(0).SubMatches(n) NEXT DIM res[2] FOR n = 0 TO 2 STEP 2 Matches = reExecute(arr[n], "([^yegmdahs]+)?(([yegmdahs])\3{0,})([^yegmdahs]+)?") FOR m = 0 TO Matches.Count - 1 SELECT TRUE // 「m」を含む CASE reTest(Matches.Item(m).SubMatches(1), "m+") // アルファベット部分の前後で「m」が月か分か判断 SELECT TRUE // 「m」が最初に出現するアルファベットなら CASE m = 0 // 次に出現するアルファベットが「d」なら「m」は月 IFB reTest(Matches.Item(m+1).SubMatches(1), "d+") THEN res[n] = res[n] + TEXT(serial, Matches.Item(m).SubMatches(1)) ENDIF // 次に出現するアルファベットが「s」なら「m」は分 IFB reTest(Matches.Item(m+1).SubMatches(1), "s+") THEN res[n] = res[n] + TEXT(INT(serial * 1440) MOD 60, strRepeat("0", LENGTH(Matches.Item(m).SubMatches(1)))) ENDIF // 「m」が2番目(2-1=1)以降に出現するアルファベットなら CASE m >= 1 // 前に出現したアルファベットが「y」なら「m」は月 IFB reTest(Matches.Item(m-1).SubMatches(1), "y+") THEN res[n] = res[n] + TEXT(serial, Matches.Item(m).SubMatches(1)) ENDIF // 前に出現したアルファベットが「h」なら「m」は分 IFB reTest(Matches.Item(m-1).SubMatches(1), "h+") THEN res[n] = res[n] + TEXT(INT(serial * 1440) MOD 60, strRepeat("0", LENGTH(Matches.Item(m).SubMatches(1)))) ENDIF SELEND CASE reTest(Matches.Item(m).SubMatches(1), "^h+$") IFB TEXT(serial, Matches.Item(m).SubMatches(1)) < 12 THEN res[1] = COPY(arr[1], 1, POS("/", arr[1]) - 1) // 午前 ELSE res[1] = COPY(arr[1], POS("/", arr[1]) + 1) // 午後 ENDIF res[n] = res[n] + TEXT(serial, Matches.Item(m).SubMatches(1)) // それ以外ならば DEFAULT res[n] = res[n] + TEXT(serial, Matches.Item(m).SubMatches(1)) SELEND res[n] = Matches.Item(m).SubMatches(0) + res[n] + Matches.Item(m).SubMatches(3) NEXT NEXT RESULT = JOIN(res, "") CASE reTest(format, "(([yegmdahs])\2{0,})([^yegmdahs]+)?") res = "" Matches = reExecute(format, "(([yegmdahs])\2{0,})([^yegmdahs]+)?") FOR n = 0 TO Matches.Count - 1 // mの前がyもしくはmの後がdならば→mは月 SELECT TRUE // 「m」を含む CASE reTest(Matches.Item(n).SubMatches(0), "m+") // アルファベット部分の前後で「m」が月か分か判断 SELECT TRUE // 「m」が最初に出現するアルファベットなら CASE n = 0 // 次に出現するアルファベットが「d」なら「m」は月 IFB reTest(Matches.Item(n+1).SubMatches(0), "d+") THEN res = res + TEXT(serial, Matches.Item(n).SubMatches(0)) ENDIF // 次に出現するアルファベットが「s」なら「m」は分 IFB reTest(Matches.Item(n+1).SubMatches(0), "s+") THEN res = res + TEXT(INT(serial * 1440) MOD 60, strRepeat("0", LENGTH(Matches.Item(n).SubMatches(0)))) ENDIF // 「m」が2番目(2-1=1)以降に出現するアルファベットなら CASE n >= 1 // 前に出現したアルファベットが「y」なら「m」は月 IFB reTest(Matches.Item(n-1).SubMatches(0), "y+") THEN res = res + TEXT(serial, Matches.Item(n).SubMatches(0)) ENDIF // 前に出現したアルファベットが「h」なら「m」は分 IFB reTest(Matches.Item(n-1).SubMatches(0), "h+") THEN res = res + TEXT(INT(serial * 1440) MOD 60, strRepeat("0", LENGTH(Matches.Item(n).SubMatches(0)))) ENDIF SELEND // それ以外ならば DEFAULT res = res + TEXT(serial, Matches.Item(n).SubMatches(0)) SELEND res = res + Matches.Item(n).SubMatches(2) NEXT RESULT = res SELEND FEND ////////////////////////////////////////////////// // 【引数】 // interval : 時間単位(yyyy︰年、m︰月、d︰日) // date1 : 日時1 // date2 : 日時2 // 【戻値】 // date2からdate1を引いた日数を求めます。 ////////////////////////////////////////////////// FUNCTION dateDiff(interval, date1, date2) SELECT interval CASE "yyyy" GETTIME(0, date1) y1 = G_TIME_YY GETTIME(0, date2) y2 = G_TIME_YY d = y2 - y1 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 SELEND RESULT = d FEND ////////////////////////////////////////////////// // 【引数】 // arr : 最大公約数を求める数値を格納した配列 // 【戻値】 // 最大公約数 ////////////////////////////////////////////////// FUNCTION GCD(arr[]) c = LENGTH(arr) 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 ////////////////////////////////////////////////// // 【引数】 // 数値 : 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 ////////////////////////////////////////////////// // 【引数】 // シリアル値 : 時間を表すシリアル値を指定 // 【戻値】 // 例)0…00、0.5…12、1.0…24 ////////////////////////////////////////////////// FUNCTION Hour(serial) RESULT = REPLACE(FORMAT(INT(serial * 24), 2), " ", "0") 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

書式記号

数値の書式記号

書式記号 説明
0 書式設定で指定した0の桁数よりも入力した数値の桁数が少ない場合、0が表示されます。
#
/ 分数を表す。

日付の書式記号

書式記号 説明
yy 西暦の下2桁を表示します。
yyyy 西暦を4桁で表示します。
e 年を年号を元に表示します。
ee 年を年号を元に2桁の数値で表示します。
g 元号をアルファベットの頭文字(M、T、S、H、R)で表示します。
gg 元号を漢字の頭文字(明、大、昭、平、令)で表示します。
ggg 元号を漢字(明治、大正、昭和、平成、令和)で表示します。
書式記号 説明
m 月を表示します。
mm 1桁の月には0をつけて2桁で表示します。
mmm 英語の月の頭文字3文字(Jan~Dec)を表示します。
mmmm 英語の月(January~December)を表示します。
mmmmm 英語の月の頭文字(J~D)で表示します。
書式記号 説明
d 日にちを表示します。
dd 1桁の日にちには0をつけて2桁で表示します。
曜日
書式記号 説明
ddd 英語の曜日の頭文字から3文字(Sun~Sat)を表示します。
dddd 英語の曜日(Sunday~Saturday)を表示します。
aaa 漢字で曜日の頭文字(日~土)を表示します。
aaaa 漢字で曜日(日曜日~土曜日)を表示します。

時間の書式記号

書式記号 説明
h 時刻(0~23)を表示します。
hh 1桁の時刻には0を付けて時刻(00~23)を表示します。
m 分(0~59)を表示します。
mm 1桁の分は、0を付けて分(00~59)を表示します。
s 秒(0~59)を表示します。
ss 1桁の秒は0を付けて秒(00~59)を表示します。

AM/PM

書式記号 説明
h AM/PM 12時間表示で時刻の後にAMまたはPMを表示します。
h:mm am/pm 12時間表示で時刻の後にamまたはpmを表示します。
hh:mm:ss A/P 12時間表示で時刻の後にAまたはPを表示します。
hh:mm:ss a/p 12時間表示で時刻の後にaまたはpを表示します。

文字列の書式記号

書式記号 説明
@

プログラム実行例

指定したフォルダの曲名と合計時間を出力

DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject") DIM Excel = CREATEOLEOBJ("Excel.Application") DIM Shell = CREATEOLEOBJ("Shell.Application") DIM Folder = Shell.NameSpace("D:\Music\Hey! Say! JUMP\COSMIC☆HUMAN") DIM serial HASHTBL iColumn FOR n = 0 TO 350 iColumn[Folder.GetDetailsOf(EMPTYPARAM, n)] = n NEXT FOR n = 0 TO Folder.Items.Count - 1 WITH Folder DIM FolderItem = .Items.Item(n) PRINT .GetDetailsOf(FolderItem, iColumn["名前"]) serial = serial + timeValue(.GetDetailsOf(FolderItem, iColumn["長さ"])) ENDWITH NEXT PRINT "----------" PRINT "合計時間<#TAB>" + TEXT(serial, "h:m:s") ////////////////////////////////////////////////// // 【引数】 // interval : 時間単位(yyyy︰年、m︰月、d︰日) // date1 : 日時1 // date2 : 日時2 // 【戻値】 // date2からdate1を引いた日数を求めます。 ////////////////////////////////////////////////// FUNCTION dateDiff(interval, date1, date2) SELECT interval CASE "yyyy" GETTIME(0, date1) y1 = G_TIME_YY GETTIME(0, date2) y2 = G_TIME_YY d = y2 - y1 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 SELEND RESULT = d FEND ////////////////////////////////////////////////// // 【引数】 // arr : 最大公約数を求める数値を格納した配列 // 【戻値】 // 最大公約数 ////////////////////////////////////////////////// FUNCTION GCD(arr[]) c = LENGTH(arr) 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 ////////////////////////////////////////////////// // 【引数】 // 数値 : 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 ////////////////////////////////////////////////// // 【引数】 // シリアル値 : 時間を表すシリアル値を指定 // 【戻値】 // 例)0…00、0.5…12、1.0…24 ////////////////////////////////////////////////// FUNCTION Hour(serial) RESULT = REPLACE(FORMAT(INT(serial * 24), 2), " ", "0") 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) SELECT TRUE CASE reTest(format, "\[h+\]") Matches = reExecute(format, "\[(h+)\]") RESULT = TEXT(Hour(serial), strRepeat("0", LENGTH(Matches.Item(0).SubMatches(0)))) CASE reTest(format, "^h+$") Matches = reExecute(format, "^(h+)$") RESULT = TEXT(Hour(serial) 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, "1899/12/30") RESULT = TEXT(G_TIME_MM, "0") CASE format = "mm" GETTIME(serial, "1899/12/30") RESULT = G_TIME_MM2 CASE format = "s" GETTIME(serial, "1899/12/30") RESULT = TEXT(G_TIME_SS, "0") CASE format = "ss" GETTIME(serial, "1899/12/30") RESULT = G_TIME_SS2 CASE format = "yyyy" GETTIME(serial, "1899/12/30") RESULT = G_TIME_YY4 CASE format = "yy" GETTIME(serial, "1899/12/30") RESULT = COPY(G_TIME_YY4, 3, 2) CASE format = "e" SELECT TRUE // 令和 CASE dateDiff("d", "2019/05/01", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = TEXT(serial, "yyyy") - 2018 // 平成 CASE dateDiff("d", "1989/01/08", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = TEXT(serial, "yyyy") - 1988 // 昭和 CASE dateDiff("d", "1926/12/25", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = TEXT(serial, "yyyy") - 1925 // 大正 CASE dateDiff("d", "1912/07/30", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = TEXT(serial, "yyyy") - 1911 // 明治 CASE dateDiff("d", "1868/01/25", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = TEXT(serial, "yyyy") - 1867 SELEND CASE format = "g" SELECT TRUE // 令和 CASE dateDiff("d", "2019/05/01", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "R" // 平成 CASE dateDiff("d", "1989/01/08", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "H" // 昭和 CASE dateDiff("d", "1926/12/25", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "S" // 大正 CASE dateDiff("d", "1912/07/30", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "T" // 明治 CASE dateDiff("d", "1868/01/25", 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", "2019/05/01", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "令和" // 平成 CASE dateDiff("d", "1989/01/08", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "平成" // 昭和 CASE dateDiff("d", "1926/12/25", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "昭和" // 大正 CASE dateDiff("d", "1912/07/30", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "大正" // 明治 CASE dateDiff("d", "1868/01/25", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "明治" SELEND CASE format = "mmmmm" RESULT = COPY(TEXT(serial, "mmmm"), 1, 1) CASE format = "mmmm" SELECT TEXT(serial, "m") CASE 1; RESULT = "January" CASE 2; RESULT = "February" CASE 3; RESULT = "March" CASE 4; RESULT = "April" CASE 5; RESULT = "May" CASE 6; RESULT = "June" CASE 7; RESULT = "July" CASE 8; RESULT = "August" CASE 9; RESULT = "September" CASE 10; RESULT = "October" CASE 11; RESULT = "November" CASE 12; RESULT = "December" SELEND CASE format = "mmm" RESULT = COPY(TEXT(serial, "mmmm"), 1, 3) CASE format = "dd" GETTIME(serial, "1899/12/30") RESULT = TEXT(G_TIME_DD2, "00") CASE format = "d" GETTIME(serial, "1899/12/30") RESULT = TEXT(G_TIME_DD, "0") CASE format = "aaaa" GETTIME(serial, "1899/12/30") RESULT = getWeekdayName(G_TIME_WW, "aaaa") CASE format = "aaa" GETTIME(serial, "1899/12/30") RESULT = getWeekdayName(G_TIME_WW, "aaa") CASE format = "dddd" GETTIME(serial, "1899/12/30") RESULT = getWeekdayName(G_TIME_WW, "dddd") CASE format = "ddd" GETTIME(serial, "1899/12/30") RESULT = getWeekdayName(G_TIME_WW, "ddd") CASE reTest(format, "(0+\.?0+)?%") Matches = reExecute(format, "(0+\.?0+)?%") RESULT = TEXT(serial * 100, Matches.Item(0).SubMatches(0)) + "%" CASE reTest(format, "^(.*?)\/(.*?)$") // 分母、分子 DIM demon, numer // 分数 DIM frac[1] DIM Pattern = "(\d+\.\d*?(\d+)\2+)" IFB reTest(serial, Pattern) THEN Matches = reExecute(serial, Pattern) // 循環節の桁数 digit = LENGTH(Matches.Item(0).SubMatches(1)) denom = POWER(10, digit) - 1 numer = serial * POWER(10, digit) - serial // 分子が小数なら整数に通分する num = POWER(10, LENGTH(numer) - POS(".", numer)) denom = denom * num numer = numer * num ELSE denom = POWER(10, LENGTH(serial) - POS(".", serial)) numer = serial * denom ENDIF frac[0] = denom frac[1] = numer // 最大公約数を求める n = GCD(frac) denom = frac[0] numer = frac[1] // 既約分数にする denom = denom / n numer = numer / n RESULT = numer + "/" + denom CASE reTest(format, "((#+),?)+") RESULT = reReplace(serial, "$1,", "(\d)(?=(\d{3})+(?!\d))") CASE reTest(format, "(0+)\.?(0+)?") 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 CASE reTest(format, "(.+)?((?:AM?|am?)\/(?:PM?|pm?))(.+)?") DIM arr[2] Matches = reExecute(format, "(.+)?((?:AM?|am?)\/(?:PM?|pm?))(.+)?") res = "" FOR n = 0 TO Matches.Item(0).SubMatches.Count - 1 arr[n] = Matches.Item(0).SubMatches(n) NEXT DIM res[2] FOR n = 0 TO 2 STEP 2 Matches = reExecute(arr[n], "([^yegmdahs]+)?(([yegmdahs])\3{0,})([^yegmdahs]+)?") FOR m = 0 TO Matches.Count - 1 SELECT TRUE // 「m」を含む CASE reTest(Matches.Item(m).SubMatches(1), "m+") // アルファベット部分の前後で「m」が月か分か判断 SELECT TRUE // 「m」が最初に出現するアルファベットなら CASE m = 0 // 次に出現するアルファベットが「d」なら「m」は月 IFB reTest(Matches.Item(m+1).SubMatches(1), "d+") THEN res[n] = res[n] + TEXT(serial, Matches.Item(m).SubMatches(1)) ENDIF // 次に出現するアルファベットが「s」なら「m」は分 IFB reTest(Matches.Item(m+1).SubMatches(1), "s+") THEN res[n] = res[n] + TEXT(INT(serial * 1440) MOD 60, strRepeat("0", LENGTH(Matches.Item(m).SubMatches(1)))) ENDIF // 「m」が2番目(2-1=1)以降に出現するアルファベットなら CASE m >= 1 // 前に出現したアルファベットが「y」なら「m」は月 IFB reTest(Matches.Item(m-1).SubMatches(1), "y+") THEN res[n] = res[n] + TEXT(serial, Matches.Item(m).SubMatches(1)) ENDIF // 前に出現したアルファベットが「h」なら「m」は分 IFB reTest(Matches.Item(m-1).SubMatches(1), "h+") THEN res[n] = res[n] + TEXT(INT(serial * 1440) MOD 60, strRepeat("0", LENGTH(Matches.Item(m).SubMatches(1)))) ENDIF SELEND CASE reTest(Matches.Item(m).SubMatches(1), "^h+$") IFB TEXT(serial, Matches.Item(m).SubMatches(1)) < 12 THEN res[1] = COPY(arr[1], 1, POS("/", arr[1]) - 1) // 午前 ELSE res[1] = COPY(arr[1], POS("/", arr[1]) + 1) // 午後 ENDIF res[n] = res[n] + TEXT(serial, Matches.Item(m).SubMatches(1)) // それ以外ならば DEFAULT res[n] = res[n] + TEXT(serial, Matches.Item(m).SubMatches(1)) SELEND res[n] = Matches.Item(m).SubMatches(0) + res[n] + Matches.Item(m).SubMatches(3) NEXT NEXT RESULT = JOIN(res, "") CASE reTest(format, "(([yegmdahs])\2{0,})([^yegmdahs]+)?") res = "" Matches = reExecute(format, "(([yegmdahs])\2{0,})([^yegmdahs]+)?") FOR n = 0 TO Matches.Count - 1 // mの前がyもしくはmの後がdならば→mは月 SELECT TRUE // 「m」を含む CASE reTest(Matches.Item(n).SubMatches(0), "m+") // アルファベット部分の前後で「m」が月か分か判断 SELECT TRUE // 「m」が最初に出現するアルファベットなら CASE n = 0 // 次に出現するアルファベットが「d」なら「m」は月 IFB reTest(Matches.Item(n+1).SubMatches(0), "d+") THEN res = res + TEXT(serial, Matches.Item(n).SubMatches(0)) ENDIF // 次に出現するアルファベットが「s」なら「m」は分 IFB reTest(Matches.Item(n+1).SubMatches(0), "s+") THEN res = res + TEXT(INT(serial * 1440) MOD 60, strRepeat("0", LENGTH(Matches.Item(n).SubMatches(0)))) ENDIF // 「m」が2番目(2-1=1)以降に出現するアルファベットなら CASE n >= 1 // 前に出現したアルファベットが「y」なら「m」は月 IFB reTest(Matches.Item(n-1).SubMatches(0), "y+") THEN res = res + TEXT(serial, Matches.Item(n).SubMatches(0)) ENDIF // 前に出現したアルファベットが「h」なら「m」は分 IFB reTest(Matches.Item(n-1).SubMatches(0), "h+") THEN res = res + TEXT(INT(serial * 1440) MOD 60, strRepeat("0", LENGTH(Matches.Item(n).SubMatches(0)))) ENDIF SELEND // それ以外ならば DEFAULT res = res + TEXT(serial, Matches.Item(n).SubMatches(0)) SELEND res = res + Matches.Item(n).SubMatches(2) NEXT RESULT = res SELEND FEND ////////////////////////////////////////////////// // 【引数】 // 時間 : 「hh:mm:ss」形式 // 【戻値】 // シリアル値 (例)0…00:00:00、0.5…12:00:00、1…24:00:00 ////////////////////////////////////////////////// FUNCTION timeValue(str) HASHTBL Pattern Pattern["hour"] = "(1[0-9]|2[0-4]|0?[0-9])" Pattern["minute"] = "([1-5][0-9]|60|0?[0-9])" pattern["second"] = "([1-5][0-9]|60|0?[0-9])" SELECT TRUE CASE reTest(str, Pattern["hour"] + ":" + Pattern["minute"] + ":" + pattern["second"] + " (AM|PM)") Matches = reExecute(str, Pattern["hour"] + ":" + Pattern["minute"] + ":" + pattern["second"] + " (AM|PM)") WITH Matches.Item(0) SELECT .SubMatches(3) CASE "AM" time = (.SubMatches(0) / 24) + (.SubMatches(1) / 1440) + (.SubMatches(2) / 86400) CASE "PM" time = ((.SubMatches(0) + 12) / 24) + (.SubMatches(1) / 1440) + (.SubMatches(2) / 86400) SELEND ENDWITH CASE reTest(str, Pattern["hour"] + ":" + Pattern["minute"] + ":" + pattern["second"]) Matches = reExecute(str, Pattern["hour"] + ":" + Pattern["minute"] + ":" + pattern["second"]) WITH Matches.Item(0) time = (.SubMatches(0) / 24) + (.SubMatches(1) / 1440) + (.SubMatches(2) / 86400) ENDWITH SELEND RESULT = time FEND
結果
01 COSMIC☆HUMAN.wav
02 SWEET or HOT?.wav
03 ルーレット.wav
04 Draw My Life!.wav
05 COSMIC☆HUMAN (オリジナル・カラオケ).wav
06 SWEET or HOT- (オリジナル・カラオケ).wav
07 ルーレット (オリジナル・カラオケ).wav
08 Draw My Life! (オリジナル・カラオケ).wav
----------
合計時間	00:34:16

指定したフォルダの動画の合計時間を求める

DIM Shell = CREATEOLEOBJ("Shell.Application") DIM Folder = Shell.NameSpace("D:\Videos\Apowersoft\Video Download Capture 6\Download\絶対零度") DIM FolderItems = Folder.Items DIM serial HASHTBL iColumn FOR n = 0 TO 350 iColumn[Folder.GetDetailsOf(EMPTYPARAM, n)] = n NEXT FOR n = 0 TO FolderItems.Count - 1 WITH Folder DIM FolderItem = .Items.Item(n) extension = .GetDetailsOf(FolderItem, iColumn["ファイル拡張子"]) IFB FolderItem.IsFolder = FALSE THEN serial = serial + timeValue(.GetDetailsOf(FolderItem, iColumn["長さ"])) ENDIF ENDWITH NEXT PRINT TEXT(serial, "hh:mm:ss") ////////////////////////////////////////////////// // 【引数】 // interval : 時間単位(yyyy︰年、m︰月、d︰日) // date1 : 日時1 // date2 : 日時2 // 【戻値】 // date2からdate1を引いた日数を求めます。 ////////////////////////////////////////////////// FUNCTION dateDiff(interval, date1, date2) SELECT interval CASE "yyyy" GETTIME(0, date1) y1 = G_TIME_YY GETTIME(0, date2) y2 = G_TIME_YY d = y2 - y1 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 SELEND RESULT = d FEND ////////////////////////////////////////////////// // 【引数】 // arr : 最大公約数を求める数値を格納した配列 // 【戻値】 // 最大公約数 ////////////////////////////////////////////////// FUNCTION GCD(arr[]) c = LENGTH(arr) 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 ////////////////////////////////////////////////// // 【引数】 // 数値 : 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 ////////////////////////////////////////////////// // 【引数】 // シリアル値 : 時間を表すシリアル値を指定 // 【戻値】 // 例)0…00、0.5…12、1.0…24 ////////////////////////////////////////////////// FUNCTION Hour(serial) RESULT = REPLACE(FORMAT(INT(serial * 24), 2), " ", "0") 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) SELECT TRUE CASE reTest(format, "\[h+\]") Matches = reExecute(format, "\[(h+)\]") RESULT = TEXT(Hour(serial), strRepeat("0", LENGTH(Matches.Item(0).SubMatches(0)))) CASE reTest(format, "^h+$") Matches = reExecute(format, "^(h+)$") RESULT = TEXT(Hour(serial) 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, "1899/12/30") RESULT = TEXT(G_TIME_MM, "0") CASE format = "mm" GETTIME(serial, "1899/12/30") RESULT = G_TIME_MM2 CASE format = "s" GETTIME(serial, "1899/12/30") RESULT = TEXT(G_TIME_SS, "0") CASE format = "ss" GETTIME(serial, "1899/12/30") RESULT = G_TIME_SS2 CASE format = "yyyy" GETTIME(serial, "1899/12/30") RESULT = G_TIME_YY4 CASE format = "yy" GETTIME(serial, "1899/12/30") RESULT = COPY(G_TIME_YY4, 3, 2) CASE format = "e" SELECT TRUE // 令和 CASE dateDiff("d", "2019/05/01", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = TEXT(serial, "yyyy") - 2018 // 平成 CASE dateDiff("d", "1989/01/08", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = TEXT(serial, "yyyy") - 1988 // 昭和 CASE dateDiff("d", "1926/12/25", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = TEXT(serial, "yyyy") - 1925 // 大正 CASE dateDiff("d", "1912/07/30", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = TEXT(serial, "yyyy") - 1911 // 明治 CASE dateDiff("d", "1868/01/25", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = TEXT(serial, "yyyy") - 1867 SELEND CASE format = "g" SELECT TRUE // 令和 CASE dateDiff("d", "2019/05/01", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "R" // 平成 CASE dateDiff("d", "1989/01/08", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "H" // 昭和 CASE dateDiff("d", "1926/12/25", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "S" // 大正 CASE dateDiff("d", "1912/07/30", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "T" // 明治 CASE dateDiff("d", "1868/01/25", 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", "2019/05/01", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "令和" // 平成 CASE dateDiff("d", "1989/01/08", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "平成" // 昭和 CASE dateDiff("d", "1926/12/25", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "昭和" // 大正 CASE dateDiff("d", "1912/07/30", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "大正" // 明治 CASE dateDiff("d", "1868/01/25", TEXT(serial, "yyyy/mm/dd")) >= 0 RESULT = "明治" SELEND CASE format = "mmmmm" RESULT = COPY(TEXT(serial, "mmmm"), 1, 1) CASE format = "mmmm" SELECT TEXT(serial, "m") CASE 1; RESULT = "January" CASE 2; RESULT = "February" CASE 3; RESULT = "March" CASE 4; RESULT = "April" CASE 5; RESULT = "May" CASE 6; RESULT = "June" CASE 7; RESULT = "July" CASE 8; RESULT = "August" CASE 9; RESULT = "September" CASE 10; RESULT = "October" CASE 11; RESULT = "November" CASE 12; RESULT = "December" SELEND CASE format = "mmm" RESULT = COPY(TEXT(serial, "mmmm"), 1, 3) CASE format = "dd" GETTIME(serial, "1899/12/30") RESULT = TEXT(G_TIME_DD2, "00") CASE format = "d" GETTIME(serial, "1899/12/30") RESULT = TEXT(G_TIME_DD, "0") CASE format = "aaaa" GETTIME(serial, "1899/12/30") RESULT = getWeekdayName(G_TIME_WW, "aaaa") CASE format = "aaa" GETTIME(serial, "1899/12/30") RESULT = getWeekdayName(G_TIME_WW, "aaa") CASE format = "dddd" GETTIME(serial, "1899/12/30") RESULT = getWeekdayName(G_TIME_WW, "dddd") CASE format = "ddd" GETTIME(serial, "1899/12/30") RESULT = getWeekdayName(G_TIME_WW, "ddd") CASE reTest(format, "(0+\.?0+)?%") Matches = reExecute(format, "(0+\.?0+)?%") RESULT = TEXT(serial * 100, Matches.Item(0).SubMatches(0)) + "%" CASE reTest(format, "^(.*?)\/(.*?)$") // 分母、分子 DIM demon, numer // 分数 DIM frac[1] DIM Pattern = "(\d+\.\d*?(\d+)\2+)" IFB reTest(serial, Pattern) THEN Matches = reExecute(serial, Pattern) // 循環節の桁数 digit = LENGTH(Matches.Item(0).SubMatches(1)) denom = POWER(10, digit) - 1 numer = serial * POWER(10, digit) - serial // 分子が小数なら整数に通分する num = POWER(10, LENGTH(numer) - POS(".", numer)) denom = denom * num numer = numer * num ELSE denom = POWER(10, LENGTH(serial) - POS(".", serial)) numer = serial * denom ENDIF frac[0] = denom frac[1] = numer // 最大公約数を求める n = GCD(frac) denom = frac[0] numer = frac[1] // 既約分数にする denom = denom / n numer = numer / n RESULT = numer + "/" + denom CASE reTest(format, "((#+),?)+") RESULT = reReplace(serial, "$1,", "(\d)(?=(\d{3})+(?!\d))") CASE reTest(format, "(0+)\.?(0+)?") 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 CASE reTest(format, "(.+)?((?:AM?|am?)\/(?:PM?|pm?))(.+)?") DIM arr[2] Matches = reExecute(format, "(.+)?((?:AM?|am?)\/(?:PM?|pm?))(.+)?") res = "" FOR n = 0 TO Matches.Item(0).SubMatches.Count - 1 arr[n] = Matches.Item(0).SubMatches(n) NEXT DIM res[2] FOR n = 0 TO 2 STEP 2 Matches = reExecute(arr[n], "([^yegmdahs]+)?(([yegmdahs])\3{0,})([^yegmdahs]+)?") FOR m = 0 TO Matches.Count - 1 SELECT TRUE // 「m」を含む CASE reTest(Matches.Item(m).SubMatches(1), "m+") // アルファベット部分の前後で「m」が月か分か判断 SELECT TRUE // 「m」が最初に出現するアルファベットなら CASE m = 0 // 次に出現するアルファベットが「d」なら「m」は月 IFB reTest(Matches.Item(m+1).SubMatches(1), "d+") THEN res[n] = res[n] + TEXT(serial, Matches.Item(m).SubMatches(1)) ENDIF // 次に出現するアルファベットが「s」なら「m」は分 IFB reTest(Matches.Item(m+1).SubMatches(1), "s+") THEN res[n] = res[n] + TEXT(INT(serial * 1440) MOD 60, strRepeat("0", LENGTH(Matches.Item(m).SubMatches(1)))) ENDIF // 「m」が2番目(2-1=1)以降に出現するアルファベットなら CASE m >= 1 // 前に出現したアルファベットが「y」なら「m」は月 IFB reTest(Matches.Item(m-1).SubMatches(1), "y+") THEN res[n] = res[n] + TEXT(serial, Matches.Item(m).SubMatches(1)) ENDIF // 前に出現したアルファベットが「h」なら「m」は分 IFB reTest(Matches.Item(m-1).SubMatches(1), "h+") THEN res[n] = res[n] + TEXT(INT(serial * 1440) MOD 60, strRepeat("0", LENGTH(Matches.Item(m).SubMatches(1)))) ENDIF SELEND CASE reTest(Matches.Item(m).SubMatches(1), "^h+$") IFB TEXT(serial, Matches.Item(m).SubMatches(1)) < 12 THEN res[1] = COPY(arr[1], 1, POS("/", arr[1]) - 1) // 午前 ELSE res[1] = COPY(arr[1], POS("/", arr[1]) + 1) // 午後 ENDIF res[n] = res[n] + TEXT(serial, Matches.Item(m).SubMatches(1)) // それ以外ならば DEFAULT res[n] = res[n] + TEXT(serial, Matches.Item(m).SubMatches(1)) SELEND res[n] = Matches.Item(m).SubMatches(0) + res[n] + Matches.Item(m).SubMatches(3) NEXT NEXT RESULT = JOIN(res, "") CASE reTest(format, "(([yegmdahs])\2{0,})([^yegmdahs]+)?") res = "" Matches = reExecute(format, "(([yegmdahs])\2{0,})([^yegmdahs]+)?") FOR n = 0 TO Matches.Count - 1 // mの前がyもしくはmの後がdならば→mは月 SELECT TRUE // 「m」を含む CASE reTest(Matches.Item(n).SubMatches(0), "m+") // アルファベット部分の前後で「m」が月か分か判断 SELECT TRUE // 「m」が最初に出現するアルファベットなら CASE n = 0 // 次に出現するアルファベットが「d」なら「m」は月 IFB reTest(Matches.Item(n+1).SubMatches(0), "d+") THEN res = res + TEXT(serial, Matches.Item(n).SubMatches(0)) ENDIF // 次に出現するアルファベットが「s」なら「m」は分 IFB reTest(Matches.Item(n+1).SubMatches(0), "s+") THEN res = res + TEXT(INT(serial * 1440) MOD 60, strRepeat("0", LENGTH(Matches.Item(n).SubMatches(0)))) ENDIF // 「m」が2番目(2-1=1)以降に出現するアルファベットなら CASE n >= 1 // 前に出現したアルファベットが「y」なら「m」は月 IFB reTest(Matches.Item(n-1).SubMatches(0), "y+") THEN res = res + TEXT(serial, Matches.Item(n).SubMatches(0)) ENDIF // 前に出現したアルファベットが「h」なら「m」は分 IFB reTest(Matches.Item(n-1).SubMatches(0), "h+") THEN res = res + TEXT(INT(serial * 1440) MOD 60, strRepeat("0", LENGTH(Matches.Item(n).SubMatches(0)))) ENDIF SELEND // それ以外ならば DEFAULT res = res + TEXT(serial, Matches.Item(n).SubMatches(0)) SELEND res = res + Matches.Item(n).SubMatches(2) NEXT RESULT = res SELEND FEND ////////////////////////////////////////////////// // 【引数】 // 時間 : 「hh:mm:ss」形式 // 【戻値】 // シリアル値 (例)0…00:00:00、0.5…12:00:00、1…24:00:00 ////////////////////////////////////////////////// FUNCTION timeValue(str) HASHTBL Pattern Pattern["hour"] = "(1[0-9]|2[0-4]|0?[0-9])" Pattern["minute"] = "([1-5][0-9]|60|0?[0-9])" pattern["second"] = "([1-5][0-9]|60|0?[0-9])" SELECT TRUE CASE reTest(str, Pattern["hour"] + ":" + Pattern["minute"] + ":" + pattern["second"] + " (AM|PM)") Matches = reExecute(str, Pattern["hour"] + ":" + Pattern["minute"] + ":" + pattern["second"] + " (AM|PM)") WITH Matches.Item(0) SELECT .SubMatches(3) CASE "AM" time = (.SubMatches(0) / 24) + (.SubMatches(1) / 1440) + (.SubMatches(2) / 86400) CASE "PM" time = ((.SubMatches(0) + 12) / 24) + (.SubMatches(1) / 1440) + (.SubMatches(2) / 86400) SELEND ENDWITH CASE reTest(str, Pattern["hour"] + ":" + Pattern["minute"] + ":" + pattern["second"]) Matches = reExecute(str, Pattern["hour"] + ":" + Pattern["minute"] + ":" + pattern["second"]) WITH Matches.Item(0) time = (.SubMatches(0) / 24) + (.SubMatches(1) / 1440) + (.SubMatches(2) / 86400) ENDWITH SELEND RESULT = time FEND
結果
09:24:43

この記事は役に立ちましたか?
役に立った 役に立たなかった