|
TAKA です。
>書いていただいたテストマクロの内容が難しくて、
>これからじっくり勉強させていただきます。
私のマクロは、コメント(「//」がついている部分)がありますの
で、コメントを読みながら見れば分かると思います。
「その他→ファイルタイプ別の設定→表示」で「コメント/文字定
数のカラー表示」をON、「モード」を「秀丸マクロ」にし、「そ
の他→ファイルタイプ別の設定→カラー」で「コメント」に適当な
色を設定するとコメントが見やすいです。
>サブルーチンの使い方が、ちんぷんかんぷんなので、
>先が遠そうです。
http://win.blue.co.jp/~jr-kun/hidemaru_qa/3_sub.html
が参考になります。
最後まで読めば、嫌でも分かります。
>半角で入力されていること、
ピリオドが半角であることと、年月日のが半角数値であることでチ
ェックしています。
>月、日が二桁で入力されていること、
これは、対応していませんが、簡単です。(後述)
>ピリオドの数の3点です。
これは、年月日分割のところで、半角ピリオドが2つあることをチ
ェックしています。
>が、月日が二桁でなかった場合は
>マクロの側で、0を入れて補完してあげてもいいわけですよね。
「// 範囲チェック」というコメントの下に以下のソースコードを
追加するだけです。
// 追加(ここから)
// 範囲チェック
// 年は特にチェックしない。
// 日付の正当性(閏年等)もチェックしない。
// 月と日は2桁までとする。1桁の場合は0をつける
#I = 1;
while( #I < 3 )
{
#Len = strlen( $Tbl[#I] );
if( ( #Len != 1 ) && ( #Len != 2 ) )
{ // 1桁か2桁でない
if( #I == 1 ) message "月は1桁か2桁です。";
else message "日は1桁か2桁です。";
goto L1000;
}
else if( #Len == 1 )
{ // 1桁
$Tbl[#I] = "0" + $Tbl[#I]; // 頭に0をつける
}
#I = #I + 1;
}
// 追加(ここまで)
最初の発言をもう一度見てみると、日付のチェックの部分自体をモ
ジュールにしたいようですね。
というわけで、上記も含めて整理すると、以下のようになります。
// テストマクロ(ここから)
$Def = year + "." + month + "." + day;
L1000:
// 年月日入力
$Str = input( "年月日", $Def );
if( !result )
{ // キャンセル
goto LEND;
}
$Def = $Str; // 次回入力を差し替える
// 年月日チェック
// call DayChek $Str, 0; // エラーメッセージ表示なし
call DayChek $Str, 1; // エラーメッセージ表示あり
$Str = $$return;
if( $Str == "" )
{ // エラー
goto L1000;
}
// 年月日の表示
message $Str;
LEND:
endmacro;
// 第1引数に年月日
// 第2引数にメッセージフラグ 0:表示なし 1:表示あり
// リターン値に正常な日付。不正な場合はヌル
DayChek:
$$Str = "";
$$DayWk = $$1;
// 年月日分割
##I = 0;
while( 1 )
{
##Pos = strstr( $$DayWk, "." );
if( ##Pos == -1 ) break;
if( ##I >= 2 )
{
if( ##2 == 1 ) message ".の数が多すぎます。";
goto LDayChekEND;
}
$$Wk = leftstr( $$DayWk, ##Pos );
$$DayWk = rightstr( $$DayWk, strlen( $$DayWk ) - ##Pos - 1 );
$$Tbl[##I] = $$Wk;
##I = ##I + 1;
}
if( ##I != 2 )
{ // 入力エラー
if( ##2 == 1 ) message ".の数が少なすぎます。";
goto LDayChekEND;
}
$$Tbl[##I] = $$DayWk;
// 数値チェック
##I = 0;
while( ##I < 3 )
{
call NumCheck $$Tbl[##I];
if( ##return != 0 )
{ // 入力エラー
if( ##2 == 1 ) message "年月日は半角数値で入力して下さい";
goto LDayChekEND;
}
##I = ##I + 1;
}
// 範囲チェック
// 年は特にチェックしない。
// 日付の正当性(閏年等)もチェックしない。
// 月と日は2桁までとする。1桁の場合は0をつける
##I = 1;
while( ##I < 3 )
{
##Len = strlen( $$Tbl[##I] );
if( ( ##Len != 1 ) && ( ##Len != 2 ) )
{ // 1桁か2桁でない
if( ##2 == 1 )
{
if( ##I == 1 ) message "月は1桁か2桁です。";
else message "日は1桁か2桁です。";
}
goto LDayChekEND;
}
else if( ##Len == 1 )
{ // 1桁
$$Tbl[##I] = "0" + $$Tbl[##I]; // 頭に0をつける
}
##I = ##I + 1;
}
$$Str = $$Tbl[0] + "年" + $$Tbl[1] + "月" + $$Tbl[2] + "日";
// $$Str = $$Tbl[0] + "." + $$Tbl[1] + "." + $$Tbl[2] + ".";
LDayChekEND:
return $$Str;
// 第1引数に文字列
// リターン値 0:半角数値 -1:半角数値以外
NumCheck:
##RC = -1;
##StrLen = strlen( $$1 );
##I = 0;
while( ##I < ##StrLen )
{
if( ( ascii( midstr( $$1, ##I, 2 ) ) & 0xff00 ) != 0 )
{ // 2バイト文字
goto LNumCheckEND;
}
else
{
$$Wk = midstr( $$1, ##I, 1 );
if( strstr( "0123456789", $$Wk ) == -1 )
{ // 数値以外
goto LNumCheckEND;
}
##I = ##I + 1;
}
}
##RC = 0;
LNumCheckEND:
return ##RC;
// テストマクロ(ここまで)
>ちょっと考えてみます。
#あっ、答えを全部書いてしまった。
#後は、日付の妥当性のチェックさえ入れればいいのかな。
|
|