【 質問箱 No.102 回答 】 ⇒⇒⇒⇒ 質問箱 No.102(1999年 9月号)の趣旨 質問者: 西 村 重 幸 <土日祝日の日数を知りたい> 【プログラム】        回答者 :  入 川 精 二 【 Ver.02.01 19991018 By S. Irikawa 】 /* TPS/Win対応 */ /****************指定年または指定期間のカレンダーを作る**************/ /* V1 指定年(YYYY NUM$(X1)) */ /* V2 カレンダー開始日 */ /* V3 カレンダーの最終日 */ /* V11 年月日(YYY0101) */ /* V20 月別表のタイトルに使う年月(YYYY年MM月) */ /* V30 ACCEPT文の受け皿(YorN) */ /* V37 ACCEPT文のガイドメッセージ */ /* V40 西暦年指定か期間指定かの区分 */ /* X1 指定年(YYYY) */ /* X2 表の行番号 */ /* X30 表分割位置の行番号 */ /* Z2 カレンダーの開始日の日付連番 */ /* Z3 カレンダーの最終日の日付連番 */ /* Z20 開始日の1年後の同日 */ /*********************************************************/ $区分: ACCEPT "西暦年指定 [ 1 ], 期間指定 [ 2 ] ",V40; IF ERR(0)=55 THEN GOTO $END; IF V40="1" THEN GOTO $年; IF V40="2" THEN GOTO $期間1; GOTO $区分; $年: ACCEPT "何年のカレンダー ? (西暦:YYYY)",V1; IF ERR(0)=55 THEN GOTO$END; IF LEN(V1)<>4 THEN GOTO $年; LET V11=V1+"0101"; LET Z1=DATEVAL(V11); IF Z1=0 THEN GOTO $年; IF NAME(3,"カレンダー"+V1)=0 THEN GOTO $年表; BIND;D;カレンダー%V1;Y; GOTO $年表; $期間1: ACCEPT "カレンダーの開始日は ? (YYYYMMDD)",V2; IF ERR(0)=55 THEN GOTO $END; IF LEN(V2)<>8 THEN GOTO $期間1; LET Z2=DATEVAL(V2); IF Z2=0 THEN GOTO $ERR1; $期間2: ACCEPT "カレンダーの最終日は ? [期間は1年以内] (YYYYMMDD)",V3; IF ERR(0)=55 THEN GOTO $END; IF LEN(V3)<>8 THEN GOTO $期間2; IF RIGHT$(V3,7)<>"99" THEN GOTO $期間3; $末日: LET V3=NUM$(MDATE(VAL(LEFT$(V3,6)+"01"),0,99)); $期間3: LET Z3=DATEVAL(V3); IF Z3=0 THEN GOTO $ERR2; IF Z3 <=Z2 THEN GOTO $ERR3; LET Z20=MDATE(VAL(V2),12,IVAL(RIGHT$(V2,7))); IF VAL(V3) >=Z20 THEN GOTO $ERR4; $確認: ACCEPT "指定期間 : "+V2+" から "+V3+" まで OKですか? [Y/N] ",V30; IF ERR(0)=55 THEN GOTO $END; IF V30="Y"|"y"|"Y"|"y" THEN GOTO $年表; IF V30="N"|"n"|"N"|"n"THEN GOTO $期間1; GOTO $確認; $年表: SET/N/C;M;M;3; ;4;1;;Y;S;M;1;36;3;0;;Y;ESC; O;カレンダー%V1;8/3;DATE;曜;;ESC; IR;S;4;366; ATR;N;D;@DATE; GOTO $#%V40; $#1: NUM;M;C;@DATE;H;%V11;1; IF RIGHT$([T,@DATE ],5)="1231" THEN GOTO $曜日; DR;T;Y; /* 平年は1行削除 */ GOTO $曜日: $#2: NUM;M;C;@DATE;H;%V2;1; CS;M;@DATE >=%V2 & @DATE <=%V3;;A;; $曜日: CAL;RFO;@DATE MOD7+1=C2; FOR X2=H TO T; /* 曜日を書き込む */ LET [X2,@曜 ]=KMID$("日月火水木金土",IVAL([X2,@曜 ]),1); NEXT; NF;S;@DATE;4/2/2; DC;1;Y; W;2;;月;日;ESC; CF;1,2;4; ATR;R;1,2; CJ/C;N;N;A;1,2;A;Z;A;1,2;ESC; P;カレンダー%V1; BELL; $CHK: IF V40="2" THEN GOTO $END; LET V37="はい[Y],いいえ[N] [RETURN]=Y "; ACCEPT"月別表(12頁)を作りますか? "+V37,V30; IF ERR(0)=55 THEN LETV30="N"; IF V30="" THEN LET V30="Y"; IF INSTR(1,"YyYy",V30)>0 THEN GOTO $月別表; $一括表: INFO;@;C;@日 ;DRL;R;@1 ;DR;H;Y; FOR X30=185 T0 195; IF [X30,@月 ]="7" THEN GOTO $SEPA; NEXT; GOTO $ERR6; $SEPA: CPA;M;Y; DR;%(X30-1),T;Y; P;カレンダー%V1; S; DR;H,%(X30-2);Y; P;カレンダ%V1/N, FOR X30=1 T0 2; G;カレンダー%V1/%X30; CT;%(FORM$(V1,5))年カレンダー[%X30]; INFO;S;60; IC;S;N;38;行事; ATR;P;L;@行事; DRL;C;A; P;カレンダー%V1/%X30; NEXT; GOTO $END; $月別表: IF FREE(3,CABINET$)<12 THEN GOTO $ERR5; GROUP;カレンダー%V1;K;@月;;月別カレンダー%V1/D; ARP/C; FOR X30= 1 T0 12; LET V20=FORM$(V1,5)+"年"+FORM$(NUM$(X30),5)+"月"; ;N;%X30;%V20; NEXT;ESC; INFO/P;月別カレンダー%Vi;月別カレンダー%V1;S;180;Y; CA;月別カレンダー%V1;;2/3;;月別カレンダー%V1; $END: SET/N;S;M;1;180;;Y; STOP; $ERR1: BELL; MESSAGE"あり得ない日付を指定しました"; GOTO $期間1; $ERR2: BELL; MESSAGE"あり得ない日付を指定しました"; GOTO $期間2; $ERR3: BELL; MESSAGE"最終日は開始日より後の日付を指定して下さい"; GOTO $期間1; $ERR4: BELL; MESSAGE"期間が1年を超えています。1年以内にして下さい"; GOTO $期間1; $ERR5: BELL; MESSAGE"キャビネット内の頁数が不足です処理を中止します"; GOTO $END; $ERR6: BELL; MESSAGE"7月1日の行がない!!"; GOTO $END;