CREATEFORMクリエイトフォーム関数

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

フォーム画面を生成します。並行処理フラグがTrueの場合、InternetExplorer オブジェクトのメソッド・プロパティが利用できます。

複数のデータを一度にまとめて渡したいときに使用します。単一のデータを送信する場合はINPUT関数でも代用できます。

フォームの値を取得するにはGETFORMDATA関数、設定するにはSETFORMDATA関数を使います。

構文
  1. InternetExplorer = CREATEFORM( HTMLファイル, タイトル, 並行処理フラグ, オプション指定, 幅, 高さ, X, Y )
引数
HTMLファイル (String)必須
フォームとして表示するHTMLファイル名
タイトル (String)必須
表示するタイトル
並行処理フラグ (Boolean = False)省略可
FALSE
Submit属性のボタンが押されるまで処理を返さない (デフォルト)
TRUE
待たない
オプション指定(複数指定可) (#createform省略可
FOM_NOICON
クローズボタンを出さない
FOM_MINIMIZE
最小化ボタンを表示する
FOM_MAXIMIZE
最大化ボタンを表示する
FOM_NOHIDE
Submit属性のボタンが押されても画面を消さない
FOM_NOSUBMIT
Submit属性のボタンが押されても Submitに割り当てられた処理をしない
FOM_NORESIZE
ウィンドウのサイズ変更不可
FOM_BROWSER
ターゲット名解決のため、コントロールを最上位レベルのブラウザとする
FOM_FORMHIDE
フォームを非表示状態で起動する
FOM_TOPMOST
フォームを最前面固定にする
FOM_NOTASKBAR
タスクバーにアイコンを出さない
FOM_FORM2
2つ目のフォームを作成する(フォームは2つまで作成可)
幅,高さ (Integer)省略可
サイズ
X,Y (Integer)省略可
位置
戻り値
並行処理フラグ=FALSE
押されたボタンの Name
並行処理フラグ=TRUE
フォームの COMオブジェクト

注:<form>がありデータが多い場合はPOST指定に(デフォルトのGETでは制限がある為)「<form method="POST">」

デフォルトのレンダリングモードはIE7相当です。変更が必要な場合は(IE9に変更したい場合)、「<head>部に <meta http-equiv="X-UA-Compatible" content="IE=9">」を記述。

フォームとは

会員登録や商品の購入、お問い合わせをするときの入力欄のことを指します。CREATEFORM関数では作成したHTMLファイルのフォームを表示することができます。データの取得・設定はGETFORMDATA関数SETFORMDATA関数で行います。

フォーム作成に必要な要素

フォームは以下の要素を組み合わせて作成します。

テキストフィールド
ユーザーが自由にテキストを入力するための要素です。1行で文字数制限があります。
ラジオボタン
複数の選択肢から1つだけ選ぶことができる要素です。【例】性別
セレクトボックス
ラジオボタンと同じ機能を持つ要素ですが、選択肢をプルダウンメニューから選ぶことができます。選択肢が少ない場合はラジオボタン、多い場合はセレクトボックスを使います。【例】都道府県
チェックボックス
複数の選択肢からいくつかの項目をチェックができる要素です。
テキストエリア
ユーザーがテキストを入力するための要素です。テキストフィールドとは違い、複数行で長い文章を書くことができます。
送信ボタン
入力したデータを送信するためのボタンです。

フォーム作成に必要なタグ

フォームを作成するには以下に示すタグを使います。また、そのタグで使える属性を箇条書きで示しています。

form
フォームを作成するためのタグです。フォームとは入力欄・ボタンなどの集まりを指します。
input
テキストフィールドを作成します。type属性でテキストフィールドに入力できる形式を決めます。
select
セレクトボックスを作成するためのタグです。optionタグに選択肢を指定し全体をselectタグで囲むことでセレクトボックスとして機能させることができます。
option
セレクトボックスに書く選択肢を作成するためのタグです。
textarea
テキストエリアを表示するためのタグです。
label
フォームの中でフォームの項目名と構成する部品(チェックボックスやラジオボックス)を関連付けるためのタグです。
button
これまでに入力したフォームの内容を送信するのに使います。

指定できる属性

name属性

入力欄の名前を指定します。GETFORMDATA関数SETFORMDATA関数で値を取得・設定するにはこの値を指定します。

method属性

form要素で、データの送信方法(HTTPメソッド)を指定します。指定できる値はgetもしくはpostのどちらかです。

minlength属性

入力できる最小文字数を定義します。

maxlength属性

入力できる最大文字数を定義します。パスワードや電話番号で入力ミスや不正な値を防ぐことができます。

value属性

input要素で表される入力欄がフォームで送信する値の初期値を指定します。GETFORMDATA関数SETFORMDATA関数で重複するname属性がある場合、Valueにこの値を指定します。

required属性

指定されたタグの入力を必須項目にします。この属性の要素が空欄の場合、送信ボタンを押したときに入力を促すメッセージが表示されます。

placeholder属性

テキストボックスの入力例などヒントを表示します。textarea要素やinput要素のtype属性がtextの要素で使用できます。

type属性

inputタグで指定します。属性値には以下のいずれかを指定することができます。

text
1行のテキストを入力できます。
number
半角数字のみ入力できます。
tel
電話番号を入力できます。pattern属性で入力パターンを指定します。
pattern
入力パターンを正規表現で指定します。
placeholder
テキストボックスに入力例を表示します。
email
メールアドレスのみ入力できます。
url
URLのみ入力できます。
password
入力内容を●●●で非表示にできます。
search
検索キーワードを入力するときに使います。
reset
フォームの内容をリセットします。
submit
フォームの内容を送信します。
image
画像を選択、送信します。
date
カレンダーから日付を入力できます。
datetime-local
日付・時間を入力できます。
month
年と月を入力できます。
week
年と週を入力できます。
time
時間と分を入力できます。
radio
ラジオボタンで複数の選択肢の中から一つだけ選択できます。
checkbox
複数の選択肢から必要な数だけ選択できます。
hidden
ユーザーに見せる必要のないデータを送信するたきに使用します。
button
ボタンを表示します。子要素を持たせたい場合はbuttonタグを使用します。
file
ファイルアップロードボタンを表示します。accept属性でファイルの種類を制限することができます。
color
カラーパレットを表示します。
range
範囲を選択できるバーを表示します。

フォームの作り方

例として、以下のような項目を取得するためのフォームを作成します。

  • 名前
  • 性別…男性、女性の選択肢
  • 出身地…プルダウンメニューで地域区分を選択、例として47都道府県を記述すると長くなるので

まず、フォームを作るにはformタグを使います。送信する内容が少ない場合はmethod属性にGET、自由に記述できるテキストエリアを使う場合などデータ量が多くなる場合はPOSTを指定します。

入力ボックスなどの要素はこのformタグの中に記述していきます。

HTML
<html>
	<head></head>
	<body>
		<form method="POST"></form>
	</body>
</html>

inputタグで名前を入力するフォームを作ります。名前はテキスト1行で書けるので、type属性にtextを指定。name属性に入力された項目を表す名前をつけます。名前なのでnameでも良いですが、説明でわかりやすくするために今回はusernameと指定します。

tableタグを使って形を整えていきます。プレビュータブで表示の確認ができます。

  • HTML
  • プレビュー
HTML
<html>
	<head></head>
	<body>
		<form method="POST">
			<table>
				<tr>
					<th>名前</th>
					<td><input type="text" name="username"/></td>
				</tr>
			</table>
		</form>
	</body>
</html>

次に性別を選択する項目を追加します。性別は複数の中から一つだけ選択するので、ラジオボタンを使います。type属性にradioを指定。name属性に性別を意味する英単語のsexを指定。value属性にそれぞれの選択肢を意味する名前を指定します。

ラジオボタンは同じname属性のうち一つしか選択できないようになっているので、同じ名前をつけます。

  • HTML
  • プレビュー
HTML
<html>
	<head></head>
	<body>
		<form method="POST">
			<table>
				<tr>
					<th>名前</th>
					<td><input type="text" name="username"/></td>
				</tr>
				<tr>
					<th>性別</th>
					<td>
						<input type="radio" name="sex" value="man" />男性
						<input type="radio" name="sex" value="woman" />女性
					</td>
				</tr>
			</table>
		</form>
	</body>
</html>

次に出身地を選択するプルダウンメニューの作成。これも性別と同じ複数の項目から一つを選択するのですが、項目が多いのでプルダウンメニューで作成します。selectタグで枠を作り、中にoptionタグで項目をリスト化していきます。

  • HTML
  • プレビュー
HTML
<html>
	<head></head>
	<body>
		<form method="POST">
			<table>
				<tr>
					<th>名前</th>
					<td><input type="text" name="username"/></td>
				</tr>
				<tr>
					<th>性別</th>
					<td>
						<input type="radio" name="sex" value="man" />男性
						<input type="radio" name="sex" value="woman" />女性
					</td>
				</tr>
				<tr>
					<th>出身地</th>
					<td>
						<select name="region">
							<option value="">▼選択</option>
							<option value="北海道地方">北海道地方</option>
							<option value="東北地方">東北地方</option>
							<option value="関東地方">関東地方</option>
							<option value="中部地方">中部地方</option>
							<option value="近畿地方">近畿地方</option>
							<option value="中国地方">中国地方</option>
							<option value="四国地方">四国地方</option>
							<option value="九州地方">九州地方</option>
						</select>
					</td>
				</tr>
			</table>
		</form>
	</body>
</html>

最後にinputタグでtype属性がsubmitの送信ボタンを作成します。value属性にボタンに表示する文字列を指定します。

この送信ボタンを押すとフォームが閉じ、入力した内容がGETFORMDATA関数で取得できます。

  • HTML
  • プレビュー
HTML
<html>
	<head></head>
	<body>
		<form method="POST">
			<table>
				<tr>
					<th>名前</th>
					<td><input type="text" name="username"/></td>
				</tr>
				<tr>
					<th>性別</th>
					<td>
						<input type="radio" name="sex" value="man" />男性
						<input type="radio" name="sex" value="woman" />女性
					</td>
				</tr>
				<tr>
					<th>出身地</th>
					<td>
						<select name="region">
							<option value="">▼選択</option>
							<option value="北海道地方">北海道地方</option>
							<option value="東北地方">東北地方</option>
							<option value="関東地方">関東地方</option>
							<option value="中部地方">中部地方</option>
							<option value="近畿地方">近畿地方</option>
							<option value="中国地方">中国地方</option>
							<option value="四国地方">四国地方</option>
							<option value="九州地方">九州地方</option>
						</select>
					</td>
				</tr>
			</table>
			<input type="submit" value="送信" />
		</form>
	</body>
</html>

TEXTBLOCKでHTMLを定義

HTMLファイルを作成せず、複数行文字列の定義でHTMLをするには以下のように記述します。第一引数にabout:blank、第三引数にTrueを指定します。フォームを生成したらDocument.CREATEFORM (DOM)でHTMLを書き込みます。この方法でフォームを作成した場合、Submitボタンを押してもフォームが作成されないので、ウィンドウ右上の閉じるボタンで閉じる必要があります。

UWSC
DIM IE = CREATEFORM("about:blank", "フォーム", TRUE)
IE.Document.Write(html)

WHILE IE.Visible
	FUKIDASI()
	SLEEP(0.001)
WEND

TEXTBLOCK html
<html>
	<head></head>
	<body>
		<form method="POST">
			<table>
				<tr>
					<th>名前</th>
					<td><input type="text" name="username"/></td>
				</tr>
				<tr>
					<th>性別</th>
					<td>
						<input type="radio" name="sex" value="man" />男性
						<input type="radio" name="sex" value="woman" />女性
					</td>
				</tr>
				<tr>
					<th>出身地</th>
					<td>
						<select name="region">
							<option value="">▼選択</option>
							<option value="北海道地方">北海道地方</option>
							<option value="東北地方">東北地方</option>
							<option value="関東地方">関東地方</option>
							<option value="中部地方">中部地方</option>
							<option value="近畿地方">近畿地方</option>
							<option value="中国地方">中国地方</option>
							<option value="四国地方">四国地方</option>
							<option value="九州地方">九州地方</option>
						</select>
					</td>
				</tr>
			</table>
			<input type="submit" value="送信" />
		</form>
	</body>
</html>
ENDTEXTBLOCK

非表示フォームの操作

オプション指定でFOM_FORMHIDEを指定した場合、CTRLWIN関数で表示させるか、ACW関数でx,y座標、もしくは幅・高さのどちらか一方もしくは両方を指定すると表示されます。

UWSC
DIM IE = CREATEFORM("form.html", "", TRUE, FOM_FORMHIDE)

DIM ID = GETID(, "TFormHtm")
CTRLWIN(ID, SHOW)
UWSC
DIM IE = CREATEFORM("form.html", "", TRUE, FOM_FORMHIDE)

DIM ID = GETID(, "TFormHtm")

// 以下のいずれかを実行で表示
ACW(ID, x, y)
ACW(ID,,, 幅, 高さ)
ACW(ID, x, y, 幅, 高さ)

文字化け

文字化けする場合はheadタグ内にmetaタグを追加し、charset属性に文字コードを指定します。

文字コードはテキストファイルと同じ文字コードを指定します。HTMLファイルの文字コードはメモ帳で開いたときのステータスバー右下で確認することできます。

HTML
<head>
	<meta charset="文字コード">
</head>

指定できる文字コードはおもに以下のとおりです。

  • UTF-8
  • SHIFT_JIS
  • EUC-JP

UTF-8を指定する場合は以下のように記述します。

HTML
<head>
	<meta charset="UTF-8">
</head>

以下はHTMLファイルの文字コードをANSI(Shift_JIS)で設定しているが、ブラウザはmetaタグのUTF-8で解釈するので文字化けが発生します。

.png 文字化け.png

このように文字化けが発生する場合は、以下のようにHTMLファイルとmetaタグの文字コードを揃えると文字化けを解消することができます。

.png .png

ウィンドウの操作

指定できる幅・高さはウィンドウサイズではなくクライアント領域のサイズで、初期値は(幅,高さ)=(640,480)です。

X,Y座標を省略した場合、画面中央に表示されます。

CREATEFORM関数で幅・高さ、x座標・y座標の指定がうまく行かない場合は、フォームを生成してからACW関数で位置やサイズを指定することもできます。

UWSC
DIM ID = GETID(, "TFormHtm")
ACW(ID, x, y, 幅, 高さ)

ウィンドウ全体の幅・高さを指定

以下はウィンドウの幅を640、高さを480に設定する例です。

UWSC
DIM IE = CREATEFORM("form.html", "タイトル", TRUE)

CONST width = 640
CONST height = 480

DIM ID = GETID(, "TFormHtm")

ACW(ID, 0, 0, width, height)

WHILE IE.Visible
	SLEEP(0.001)
WEND

ウィンドウのクライアント領域の幅・高さを指定

以下はウィンドウのクライアント領域の幅を640、高さを480に設定する例です。

UWSC
DIM IE = CREATEFORM("form.html", "タイトル", TRUE)

CONST w = 640
CONST h = 480

DIM ID = GETID(, "TFormHtm")
DIM width = STATUS(ID, ST_WIDTH) - STATUS(ID, ST_CLWIDTH)
DIM height = STATUS(ID, ST_HEIGHT) - STATUS(ID, ST_CLHEIGHT)
width = width + w
height = height + h

ACW(ID, 0, 0, width, height)

WHILE IE.Visible
	SLEEP(0.001)
WEND

ウィンドウサイズの指定を自動化

X,Y座標、幅・高さを省略した場合デフォルトでは画面中央に(640, 480)のサイズで表示されますが、以下のプログラムではまず指定したpathのHTMLファイルを非表示で読み込みbodyタグのサイズ・余白を取得してその値からウィンドウのサイズを計算・設定します。この処理を行うことでフォームのウィンドウを最適なサイズで表示することができます。ACW関数を実行した時点でフォームが表示されます。

UWSC
DIM path = "form.html"				// フォームのHTMLファイル名
DIM formTitle = "タイトル"			// フォームのタイトル

IE = CREATEFORM(path, formTitle, TRUE, FOM_FORMHIDE)		// 位置・サイズ調整のため非表示でフォームを起動

WITH IE.Document.body
	DIM w = .offsetWidth			// bodyタグの幅
	DIM h = .offsetHeight			// bodyタグの高さ
	WITH .currentStyle
		DIM marginVertical = VAL(REPLACE(.marginTop, "px", "")) + VAL(REPLACE(.marginBottom, "px", ""))			// マージンの上下の合計値
		DIM marginHorizontal = VAL(REPLACE(.marginLeft, "px", "")) + VAL(REPLACE(.marginRight, "px", ""))		// マージンの左右の合計値
	ENDWITH
ENDWITH

DIM ID = GETID(formTitle, "TFormHtm")		// フォームのIDを取得
DIM width = w + marginHorizontal + STATUS(ID, ST_WIDTH) - STATUS(ID, ST_CLWIDTH)			// クライアント領域からウィンドウ幅を計算
DIM height = h + marginVertical + STATUS(ID, ST_HEIGHT) - STATUS(ID, ST_CLHEIGHT)		// クライアント領域からウィンドウ高さを計算
DIM x = (G_SCREEN_W - width) / 2			// 画面幅から画面中央に表示するためのx座標を求める
DIM y = (G_SCREEN_H - height) / 2			// 画面高さから画面中央に表示するためのy座標を求める

ACW(ID, x, y, width, height)				// フォームを計算した位置・幅・高さで表示

WHILE IE.Visible
	SLEEP(0.001)
WEND

ウィンドウを最適なサイズ(最小サイズ)で取得するためbodyタグにdisplay: inline-block;は必ず指定してください。marginを指定する場合はピクセル単位で指定します。emrem%vwなど他の単位には対応していません。

HTML
<html>
	<head>
		<style>
		<!--
			body{display:inline-block;margin: 5px 10px;}
		-->
		</style>
	</head>
	<body>
	</body>
</html>

頻繁に使うのであれば以下のように関数化しても良いかもしれません。

CREATEFORM関数の第一引数、第二引数、第四引数のみを指定するだけで使えます。第三引数の並行処理フラグはTRUEを指定しないと非表示にできないので、引数の指定は省略しています。

2行目にあるCREATEFORM関数の第四引数は、フォームを非表示にするFOM_FORMHIDEoptionsで指定された値の論理和(OR)を取ることでoptionsFOM_FORMHIDEのオプションを指定することができます。

UWSC
FUNCTION CreateFormEx(path, title, options = FALSE)
	RESULT = CREATEFORM(path, title, TRUE, options OR FOM_FORMHIDE)		// 位置・サイズ調整のため非表示でフォームを起動

	WITH RESULT.Document.body
		DIM w = .offsetWidth			// bodyタグの幅
		DIM h = .offsetHeight			// bodyタグの高さ
		WITH .currentStyle
			DIM marginVertical = VAL(REPLACE(.marginTop, "px", "")) + VAL(REPLACE(.marginBottom, "px", ""))			// マージンの上下の合計値
			DIM marginHorizontal = VAL(REPLACE(.marginLeft, "px", "")) + VAL(REPLACE(.marginRight, "px", ""))		// マージンの左右の合計値
		ENDWITH
	ENDWITH

	DIM ID = GETID(title, "TFormHtm")		// フォームのIDを取得
	DIM width = w + marginHorizontal + STATUS(ID, ST_WIDTH) - STATUS(ID, ST_CLWIDTH)			// クライアント領域からウィンドウ幅を計算
	DIM height = h + marginVertical + STATUS(ID, ST_HEIGHT) - STATUS(ID, ST_CLHEIGHT)		// クライアント領域からウィンドウ高さを計算
	DIM x = (G_SCREEN_W - width) / 2			// 画面幅から画面中央に表示するためのx座標を求める
	DIM y = (G_SCREEN_H - height) / 2			// 画面高さから画面中央に表示するためのy座標を求める

	ACW(ID, x, y, width, height)				// フォームを計算した位置・幅・高さで表示
FEND

プログラム実行例

フォーム(並行処理あり)

並行処理フラグがTRUEなのでフォームのCOMオブジェクト名が返ります。

  • Main
  • FUNCTIONS
UWSC
IE = CREATEFORM("form.html", "プロフィール", TRUE, FOM_MINIMIZE OR FOM_MAXIMIZE, 350, 350)

SETFORMDATA("山田太郎", "name")	 // テキストボックス
SETFORMDATA(TRUE, "sex", "man")	 // ラジオボタン
SETFORMDATA("30代", "age")	 // セレクトボックス
SETFORMDATA("東北", "pref")	 // セレクトボックス

WHILE IE.Visible
	SLEEP(0.001)
WEND

PRINT GETFORMDATA("name")
PRINT GETFORMDATA("sex")
PRINT GETFORMDATA("age")
PRINT GETFORMDATA("pref")
UWSC
//////////////////////////////////////////////////
// 【引数】
//   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

//////////////////////////////////////////////////
// 【引数】
//   array : 最大公約数を求める数値を格納した配列 
// 【戻り値】
//   最大公約数 
//////////////////////////////////////////////////
FUNCTION GCD(array[])
	DIM c = LENGTH(array)
	DIM rem = array[c-1] MOD array[c-2]
	IFB rem = 0 THEN
		IFB LENGTH(array) = 2 THEN
			RESULT = array[c-2]
			EXIT
		ENDIF
		RESIZE(array, c-2)
		RESULT = GCD(array)
		EXIT
	ENDIF
	array[c-1] = array[c-2]
	array[c-2] = rem
	RESULT = GCD(array)
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

//////////////////////////////////////////////////
// 【引数】
//   date : 日付文字列(”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”)もしくはシリアル値 
//   type : 取得する曜日番号の種類を示す0〜3または11〜17の値。1と17は日曜日を1、2と11は月曜日を1とカウントします。11以降はExcel2010で追加された値で、互換性を保つために重複した値があります。 
// 【戻り値】
//   typeで指定した種類によって以下の値を返します。 : (0 : 0(日曜)〜6(土曜)、1 : 1(日曜)~7(土曜)、2 : 1(月曜)~7(日曜)、3 : 0(月曜)〜6(日曜)、11 : 1(月曜)~7(日曜)、12 : 1(火曜)~7(月曜)、13 : 1(水曜)~7(火曜)、14 : 1(木曜)~7(水曜)、15 : 1(金曜)~7(木曜)、16 : 1(土曜)~7(金曜)、17 : 1(日曜)~7(土曜)) 
//////////////////////////////////////////////////
FUNCTION getWeekday(date, type = 1)
	IF VARTYPE(date) <> 258 THEN date = text(date, "yyyy/mm/dd")
	GETTIME(0, date)
	DIM w = G_TIME_WW
	SELECT TRUE
		CASE type = 0
			RESULT = w
		CASE type = 1
			RESULT = w + 1
		CASE type = 2
			RESULT = IIF(w=0, 7, w)
		CASE type = 3
			RESULT = (w+6) MOD 7
		CASE type >= 11
			RESULT = ((getWeekday(date, 2) + 17 - type) MOD 7) + 1
	SELEND
FEND

//////////////////////////////////////////////////
// 【引数】
//   serial : シリアル値もしくは時刻文字列 
// 【戻り値】
//   時刻から時間を表す0〜23の範囲の値 
//////////////////////////////////////////////////
FUNCTION Hour(serial)
	IF VARTYPE(serial) = 258 THEN serial = timeValue(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 or YYYY/MM/DD or YYYY-MM-DDのいずれかの形式。 
// 【戻り値】
//   TRUE : 日付として認識できる、FALSE : 日付として認識できない 
//////////////////////////////////////////////////
FUNCTION isDate(date)
	TRY
		GETTIME(0, date)
		RESULT = TRUE
	EXCEPT
		RESULT = FALSE
	ENDTRY
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

//////////////////////////////////////////////////
// 【引数】
//   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 : フォーマット 
// 【戻り値】
//   数値を表示書式に基づいて変換した文字列 
//////////////////////////////////////////////////
//////////////////////////////////////////////////
// 【引数】
//   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"
	serial = VAL(serial)
	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)
			DIM aaa[] = "日", "月", "火", "水", "木", "金", "土"
			DIM aaaa[] = "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"
			DIM ddd[] = "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
			DIM dddd[] = "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday";
			RESULT = EVAL(Matches.Item(0).SubMatches(0) + "[" + getWeekday(G_TIME_WW, 1) + "]")
		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

//////////////////////////////////////////////////
// 【引数】
//   str : 時刻文字列。hh:nn:ss AM/PM、hh:nn AM/PM、hh AM/PM、hh:nn:ss、hh:nn、hh時nn分ss秒、hh時nn分のいずれかの形式を指定。 
// 【戻り値】
//   シリアル値 (例)0…00:00:00、0.5…12:00:00、0.999988425925926…23:59:59 
//////////////////////////////////////////////////
FUNCTION timeValue(str)
	DIM serial = 0
	DIM Matches
	DIM pattern = "(\d+)"
	DIM hh = "(0?[0-9]|1[0-2])"
	DIM ampm = "([AP]M|[ap]m)"
	SELECT TRUE
		CASE reTest(str, "\b" + hh + ":" + pattern + ":" + pattern + " " + ampm + "\b")
			Matches = reExecute(str, "\b" + hh + ":" + pattern + ":" + pattern + " " + ampm + "\b")
			WITH Matches.Item(0)
				serial = timeValue(.SubMatches(0) + " " + .SubMatches(3)) + VAL(.SubMatches(1)) / 1440 + VAL(.SubMatches(2)) / 86400
			ENDWITH
		CASE reTest(str, "\b" + hh + ":" + pattern + " " + ampm + "\b")
			Matches = reExecute(str, "\b" + hh + ":" + pattern + " " + ampm + "\b")
			WITH Matches.Item(0)
				serial = timeValue(.SubMatches(0) + " " + .SubMatches(2)) + VAL(.SubMatches(1)) / 1440
			ENDWITH
		CASE reTest(str, "\b" + hh + " " + ampm + "\b")
			Matches = reExecute(str, "\b" + hh + " " + ampm + "\b")
			WITH Matches.Item(0)
				serial = VAL(.SubMatches(0) MOD 12) + IIF(reTest(.SubMatches(1), "AM|am"), 0, 12)
				serial = serial / 24
			ENDWITH
		CASE reTest(str, "\b" + pattern + ":" + pattern + ":" + pattern + "\b")
			Matches = reExecute(str, "\b" + pattern + ":" + pattern + ":" + pattern + "\b")
			WITH Matches.Item(0)
				serial = VAL(.SubMatches(0)) / 24 + VAL(.SubMatches(1)) / 1440 + VAL(.SubMatches(2)) / 86400
			ENDWITH
		CASE reTest(str, "\b" + pattern + ":" + pattern + "\b")
			Matches = reExecute(str, "\b" + pattern + ":" + pattern + "\b")
			WITH Matches.Item(0)
				serial = VAL(.SubMatches(0)) / 24 + VAL(.SubMatches(1)) / 1440
			ENDWITH
		CASE reTest(str, "\b" + pattern + "時" + pattern + "分" + pattern + "秒")
			Matches = reExecute(str, "\b" + pattern + "時" + pattern + "分" + pattern + "秒")
			WITH Matches.Item(0)
				serial = VAL(.SubMatches(0)) / 24 + VAL(.SubMatches(1)) / 1440 + VAL(.SubMatches(2)) / 86400
			ENDWITH
		CASE reTest(str, "\b" + pattern + "時" + pattern + "分")
			Matches = reExecute(str, "\b" + pattern + "時" + pattern + "分")
			WITH Matches.Item(0)
				serial = VAL(.SubMatches(0)) / 24 + VAL(.SubMatches(1)) / 1440
			ENDWITH
		DEFAULT
			serial = ERR_VALUE
	SELEND
	RESULT = serial - INT(serial)
FEND

//////////////////////////////////////////////////
// 【引数】
//   arrayname : 上限値を求める配列の名前 
//   dimension : 返す次元を示す整数 
// 【戻り値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(arrayname[], dimension = 1)
	RESULT = EVAL("RESIZE(arrayname" + strRepeat("[0]", dimension - 1) + ")")
FEND
HTML
<html>
	<head>
		<style>
			dt{font-weight: bold;}
			dd{margin: 0 0 1em 0;}
		</style>
	</head>
	<body>
		<form method="get">
			<dl>
				<dt>名前</dt>
				<dd>
					<input type="text" name="name" />
				</dd>
				<dt>性別</dt>
				<dd>
					<input type="radio" name="sex" value="man" />男性
					<input type="radio" name="sex" value="woman" />女性
				</dd>
				<dt>年齢</dt>
				<dd>
					<select name="age">
						<option value="1">20歳未満</option>
						<option value="2">20代</option>
						<option value="3">30代</option>
						<option value="4">40代</option>
						<option value="5">50代</option>
						<option value="6">60代</option>
						<option value="7">70歳以上</option>
					</select>
				</dd>
				<dt>都道府県</dt>
				<dd>
					<select name="pref">
						<option value="1">北海道</option>
						<option value="2">東北</option>
						<option value="3">関東</option>
						<option value="4">中部</option>
						<option value="5">近畿</option>
						<option value="6">中国</option>
						<option value="7">四国</option>
						<option value="8">九州</option>
					</select>
				</dd>
			</dl>
			<input type="submit" name="ok" value="送信" />
			<input type="submit" name="cancel" value="キャンセル" />
		</form>
	</body>
</html>
.png

フォーム(並行処理なし)

並行処理フラグがFALSEなので押されたボタンのname属性が返ります。

  • Main
  • FUNCTIONS
UWSC
SELECT CREATEFORM("form.html", "プロフィール", FALSE, FOM_MINIMIZE OR FOM_MAXIMIZE, 350, 350)
	CASE "ok"
		PRINT GETFORMDATA("name")
		PRINT GETFORMDATA("sex")
		PRINT GETFORMDATA("age")
		PRINT GETFORMDATA("pref")
	CASE "cancel"
		PRINT "キャンセルされました"
	CASE "close"
		PRINT "ウィンドウが閉じられました"
SELEND
UWSC
//////////////////////////////////////////////////
// 【引数】
//   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

//////////////////////////////////////////////////
// 【引数】
//   array : 最大公約数を求める数値を格納した配列 
// 【戻り値】
//   最大公約数 
//////////////////////////////////////////////////
FUNCTION GCD(array[])
	DIM c = LENGTH(array)
	DIM rem = array[c-1] MOD array[c-2]
	IFB rem = 0 THEN
		IFB LENGTH(array) = 2 THEN
			RESULT = array[c-2]
			EXIT
		ENDIF
		RESIZE(array, c-2)
		RESULT = GCD(array)
		EXIT
	ENDIF
	array[c-1] = array[c-2]
	array[c-2] = rem
	RESULT = GCD(array)
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

//////////////////////////////////////////////////
// 【引数】
//   date : 日付文字列(”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”)もしくはシリアル値 
//   type : 取得する曜日番号の種類を示す0〜3または11〜17の値。1と17は日曜日を1、2と11は月曜日を1とカウントします。11以降はExcel2010で追加された値で、互換性を保つために重複した値があります。 
// 【戻り値】
//   typeで指定した種類によって以下の値を返します。 : (0 : 0(日曜)〜6(土曜)、1 : 1(日曜)~7(土曜)、2 : 1(月曜)~7(日曜)、3 : 0(月曜)〜6(日曜)、11 : 1(月曜)~7(日曜)、12 : 1(火曜)~7(月曜)、13 : 1(水曜)~7(火曜)、14 : 1(木曜)~7(水曜)、15 : 1(金曜)~7(木曜)、16 : 1(土曜)~7(金曜)、17 : 1(日曜)~7(土曜)) 
//////////////////////////////////////////////////
FUNCTION getWeekday(date, type = 1)
	IF VARTYPE(date) <> 258 THEN date = text(date, "yyyy/mm/dd")
	GETTIME(0, date)
	DIM w = G_TIME_WW
	SELECT TRUE
		CASE type = 0
			RESULT = w
		CASE type = 1
			RESULT = w + 1
		CASE type = 2
			RESULT = IIF(w=0, 7, w)
		CASE type = 3
			RESULT = (w+6) MOD 7
		CASE type >= 11
			RESULT = ((getWeekday(date, 2) + 17 - type) MOD 7) + 1
	SELEND
FEND

//////////////////////////////////////////////////
// 【引数】
//   serial : シリアル値もしくは時刻文字列 
// 【戻り値】
//   時刻から時間を表す0〜23の範囲の値 
//////////////////////////////////////////////////
FUNCTION Hour(serial)
	IF VARTYPE(serial) = 258 THEN serial = timeValue(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 or YYYY/MM/DD or YYYY-MM-DDのいずれかの形式。 
// 【戻り値】
//   TRUE : 日付として認識できる、FALSE : 日付として認識できない 
//////////////////////////////////////////////////
FUNCTION isDate(date)
	TRY
		GETTIME(0, date)
		RESULT = TRUE
	EXCEPT
		RESULT = FALSE
	ENDTRY
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

//////////////////////////////////////////////////
// 【引数】
//   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 : フォーマット 
// 【戻り値】
//   数値を表示書式に基づいて変換した文字列 
//////////////////////////////////////////////////
//////////////////////////////////////////////////
// 【引数】
//   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"
	serial = VAL(serial)
	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)
			DIM aaa[] = "日", "月", "火", "水", "木", "金", "土"
			DIM aaaa[] = "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"
			DIM ddd[] = "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
			DIM dddd[] = "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday";
			RESULT = EVAL(Matches.Item(0).SubMatches(0) + "[" + getWeekday(G_TIME_WW, 1) + "]")
		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

//////////////////////////////////////////////////
// 【引数】
//   str : 時刻文字列。hh:nn:ss AM/PM、hh:nn AM/PM、hh AM/PM、hh:nn:ss、hh:nn、hh時nn分ss秒、hh時nn分のいずれかの形式を指定。 
// 【戻り値】
//   シリアル値 (例)0…00:00:00、0.5…12:00:00、0.999988425925926…23:59:59 
//////////////////////////////////////////////////
FUNCTION timeValue(str)
	DIM serial = 0
	DIM Matches
	DIM pattern = "(\d+)"
	DIM hh = "(0?[0-9]|1[0-2])"
	DIM ampm = "([AP]M|[ap]m)"
	SELECT TRUE
		CASE reTest(str, "\b" + hh + ":" + pattern + ":" + pattern + " " + ampm + "\b")
			Matches = reExecute(str, "\b" + hh + ":" + pattern + ":" + pattern + " " + ampm + "\b")
			WITH Matches.Item(0)
				serial = timeValue(.SubMatches(0) + " " + .SubMatches(3)) + VAL(.SubMatches(1)) / 1440 + VAL(.SubMatches(2)) / 86400
			ENDWITH
		CASE reTest(str, "\b" + hh + ":" + pattern + " " + ampm + "\b")
			Matches = reExecute(str, "\b" + hh + ":" + pattern + " " + ampm + "\b")
			WITH Matches.Item(0)
				serial = timeValue(.SubMatches(0) + " " + .SubMatches(2)) + VAL(.SubMatches(1)) / 1440
			ENDWITH
		CASE reTest(str, "\b" + hh + " " + ampm + "\b")
			Matches = reExecute(str, "\b" + hh + " " + ampm + "\b")
			WITH Matches.Item(0)
				serial = VAL(.SubMatches(0) MOD 12) + IIF(reTest(.SubMatches(1), "AM|am"), 0, 12)
				serial = serial / 24
			ENDWITH
		CASE reTest(str, "\b" + pattern + ":" + pattern + ":" + pattern + "\b")
			Matches = reExecute(str, "\b" + pattern + ":" + pattern + ":" + pattern + "\b")
			WITH Matches.Item(0)
				serial = VAL(.SubMatches(0)) / 24 + VAL(.SubMatches(1)) / 1440 + VAL(.SubMatches(2)) / 86400
			ENDWITH
		CASE reTest(str, "\b" + pattern + ":" + pattern + "\b")
			Matches = reExecute(str, "\b" + pattern + ":" + pattern + "\b")
			WITH Matches.Item(0)
				serial = VAL(.SubMatches(0)) / 24 + VAL(.SubMatches(1)) / 1440
			ENDWITH
		CASE reTest(str, "\b" + pattern + "時" + pattern + "分" + pattern + "秒")
			Matches = reExecute(str, "\b" + pattern + "時" + pattern + "分" + pattern + "秒")
			WITH Matches.Item(0)
				serial = VAL(.SubMatches(0)) / 24 + VAL(.SubMatches(1)) / 1440 + VAL(.SubMatches(2)) / 86400
			ENDWITH
		CASE reTest(str, "\b" + pattern + "時" + pattern + "分")
			Matches = reExecute(str, "\b" + pattern + "時" + pattern + "分")
			WITH Matches.Item(0)
				serial = VAL(.SubMatches(0)) / 24 + VAL(.SubMatches(1)) / 1440
			ENDWITH
		DEFAULT
			serial = ERR_VALUE
	SELEND
	RESULT = serial - INT(serial)
FEND

//////////////////////////////////////////////////
// 【引数】
//   arrayname : 上限値を求める配列の名前 
//   dimension : 返す次元を示す整数 
// 【戻り値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(arrayname[], dimension = 1)
	RESULT = EVAL("RESIZE(arrayname" + strRepeat("[0]", dimension - 1) + ")")
FEND
HTML
<html>
	<head>
		<style>
			dt{font-weight: bold;}
			dd{margin: 0 0 1em 0;}
		</style>
	</head>
	<body>
		<form method="get">
			<dl>
				<dt>名前</dt>
				<dd>
					<input type="text" name="name" />
				</dd>
				<dt>性別</dt>
				<dd>
					<input type="radio" name="sex" value="man" />男性
					<input type="radio" name="sex" value="woman" />女性
				</dd>
				<dt>年齢</dt>
				<dd>
					<select name="age">
						<option value="1">20歳未満</option>
						<option value="2">20代</option>
						<option value="3">30代</option>
						<option value="4">40代</option>
						<option value="5">50代</option>
						<option value="6">60代</option>
						<option value="7">70歳以上</option>
					</select>
				</dd>
				<dt>都道府県</dt>
				<dd>
					<select name="pref">
						<option value="1">北海道</option>
						<option value="2">東北</option>
						<option value="3">関東</option>
						<option value="4">中部</option>
						<option value="5">近畿</option>
						<option value="6">中国</option>
						<option value="7">四国</option>
						<option value="8">九州</option>
					</select>
				</dd>
			</dl>
			<input type="submit" name="ok" value="送信" />
			<input type="submit" name="cancel" value="キャンセル" />
		</form>
	</body>
</html>
.png

関連記事

GETFORMDATA関数 (スクリプト関数)
SETFORMDATA関数 (スクリプト関数)
STOPFORM関数 (スクリプト関数)
STOPFORM関数は、UWSCのプログラム再生時に出るSTOPボタンの表示/非表示を制御する関数です。