日付の計算は?No.02246
じょ〜 さん 01/05/28 16:39
 
秀丸マクロ初心者です。
一応、他の言語、VBAとかPlayRite、delphiの経験は多少あります。

秀丸で、日付の計算をするにはどうすればよいのでしょうか。
具体的には、今日を基準に2週間前までの日付を配列に格納する、という処理をした
いのです。

[ ]
RE:02246 日付の計算は?No.02248
ENCODINGSHIFTJIS さん 01/05/28 17:55
 
>一応、他の言語、VBAとかPlayRite、delphiの経験は多少あります。
汎用データ処理のプログラム言語と比較されると、つらい、エディター・マクロは
現在値は取得できても、計算までサービスしてないですから。
>秀丸で、日付の計算をするにはどうすればよいのでしょうか。
>具体的には、今日を基準に2週間前までの日付を配列に格納する、という処理をし
>たいのです。
日付←→通算日 の計算をすることになる。「普通の方法」
http://www.at-grp.com/ugo/calendar/nissu.html
など参考に、カレンダー、暦、 zellar などでWeb検索すると大量にあります。

別の方法では、テキストでカレンダーを作っておき、searchdown date;
で頭出しをして、 beginsel; up 14;copy; とか
1行1日を仮定しています。変則な日の追加情報もカレンダーなら記入しておける

[ ]
RE:02246 日付の計算は?No.02249
ひろ さん 01/05/28 17:56
 
 じょ〜さん今日は、ひろです。
> 具体的には、今日を基準に2週間前までの日付を配列に格納する、という処理をした
 date, year, month, day というコマンドが有るので、val 関数で一旦数
値へ変換後、while 文で (必要なら str 関数で文字列に再変換後) 配列に
格納すればよいと思います。年月ごとで日数に違いがあることに注意すれば、
それ程難しく有りません。

 P.S 不具合は報告済みですが、ひょっとすると現在の date は、まだサマー
タイムに対応していないかもしれません。

[ ]
RE:02246 日付の計算は?No.02265
TAKA さん 01/05/30 20:15
 
TAKA です。

>秀丸で、日付の計算をするにはどうすればよいのでしょうか。
>具体的には、今日を基準に2週間前までの日付を配列に格納する、という処理をした
>いのです。

その後、解決したでしょうか?
まだ解決していないようでしたら、以下のマクロを使ってみて下さ
い。

マクロを実行した日より2週間前までの日付を配列に格納します。
格納した配列をもとに、マクロを実行した秀丸に、14日分の日付
を挿入します。
「GetDateOffset」の第2引数にオフセットを指定しますが、オフ
セット数は少なければ少ないほど速いので、以下のように「-1」を
指定出来るようにした方が良いです。

多少プログラムの経験があるとのことですので、他は説明不要だと
思いますが、何かありました、また質問して下さい。

// サンプルマクロ(ここから)
    $DateWk = year + "/" + month + "/" + day + "(" + dayofweek + ")";
    #I = 0;
    while( #I < 14 )
    {
        call GetDateOffset $DateWk, -1;
        $DateWk = $$return;
        $DateTbl[#I] = $DateWk;
        #I = #I + 1;
    }

    #I = 0;
    while( #I < 14 )
    {
        insert $DateTbl[#I] + "\n";
        #I = #I + 1;
    }

    endmacro;

GetDateOffset:
    ##DayTbl[0] = 31;   //  1月
    ##DayTbl[1] = 28;   //  2月(閏年でない場合)
    ##DayTbl[2] = 31;   //  3月
    ##DayTbl[3] = 30;   //  4月
    ##DayTbl[4] = 31;   //  5月
    ##DayTbl[5] = 30;   //  6月
    ##DayTbl[6] = 31;   //  7月
    ##DayTbl[7] = 31;   //  8月
    ##DayTbl[8] = 30;   //  9月
    ##DayTbl[9] = 31;   // 10月
    ##DayTbl[10] = 30;  // 11月
    ##DayTbl[11] = 31;  // 12月
    $$WeekTbl = "日月火水木金土";
    $$ZeroTbl = "0000";

    ##Year  = val( leftstr( $$1, 4 ) );         // 年
    ##Month = val( midstr( $$1, 5, 2 ) );       // 月
    ##Day   = val( midstr( $$1, 8, 2 ) );       // 日
    ##Week  = strstr( $$WeekTbl, midstr( $$1,11, 2 ) ) / 2;     // 曜

    ##YearWk    = ##Year;
    ##MonthWk   = ##Month;
    ##DayWk     = ##Day;
    ##WeekWk    = ##Week;

    if( ##2 >= 0 )
    { // 加算
        ##I = 0;
        while( ##I < ##2 )
        {
            if( ( ##MonthWk == 2 ) || ( ##DayWk == 28 ) )
            { // 2月28日
                call UruuChk ##YearWk;
                if( ##return )  ##DayTbl[1] = 29;   // 閏年
                else            ##DayTbl[1] = 28;   // 閏年でない
            }
            if( ##DayWk >= ##DayTbl[##MonthWk-1] )
            { // 月の最終日
                ##DayWk = 1;
                if( ##MonthWk >= 12 )
                { // 年の最終月
                    ##MonthWk = 1;
                    ##YearWk = ##YearWk + 1;
                }
                else
                {
                    ##MonthWk = ##MonthWk + 1;
                }
            }
            else
            {
                ##DayWk = ##DayWk + 1;
            }
            ##I = ##I + 1;
        }
        ##WeekWk = ( ##WeekWk + ##2 ) % 7;
    }
    else
    { // 減算
        ##I = 0;
        while( ##I > ##2 )
        {
            if( ( ##MonthWk == 3 ) || ( ##DayWk == 1 ) )
            { // 3月1日
                call UruuChk ##YearWk;
                if( ##return )  ##DayTbl[1] = 29;   // 閏年
                else            ##DayTbl[1] = 28;   // 閏年でない
            }
            if( ##DayWk <= 1 )
            { // 月の最初日
                if( ##MonthWk <= 1 )
                { // 年の最初月
                    ##MonthWk = 12;
                    ##YearWk = ##YearWk - 1;
                }
                else
                {
                    ##MonthWk = ##MonthWk - 1;
                }
                ##DayWk = ##DayTbl[##MonthWk-1];
            }
            else
            {
                ##DayWk = ##DayWk - 1;
            }
            ##I = ##I - 1;
        }
        ##WeekWk = ( ( ( ( ##WeekWk + ##2 ) % 7 ) + 7 ) % 7 );
    }

    // 年
    $$Dayte = "";
    $$Wk = str( ##YearWk );
    $$Dayte = $$Dayte + leftstr( $$ZeroTbl, 4 - strlen( $$Wk ) ) + $$Wk;

    // 月
    $$Wk = str( ##MonthWk );
    $$Dayte = $$Dayte + "/" + leftstr( $$ZeroTbl, 2 - strlen( $$Wk ) ) + $$Wk;

    // 日
    $$Wk = str( ##DayWk );
    $$Dayte = $$Dayte + "/" + leftstr( $$ZeroTbl, 2 - strlen( $$Wk ) ) + $$Wk;

    // 曜
    $$Dayte = $$Dayte + "(" + midstr( $$WeekTbl, ##WeekWk * 2, 2 ) + ")";

    return $$Dayte;

UruuChk:
    ##RC = false;

    if( ##1 % 4 == 0 )
    { // 4で割り切れる
        if( ##1 % 100 == 0 )
        { // 100で割り切れる
            if( ##1 % 400 == 0 )
            { // 400で割り切れる(閏年)
                ##RC = true;
            }
        }
        else
        { // 閏年
            ##RC = true;
        }
    }

    return ##RC;
// サンプルマクロ(ここまで)

[ ]
RE:02248 日付の計算は?No.02289
じょ〜 さん 01/06/03 23:53
 
>日付←→通算日 の計算をすることになる。「普通の方法」
>http://www.at-grp.com/ugo/calendar/nissu.html
>など参考に、カレンダー、暦、 zellar などでWeb検索すると大量にあります。

コメントありがとうございました。お礼が遅くなりまして、申し訳ありません。

やはり無理だったのですね。別の方法を模索いたします。

それにしても、すごいホームページがあるんですね〜。驚きました。

[ ]
RE:02249 日付の計算は?No.02290
じょ〜 さん 01/06/03 23:55
 
> じょ〜さん今日は、ひろです。
>> 具体的には、今日を基準に2週間前までの日付を配列に格納する、という処理をした
> date, year, month, day というコマンドが有るので、val 関数で一旦数
>値へ変換後、while 文で (必要なら str 関数で文字列に再変換後) 配列に
>格納すればよいと思います。年月ごとで日数に違いがあることに注意すれば、

コメントありがとうございました。お礼が遅くなりまして、申し訳ありません。

この方法を試してみようと思っていたのですが、TAKAさんからサンプルソースがupさ
れましたので、そちらをまず試してみようと思います。

また、わからないことがありましたら、教えてください。

[ ]
RE:02265 日付の計算は?No.02291
じょ〜 さん 01/06/03 23:58
 
>TAKA です。

>その後、解決したでしょうか?
>まだ解決していないようでしたら、以下のマクロを使ってみて下さ
>い。
>

コメントありがとうございました。お礼が遅くなりまして、申し訳ありません。

早速試させていただきます。

>多少プログラムの経験があるとのことですので、他は説明不要だと
>思いますが、何かありました、また質問して下さい。

ちょっと他の言語とは勝手が違うようですので、また不明な点は教えてください。重
ね重ね、ありがとうございました。

[ ]
RE:02289 日付の計算は?No.02913
encodingshiftjis さん 02/01/02 23:41
 
最終解決ではないですが(メッセージボックスを消す方法が分からない)
正月のネタとして、日本語プログラミングをやってみました。

// testHimawari.mac
runsync2 "D:\\C\\hima100\\himawari.exe D:\\C\\hima100\\T1.hmw";
gofileend; paste;

上の秀丸マクロで起動して
−−−−−−−−−−−−−−−−−− T1.hmw  ひまわりのソース
'今日を基準に2週間前までの日付を配列に格納する
日付配列#0=今日
14回(日付配列#回数=日付加算(今日,"-0/0/{回数}") )
それは 日付配列
クリップボードへ 保存
--------------------------------------
クリップボード経由で返り値を渡しています。
YYYY/MM/DD の複数行が返ります。

■日本語プログラム言語「ひまわり」
http://www.text2music.com/tools/himawari/index.htm

[ ]
RE:02913 日付の計算は?No.02915
encodingshiftjis さん 02/01/03 00:22
 
母艦の オブジェクト破壊。

を最初に実行するとメッセージボックスを消せました
最小化もできるようです。

    「ひまわり」の感想
まだ構文解析はタフではないので、あまり仕様ギリギリな
書き方をしないほうがよいです。
助詞を使った日本語的な書き方と 命令(引数並び)の
両方の書き方ができる。
処理機能はPerl、WSHや秀丸マクロと重複する
(テキスト処理だから似ているため)
不足部分を利用するのがベターです。

[ ]