LENGTHレングス関数

本ページには広告が含まれています。

文字数もしくは配列サイズを返します。配列のサイズを求めるときはLENGTHBだとエラーが発生します。

構文
  1. LongWord = LENGTH( 文字列 )
  2. LongWord = LENGTHB( 文字列 )
  3. LongWord = LENGTHS( 文字列 )
引数
文字列 (String,Array)必須
数える文字列(もしくは配列変数)
戻り値

文字数 (配列変数時は配列サイズを返す)

ANSI(バイト)処理の場合は LENGTHB

サロゲートペア 1文字を2でカウント LENGTHS

使い方

文字列の文字数を取得

引数に指定した文字列の文字数を数えます。「こんにちは」は5文字なので「5」、「Hello!」は6文字なので「6」を返します。

UWSC
PRINT LENGTH("こんにちは")
PRINT LENGTH("Hello!")
結果
プレーンテキスト
5
6

文字列のバイト数を取得

文字列のバイト数を取得するにはLENGTHB関数を使います。半角1文字=1Byte、全角1文字=2Byteです。「こんにちは」は全角5文字なので「10」、「Hello!」は半角6文字なので「6」を返します。

UWSC
PRINT LENGTHB("こんにちは")
PRINT LENGTHB("Hello!")
結果
プレーンテキスト
10
6

サロゲートペア文字

LENGTH関数では文字数を数えるので「𠮷野家」で3文字なので「3(=1+1+1)」、LENGTHB関数はバイト数を数えるので全角3文字なので「6(=3×2)」、LENGTHSはサロゲートペア文字の「𠮷」を2、それ以外は1で数えるので「4(=2+1+1)」となります。

UWSC
PRINT LENGTH("𠮷野家")
PRINT LENGTHB("𠮷野家")
PRINT LENGTHS("𠮷野家")
結果
プレーンテキスト
3
6
4

プログラム実行例

入力された文字列の計算をする

UWSC
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
結果
プレーンテキスト
INPUT:10>a=2
INPUT:10>b=3
INPUT:10>a*b
6

ルートの中を簡単にする

\(\sqrt{450000}\)の450000を素因数分解してルートの外に出せる値を外に出す。
UWSC
HASHTBL root

DIM num = 450000
DIM arr = primeFactorization(num)

FOR item IN arr
	root[item] = root[item] + 1
NEXT

DIM a = 1, b = 1

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

PRINT "√(" + num + ")=" + IIF(a <> 1, a, "") + IIF(b <> 1, "√(" + b + ")", "")

//////////////////////////////////////////////////
// 【引数】
//   array : 要素を追加する配列(参照引数) 
//   values : 追加する要素をvalue1から指定 
// 【戻り値】
//   処理後の配列の要素の数 
//////////////////////////////////////////////////
FUNCTION arrayPush(var array[], value1 = EMPTY, value2 = EMPTY, value3 = EMPTY, value4 = EMPTY, value5 = EMPTY, value6 = EMPTY, value7 = EMPTY, value8 = EMPTY, value9 = EMPTY, value10 = EMPTY, value11 = EMPTY, value12 = EMPTY, value13 = EMPTY, value14 = EMPTY, value15 = EMPTY, value16 = EMPTY)
    DIM i = 1
    WHILE EVAL("value" + i) <> EMPTY
	  DIM res = RESIZE(array, UBound(array) + 1)
	  array[res] = EVAL("value" + i)
	  i = i + 1
	WEND
	RESULT = LENGTH(array)
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]
	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

//////////////////////////////////////////////////
// 【引数】
//   inputs : 繰り返す文字列 
//   multiplier : inputsを繰り返す回数 
// 【戻り値】
//   inputsをmultiplier回を繰り返した文字列を返します 
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
	DIM res = ""
	FOR n = 1 TO multiplier
		res = res + inputs
	NEXT
	RESULT = res
FEND

//////////////////////////////////////////////////
// 【引数】
//   arrayname : 上限値を求める配列の名前 
//   dimension : 返す次元を示す整数 
// 【戻り値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(arrayname[], dimension = 1)
	RESULT = EVAL("RESIZE(arrayname" + strRepeat("[0]", dimension - 1) + ")")
FEND
結果
プレーンテキスト
√(450000)=300√(5)
使用関数
解説

ポップアップメニューで選択した項目を出力(サブメニューあり)

UWSC
DIM menu[] = "項目1", "項目2", "{項目2-1", "項目2-2}", "項目3", "{項目3-1", "項目3-2", "項目3-3}", "項目4", "項目5"
DIM res = POPUPMENU(menu)

// サブメニューとして指定する際に必要な「{ }」を削除
IF COPY(menu[res], 1, 1) = "{" THEN menu[res] = COPY(menu[res], 2)
IF COPY(menu[res], LENGTH(menu[res], 1)) = "}" THEN menu[res] = COPY(menu[res], 1, LENGTH(menu[res] - 1))

PRINT menu[res]

オブジェクトを作成したアプリケーションを示す数値を取得

UWSC
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
Excel.Workbooks.Add()

DIM dec = Excel.Worksheets.Creator
DIM hex = decToHex(dec)

DIM str = ""

FOR i = 1 TO LENGTH(hex) STEP 2
	str = str + CHR("$" + COPY(hex, i, 2))
NEXT

PRINT "32bit," + dec
PRINT "32bit(16進数),0x" + hex
PRINT "文字," + str

Excel.Quit

//////////////////////////////////////////////////
// 【引数】
//   bin : 2進数 
// 【戻り値】
//   16進数に変換した値 
//////////////////////////////////////////////////
FUNCTION binToHex(bin)
	HASHTBL bh
	bh["0000"] = "0";	bh["0001"] = "1";	bh["0010"] = "2";	bh["0011"] = "3";
	bh["0100"] = "4";	bh["0101"] = "5";	bh["0110"] = "6";	bh["0111"] = "7";
	bh["1000"] = "8";	bh["1001"] = "9";	bh["1010"] = "A";	bh["1011"] = "B";
	bh["1100"] = "C";	bh["1101"] = "D";	bh["1110"] = "E";	bh["1111"] = "F";
	// 小数ならば
	IFB POS(".", bin) <> 0 THEN
		DIM num = COPY(bin, 1, POS(".", bin) - 1)
		DIM frac = COPY(bin, POS(".", bin) + 1)
		num = strPad(num, CEIL(LENGTH(num) / 4) * 4, "0", LEFT)
		frac = strPad(frac, CEIL(LENGTH(frac) / 4) * 4, "0", RIGHT)
		DIM hex = ""
		FOR i = 1 TO LENGTH(num) STEP 4
			hex = hex + bh[COPY(num, i, 4)]
		NEXT
		hex = hex + "."
		FOR i = 1 TO LENGTH(frac) STEP 4
			hex = hex + bh[COPY(frac, i, 4)]
		NEXT
		RESULT = hex
	ELSE
		len = CEIL(LENGTH(bin) / 4) * 4
		FOR i = 1 TO len - LENGTH(bin)
			bin = "0" + bin
		NEXT
		bin = REPLACE(FORMAT(bin, len), " ", "0")
		hex = ""
		FOR i = 1 TO LENGTH(bin) / 4
			str = COPY(bin, i * 4 - 3, 4)
			hex = hex + bh[str]
		NEXT
		RESULT = hex
	ENDIF
FEND

//////////////////////////////////////////////////
// 【引数】
//   num : 10進数もしくは2進数の値 
//   bit : ビット 
// 【戻り値】
//   ビットを反転した値 
//////////////////////////////////////////////////
FUNCTION bitNot(num, bit = EMPTY)
	IFB isString(num) THEN
		DIM res = ""
		FOR i = 1 TO LENGTH(num)
			DIM str = COPY(num, i, 1)
			IFB str = "0" OR str = "1" THEN
				res = res + (1 - VAL(str))
			ELSE
				res = res + str
			ENDIF
		NEXT
		RESULT = res
	ELSE
		DIM exponent = IIF(bit = EMPTY, CEIL(LOGN(2, num + 1)), bit)
		RESULT = POWER(2, exponent) - num - 1
	ENDIF
FEND

//////////////////////////////////////////////////
// 【引数】
//   dec : 10進数 
//   signFlg : 符号付きならばTrue 
//   digits : 変換した16進数の桁数合わせを自動で行うかを示すブール値、もしくは桁数を表す数値(8,16,24,32,64のいずれか)を指定 
//   errorMsg : エラーメッセージを出力するかを示すブール値 
// 【戻り値】
//   16進数に変換した値 
//////////////////////////////////////////////////
FUNCTION decToHex(dec, signFlg = FALSE, digits = FALSE, errorMsg = FALSE)
	DIM hex = ""
	DIM msg = ""
	DIM isError = FALSE
	DIM dec2hex[] = "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"
	DIM decimalFlg = IIF(POS(".", dec) <> 0, TRUE, FALSE)
	DIM negativeFlg = IIF(dec < 0, TRUE, FALSE)
	dec = ABS(dec)

	// (1) 10進数を整数部と小数部に分ける
	DIM integer = IIF(decimalFlg, COPY(dec, 1, POS(".", dec) - 1), dec)
	DIM decimal = IIF(decimalFlg, "0." + COPY(dec, POS(".", dec) + 1), 0)

	// (2) 10進数(整数部)を16進数に変換する。
	REPEAT
		hex = dec2hex[integer MOD 16] + hex
		integer = INT(integer / 16)
	UNTIL integer = 0

	// (3) 10進数(小数部)を16進数に変換する。
	IFB decimalFlg THEN
		hex = hex + "."
		DIM loop = 0
		REPEAT
			loop = loop + 1
			decimal = decimal * 16
			hex = hex + dec2hex[decimal]
			offset = POWER(10, LENGTH(decimal) - POS(".", decimal))
			decimal = (decimal * offset - INT(decimal) * offset) / offset
		UNTIL decimal = 0 OR loop > 16
	ENDIF

	// digitsがFALSE以外なら
	IFB digits THEN
		// (4) 16進数の桁合わせを行う
		DIM tmp = hex
		DIM hexInteger = TOKEN(".", tmp)
		DIM hexDecimal = TOKEN(".", tmp)
		// 整数部、小数部を4bit単位になるまで拡張
		// 整数部、4の倍数になるまで整数部の先頭に'0'を追加
		// ※16進数は4bit単位なのでこの処理は不要
		DIM digit = LENGTH(hexInteger + hexDecimal)
		integer = INT(dec)
		IF signFlg AND COPY(hexToBin(hexInteger), 1, 1) = "1" THEN hexInteger = "0" + hexInteger

		IFB signFlg THEN
			IFB integer >= -128 AND integer <= 127 THEN						// -2^7〜2^7-1
				hexInteger = strRepeat("0", 2 - LENGTH(hexInteger)) + hexInteger
			ELSEIF integer >= -32768 AND integer <= 32767 THEN				// -2^15〜2^15-1
				hexInteger = strRepeat("0", 4 - LENGTH(hexInteger)) + hexInteger
			ELSEIF integer >= -8388608 AND integer <= 8388607 THEN			// -2^23〜2^23-1
				hexInteger = strRepeat("0", 6 - LENGTH(hexInteger)) + hexInteger
			ELSEIF integer >= -2147783648 AND integer <= 2147483647 THEN	// -2^31〜2^31-1
				hexInteger = strRepeat("0", 8 - LENGTH(hexInteger)) + hexInteger
			ELSE
				hexInteger = strRepeat("0", 16 - LENGTH(hexInteger)) + hexInteger
			ENDIF
		ELSE
			IFB integer <= 255 THEN				// 2^8-1
				hexInteger = strRepeat("0", 2 - LENGTH(hexInteger)) + hexInteger		
			ELSEIF integer <= 65535 THEN		// 2^16-1
				hexInteger = strRepeat("0", 4 - LENGTH(hexInteger)) + hexInteger		
			ELSEIF integer <= 16777215 THEN		// 2^24-1
				hexInteger = strRepeat("0", 6 - LENGTH(hexInteger)) + hexInteger
			ELSEIF integer <= 4294967295 THEN	// 2^32-1
				hexInteger = strRepeat("0", 8 - LENGTH(hexInteger)) + hexInteger
			ELSE
				hexInteger = strRepeat("0", 16 - LENGTH(hexInteger)) + hexInteger
			ENDIF
		ENDIF

		totalDigits = LENGTH(hexInteger + hexDecimal) * 4

		// 64bitを超えたら
		IFB totalDigits > 64 THEN
			DIM del32 = totalDigits - 32
			DIM del64 = totalDigits - 64
			IFB del32 = LENGTH(hexDecimal) * 4 AND digits <> 64 THEN
				hexDecimal = ""
				msg = "32bitを超えたため、小数点以下を削除しました"
			ELSEIF del32 < LENGTH(hexDecimal) * 4 AND digits <> 64 THEN
				hexDecimal = COPY(hexDecimal, 1, (LENGTH(hexDecimal) * 4 - del32) / 4)
				msg = "32bitを超えたため、小数点以下の一部を削除しました"
			ELSEIF del64 = LENGTH(hexDecimal) * 4 AND del64 <> 0 THEN
				hexDecimal = ""
				msg = "64bitを超えたため、小数点以下を削除しました"
			ELSEIF del64 < LENGTH(hexDecimal) * 4 THEN
				hexDecimal = COPY(hexDecimal, 1, (LENGTH(hexDecimal) * 4 - del64) / 4)
				msg = "64bitを超えたため、小数点以下の一部を削除しました"
			ELSE
				isError = TRUE
				msg = "64bitを超えるため、変換できません"
			ENDIF
		ENDIF

		// 整数部、小数部の合計桁数を8,16,24,32,64bit単位になるまで拡張
		digit = LENGTH(hexInteger + hexDecimal)
		DIM array[] = 8, 16, 24, 32, 64
		FOR item IN array
			IFB digit <= item THEN
				hexInteger = strRepeat("0", VAL(item)/4 - digit) + hexInteger
				BREAK
			ENDIF
		NEXT

		totalDigits = LENGTH(hexInteger + hexDecimal) * 4

		IFB digits = TRUE THEN
			// 桁合わせを自動調整
			IFB totalDigits > 64 THEN
				digit = LENGTH(hexInteger + hexDecimal)
				WHILE LENGTH(hexInteger) > 8 AND digit > digits
					IFB COPY(hexInteger, 1, 1) = "0" THEN
						digit = digit - 1
					ELSE
						BREAK
					ENDIF
				WEND
				WHILE LENGTH(hexDecimal) * 4 > 4 AND LENGTH(hexInteger + hexDecimal) > digits
					IFB COPY(hexDecimal, LENGTH(hexDecimal) - 1) = "0" THEN
						hexDecimal = COPY(hexDecimal, 1, LENGTH(hexDecimal) - 1)
					ELSE
						BREAK
					ENDIF
				WEND
				tmp = hexInteger + "." + hexDecimal
				hexInteger = COPY(tmp, 1, POS(".", tmp) - 1)
				hexDecimal = COPY(tmp, POS(".", tmp) + 1)
				totalDigits = LENGTH(hexInteger + hexDecimal)
				IFB totalDigits > 64 THEN
					isError = TRUE
					msg = "64bitを超えたため変換できません"
				ENDIF
 			ENDIF
		ELSE
			// 指定ビットに調整
			IFB totalDigits <= digits THEN
				hexInteger = strPad(hexInteger, digits / 4 - LENGTH(hexDecimal), "0", LEFT)
			ELSE
				// 桁あふれ調整
				totalDigits = LENGTH(hexInteger + hexDecimal)
				digit = LENGTH(hexInteger + hexDecimal)
				WHILE LENGTH(hexInteger) * 4 > 8 AND digit > digits
					IFB COPY(hexInteger, 1, 1) = "0" THEN
						hexInteger = COPY(hexInteger, 2)
						digit = digit - 4 / 4
					ELSE
						BREAK
					ENDIF
				WEND
				WHILE LENGTH(hexDecimal) * 4 > 4 AND LENGTH(hexInteger + hexDecimal) > digits
					IFB COPY(hexDecimal, LENGTH(hexDecimal) - 1) = "0" THEN
						hexDecimal = COPY(hexDecimal, 1, LENGTH(hexDecimal) - 1)
					ELSE
						BREAK
					ENDIF
				WEND
				tmp = hexInteger + "." + hexDecimal
				hexInteger = COPY(tmp, 1, POS(".", tmp) - 1)
				hexDecimal = COPY(tmp, POS(".", tmp) + 1)
				digit = LENGTH(hexInteger + hexDecimal) * 4
				IFB digit > digits THEN
					DIM deleteLength = digit - digits
					IFB deleteLength = LENGTH(hexDecimal) * 4 THEN
						hexDecimal = ""
						msg = "指定ビット数にするため小数点以下を削除しました"
					ELSEIF deleteLength < LENGTH(hexDecimal) * 4 THEN
						hexDecimal = COPY(hexDecimal, 1, LENGTH(hexDecimal) - deleteLength / 4)
						msg = "指定ビット数にするため小数点以下の一部を削除しました"
					ELSE
						isError = TRUE
						msg = "指定ビット数では変換できません"
					ENDIF
				ENDIF
			ENDIF
		ENDIF

		hex = hexInteger + IIF(hexDecimal <> "", "." + hexDecimal, "")
		
		// (5) 入力値がマイナスのため、16進数をマイナス値に変換する
		IFB negativeFlg THEN
			bin = hexToBin(hex)
			// 1の補数
			bin = bitNot(bin)
			// 2の補数
			DIM res = ""
			DIM carry = "1"
			FOR i = LENGTH(bin) TO 1 STEP -1
				IFB carry = "1" THEN
					SELECT COPY(bin, i, 1)
						CASE "0"
							res = "1" + res
							carry = 0
						CASE "1"
							res = "0" + res
						DEFAULT
							res = COPY(bin, i, 1) + res
					SELEND
				ELSE
					res = COPY(bin, i, 1) + res
				ENDIF
			NEXT
			hex = binToHex(res)
		ENDIF
	ENDIF
	IF errorMsg AND msg <> "" THEN PRINT msg
	RESULT = IIF(isError, ERR_VALUE, hex)
FEND

//////////////////////////////////////////////////
// 【引数】
//   hex : 16進数 
// 【戻り値】
//   2進数に変換した値 
//////////////////////////////////////////////////
FUNCTION hexToBin(hex)
	HASHTBL hb
	hb["0"] = "0000";	hb["1"] = "0001";	hb["2"] = "0010";	hb["3"] = "0011";
	hb["4"] = "0100";	hb["5"] = "0101";	hb["6"] = "0110";	hb["7"] = "0111";
	hb["8"] = "1000";	hb["9"] = "1001";	hb["A"] = "1010";	hb["B"] = "1011";
	hb["C"] = "1100";	hb["D"] = "1101";	hb["E"] = "1110";	hb["F"] = "1111";
	DIM bin = ""
	IFB POS(".", hex) <> 0 THEN
		FOR i = 1 TO LENGTH(hex)
			DIM str = COPY(hex, i, 1)
			IF str = "." THEN bin = bin + "."
			bin = bin + hb[str]
		NEXT
	ELSE
		FOR i = 1 TO LENGTH(hex)
			bin = bin + hb[COPY(hex, i, 1)]
		NEXT
	ENDIF
	RESULT = bin
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

//////////////////////////////////////////////////
// 【引数】
//   variable : 型を調べる変数 
// 【戻り値】
//    : TRUE : 与えられた変数が文字列型である、 
//   FALSE : 与えられた変数が文字列型でない、 : 
//////////////////////////////////////////////////
FUNCTION isString(variable)
	RESULT = IIF(VARTYPE(variable) = VAR_ASTR OR VARTYPE(variable) = VAR_USTR, TRUE, FALSE)
FEND

//////////////////////////////////////////////////
// 【引数】
//   num : 符号を求める数値 
// 【戻り値】
//   1 : 正の数、0 : ゼロ、-1 : 負の数、ERR_VALUE : それ以外 
//////////////////////////////////////////////////
FUNCTION sign(num)
	SELECT TRUE
		CASE !CHKNUM(num)
			RESULT = ERR_VALUE
		CASE num > 0
			RESULT = 1
		CASE num = 0
			RESULT = 0
		CASE num < 0
			RESULT = -1
	SELEND
FEND

//////////////////////////////////////////////////
// 【引数】
//   input : 入力文字列 
//   length : 埋めたあとの長さ 
//   str : 埋める文字 
//   type : 埋める方向 
// 【戻り値】
//   指定文字で埋めた文字列 
//////////////////////////////////////////////////
FUNCTION strPad(input, length, str = " ", type = RIGHT)
	DIM s = ""
	SELECT type
		CASE LEFT
			FOR i = 1 TO CEIL((length - LENGTH(input)) / LENGTH(str))
				s = s + str
			NEXT
			input = COPY(s, 1, length - LENGTH(input)) + input
		CASE RIGHT
			FOR i = 1 TO CEIL((length - LENGTH(input)) / LENGTH(str))
				s = s + str
			NEXT
			input = input + COPY(s, 1, length - LENGTH(input))
	SELEND
	RESULT = input
FEND

//////////////////////////////////////////////////
// 【引数】
//   inputs : 繰り返す文字列 
//   multiplier : inputsを繰り返す回数 
// 【戻り値】
//   inputsをmultiplier回を繰り返した文字列を返します 
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
	DIM res = ""
	FOR n = 1 TO multiplier
		res = res + inputs
	NEXT
	RESULT = res
FEND
結果
CSV
32bit,           1480803660
32bit(16進数),   0x5843454C
文字,            XCEL
使用関数

指定期間のメールを日毎に集計(Outlook)

UWSC
CONST olFolderIndex = 6

DIM Outlook = CREATEOLEOBJ("Outlook.Application")
DIM NameSpace = Outlook.GetNameSpace("MAPI")
DIM Folder = NameSpace.GetDefaultFolder(olFolderIndex)
DIM Items = Folder.Items

Items = Items.Restrict("[ReceivedTime] >= '2020/12/01' AND [ReceivedTime] < '2020/12/31'")

HASHTBL dates = HASH_SORT

FOR MailItem IN Items
	DIM datetime = MailItem.ReceivedTime
	GETTIME(0, datetime)
	DIM date = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
	dates[date] = dates[date] + 1 
NEXT

FOR i = 0 TO LENGTH(dates) - 1
	PRINT dates[i, HASH_KEY] + "<#TAB>" + dates[i, HASH_VAL]
NEXT
結果
プレーンテキスト
2020/12/05	78
2020/12/06	60
2020/12/07	72
2020/12/08	82
2020/12/09	75
2020/12/10	91
2020/12/11	82
2020/12/12	77
2020/12/13	63
2020/12/14	71
2020/12/15	104
2020/12/16	84
2020/12/17	80
2020/12/18	93
2020/12/19	78
2020/12/20	66
2020/12/21	67
2020/12/22	75
2020/12/23	82
2020/12/24	73
2020/12/25	87
2020/12/26	73
2020/12/27	56
2020/12/28	65
2020/12/29	69
2020/12/30	44
2020/12/31	1
使用関数

特定の値を除くランダム値を取得

1行目の配列に取得しない値を格納した配列、5行目のRANDOMの引数が取得するランダム値の範囲、今回の場合0~19の範囲です。8行目のLENGTH関数でランダム値を格納した配列のサイズを取得し、10個になったら終了。

UWSC
DIM exclude[] = 0, 5, 8, 9, 14, 15
DIM array[-1]

WHILE TRUE
	DIM n = RANDOM(20)
	IF inArray(n, exclude) THEN CONTINUE
	arrayPush(array, n)
	IF LENGTH(array) = 10 THEN BREAK
WEND

FOR item IN array
	PRINT item
NEXT

//////////////////////////////////////////////////
// 【引数】
//   array : 要素を追加する配列(参照引数) 
//   values : 追加する要素をvalue1から指定 
// 【戻り値】
//   処理後の配列の要素の数 
//////////////////////////////////////////////////
FUNCTION arrayPush(var array[], value1 = EMPTY, value2 = EMPTY, value3 = EMPTY, value4 = EMPTY, value5 = EMPTY, value6 = EMPTY, value7 = EMPTY, value8 = EMPTY, value9 = EMPTY, value10 = EMPTY, value11 = EMPTY, value12 = EMPTY, value13 = EMPTY, value14 = EMPTY, value15 = EMPTY, value16 = EMPTY)
    DIM i = 1
    WHILE EVAL("value" + i) <> EMPTY
	  DIM res = RESIZE(array, UBound(array) + 1)
	  array[res] = EVAL("value" + i)
	  i = i + 1
	WEND
	RESULT = LENGTH(array)
FEND

//////////////////////////////////////////////////
// 【引数】
//   needle : 探す値 
//   haystack : 配列 
//   strict : 型も同じかチェックします 
// 【戻り値】
//   TRUE : 配列中に指定した値が存在する、FALSE : 配列中に指定した値が存在しない 
//////////////////////////////////////////////////
FUNCTION inArray( needle, haystack[], strict = FALSE)
	DIM res = FALSE
	FOR item IN haystack
		IFB needle = item THEN
			IFB strict THEN
				IFB VARTYPE(needle) = VARTYPE(item) THEN
					res = TRUE
					BREAK
				ENDIF
			ELSE
				res = TRUE
				BREAK
			ENDIF
		ENDIF
	NEXT
	RESULT = res
FEND

//////////////////////////////////////////////////
// 【引数】
//   inputs : 繰り返す文字列 
//   multiplier : inputsを繰り返す回数 
// 【戻り値】
//   inputsをmultiplier回を繰り返した文字列を返します 
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
	DIM res = ""
	FOR n = 1 TO multiplier
		res = res + inputs
	NEXT
	RESULT = res
FEND

//////////////////////////////////////////////////
// 【引数】
//   arrayname : 上限値を求める配列の名前 
//   dimension : 返す次元を示す整数 
// 【戻り値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(arrayname[], dimension = 1)
	RESULT = EVAL("RESIZE(arrayname" + strRepeat("[0]", dimension - 1) + ")")
FEND
結果
プレーンテキスト
16
17
18
11
3
17
11
10
3
12
使用関数

今年の恵方を求める

恵方は西暦の下1桁の数字で決まるので、その値で条件分けをします。

UWSC
DIM year = getYear(today())
DIM y = COPY(year, LENGTH(year))

SELECT y
	CASE 0;		PRINT "西南西微西"
	CASE 1;		PRINT "南南東微南"
	CASE 2;		PRINT "北北西微北"
	CASE 3;		PRINT "南南東微南"
	CASE 4;		PRINT "東北東微東"
	CASE 5;		PRINT "西南西微西"
	CASE 6;		PRINT "南南東微南"
	CASE 7;		PRINT "北北西微北"
	CASE 8;		PRINT "南南東微南"
	CASE 9;		PRINT "東北東微東"
SELEND

//////////////////////////////////////////////////
// 【引数】
//   date : 日付(”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”) 
// 【戻り値】
//   指定した日付の「年」 
//////////////////////////////////////////////////
FUNCTION getYear(date)
	GETTIME(0, date)
	RESULT = G_TIME_YY4
FEND

//////////////////////////////////////////////////
// 【引数】
//   
// 【戻り値】
//   今日の日付 
//////////////////////////////////////////////////
FUNCTION today()
	GETTIME()
	RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND
結果
プレーンテキスト
西南西微西
使用関数
解説

関連記事

CALCARRAY関数 (スクリプト関数)
配列の合計値・最小値・最大値・平均値を求めます。
GETALLWIN関数 (スクリプト関数)
全ウィンドウのIDを取得します。
GETOLEITEM関数 (スクリプト関数)
JOIN関数 (スクリプト関数)
引数に指定した配列を結合し文字列を返します。
SETCLEAR関数 (スクリプト関数)
配列のすべての要素を任意の値で埋めます。
SHIFTARRAY関数 (スクリプト関数)
配列を指定した値だけシフトします。プラス値で後方、マイナス値で前方にシフトします。
連想配列
連想配列とは、自動的に割り当てられる数字をキーとして持つかわりに、自由に任意の文字列を割り振ることができる配列のことです。添え字に番号の変わりに名前をつけることでわかりやすく管理することができます。
divisors関数 (自作関数)
引数に指定した数値の約数のリストを返します。
POPUPMENU関数 (スクリプト関数)
ポップアップメニューを表示し、引数に指定した配列の中から選択された項目の要素番号を取得します。選択された項目を取得したい場合は、POPUPMENUの戻値を引数に指定した配列の要素番号として指定します。
Collatz関数 (自作関数)
コラッツ数列 を求め結果を配列で返します。