[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/03/20(Tue) 00:13
投稿者名:Wa
Eメール:
URL :
タイトル:
和暦の入力チェック
昭和を指定した場合、年に対し1〜64以外は入力不可など
年号に対し入力制限を行いたく考えています。
昭和の場合は、1〜64以外はNGなどそれぞれの年号に対し
チェックを行うほかに何か良い方法はないでしょうか?
皆さんはどのようにしていますか?
教えてください。

投稿時間:2007/03/20(Tue) 09:13
投稿者名:Blue
Eメール:
URL :
タイトル:
Re: 和暦の入力チェック
文字列を組み立ててからチェックするとか。

たとえば 昭和64年1月7日 ってな文字列を組み立ててから
IsDate関数をかますとTrueが帰ってきます。

ただし、例に挙げたとおり、和暦チェックには月日まで必要です。
とりあえず年号だけチェックしたいなら1月1日でチェックすればよさそう。


Sub test()
    Debug.Print "明治45年 "; IsValidateNengo("明治", 45)
    Debug.Print "明治46年 "; IsValidateNengo("明治", 46)
    Debug.Print "大正15年 "; IsValidateNengo("大正", 15)
    Debug.Print "大正16年 "; IsValidateNengo("大正", 16)
    Debug.Print "昭和64年 "; IsValidateNengo("昭和", 64)
    Debug.Print "昭和65年 "; IsValidateNengo("昭和", 65)
End Sub

Private Function IsValidateNengo(ByVal nengo As String, ByVal nen As Integer) As Boolean
    IsValidateNengo = IsDate(nengo & CStr(nen) & "年1月1日")
End Function

投稿時間:2007/03/20(Tue) 09:49
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^2: 和暦の入力チェック
この場合の IsDate 関数 は厳密に言えば間違っているような気がするのは
私だけでしょうかね。
日付までチェックする必要がないのならいいのですが。
関数を自作するのも一手かな?

Private Sub Command1_Click()
   Debug.Print IsDate("昭和64年1月15日")
   Debug.Print IsDate("平成1年1月1日")
   Debug.Print IsDate("平成1年2月29日")

   Dim Myggg As String
   Myggg = Left$(Format$("1989/1/7", "gggee年mm月dd日"), 2)
   Debug.Print Myggg
   Myggg = Left$(Format$("1989/1/8", "gggee年mm月dd日"), 2)
   Debug.Print Myggg
End Sub

投稿時間:2007/03/20(Tue) 10:23
投稿者名:Blue
Eメール:
URL :
タイトル:
Re^3: 和暦の入力チェック
>この場合の IsDate 関数 は厳密に言えば間違っているような気がするのは
>私だけでしょうかね。
間違っていましたね。。。orz

何を勘違いして IsDate("昭和64年1月8日") を Falseと思ってしまったんだろ。

投稿時間:2007/03/20(Tue) 11:02
投稿者名:Blue
Eメール:
URL :
タイトル:
Re^4: 和暦の入力チェック
一応、

Private Sub Command1_Click()
    Debug.Print IsValidateNengo("明治1年9月8日")   ' ┬
    Debug.Print IsValidateNengo("明治1年10月22日") ' │旧暦のためずれているらしい
    Debug.Print IsValidateNengo("明治1年10月23日") ' ┴
    Debug.Print IsValidateNengo("明治45年7月29日")
    Debug.Print IsValidateNengo("明治45年7月30日")

    Debug.Print IsValidateNengo("大正1年7月29日")
    Debug.Print IsValidateNengo("大正1年7月30日")
    Debug.Print IsValidateNengo("大正15年12月24日")
    Debug.Print IsValidateNengo("大正15年12月25日")

    Debug.Print IsValidateNengo("昭和1年12月24日")
    Debug.Print IsValidateNengo("昭和1年12月25日")
    Debug.Print IsValidateNengo("昭和64年1月7日")
    Debug.Print IsValidateNengo("昭和64年1月8日")
    
    Debug.Print IsValidateNengo("平成1年1月7日")
    Debug.Print IsValidateNengo("平成1年1月8日")
End Sub

Private Function IsValidateNengo(ByVal strDate As String) As Boolean
    If IsDate(strDate) Then
        IsValidateNengo = Format$(CDate(strDate), "ggge年m月d日") = strDate
    End If
End Function

てな感じで。
また
http://www.kumamotokokufu-h.ed.jp/kumamoto/bungaku/wa_seireki.html
を参考にしています。
そこに"大正・昭和の「改元の詔書」"について書かれていますが、
>IsValidateNengo("明治45年7月30日")
>IsValidateNengo("大正15年12月25日")
はTrueを返すようにしないとだめかも。

それと、明治の最初はよくわかりません。

投稿時間:2007/03/20(Tue) 13:32
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^5: 和暦の入力チェック
> それと、明治の最初はよくわかりません。
以前調べた時の覚書によると、「明治」という和暦は下記のような仕様だそうです。

・グレゴリオ暦でいうと、1868年1月25日〜1912年7月30日に相当する期間である。
・和暦表現上は、「明治元年1月1日」〜「明治45年7月30日」とされる。
・明治6年の旧暦(天保壬寅元暦)から新暦(グレゴリオ暦)への変更ゆえ、
 新暦「明治6年1月1日」(グレゴリオ暦:1873年1月1日)の『前日』は、
 旧暦「明治5年12月2日」(グレゴリオ暦:1872年12月31日)となっているため、
 明治5年12月3日〜明治5年12月31日という日付は、実際には存在しない。
・ただし、新暦採用後も旧暦で記録された資料や、あるいは、それ以前の日付を
 新暦相当の日付に換算して表現される場合もあるので、その場合に限っては、
 明治5年12月3日などの日付表現が限定的に使用される可能性がある。
・最大日付である「明治45年7月30日」は、次の元号の最小日付である
 「大正元年7月30日」と被る日付となる。
・明治の改元日は慶應4年9月8日(グレゴリオ暦:1868年10月23日)であるが、
 同年1月1日まで遡って適用されたため、この期間は、前の元号<慶應>と
 被る日付となる。

……という、何ともややこしい仕様になっているようでしたよ。(^_^;

結局、旧暦・新暦の違いや、遡って適用された期間などがあるので、処理系によって、
「明治の開始日」というものが微妙に異なるので、結構ややこしい。
明治初期の日付を扱う必要が無いのであれば、あえて取り組む必要は無いかも知れません。

--------
改元日を基準にして設定された処理系では、開始日はグレゴリオ暦1868年10月23日とされます。
これは和暦表現で、「明治元年9月8日(旧暦)」「明治元年10月23日(新暦)」に相当します。
--------
法的な適用日を基準にするのであれば、開始日はグレゴリオ暦1868年1月25日です。
和暦表現でいうと、「明治元年1月1日(旧暦)」「明治元年1月25日(新暦)」に相当します。
ただしこの場合は、新暦表現されることは稀で、グレゴリオ暦または旧暦表現が一般的です。
--------
旧暦と新暦を区別して扱う事ができない処理系においては、日本でグレゴリオ暦が
採用された日付を取って、グレゴリオ暦1873年1月1日を開始日とする場合もあります。
和暦表現上は、新暦の「明治6年1月1日」です。
--------
月日を無視し、年だけで判断する処理系においては、グレゴリオ暦1868年1月1日を
開始日とする処理系も稀に見られます。
この場合、開始日の和暦表現は無意味ですが、あえて表現すると旧暦「慶応3年12月7日」です。
--------

ちなみに VB6 には、旧暦換算用の機能が用意されていないため、Format関数 での処理結果は、
常に新暦(グレゴリオ暦)の日付として出力されることになります。

# VB2005 であれば、旧暦処理クラス(JapaneseLunisolarCalendar)や
# 和暦処理クラス(JapaneseCalendar)が使えるのですけれどね。