FC2ブログ

スポンサーサイト 


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/--

Category: スポンサー広告

TB: --  /  CM: --

top △

"mmdd" を Date 型に変換する関数 


どこだったか・・・ 最近の質問で見かけたんですけど

"mmdd" を Date 型に変換する関数を作ってみました。
"mmdd" だけではなく、
 "yymmdd" とか、"yymd" とか・・・・色々対応できるように

関数名は Str2Date で、戻り値は基本 Date 型(日付と解釈できない場合は Empty)
なので、戻り値の型は Variant としています。

引数は3つあって
第1引数(必須): "mmdd" 等の変換元文字列
第2引数(オプション):第1引数の先頭に付けて解釈する
第3引数(オプション):年、月、日を解釈する文字数

関数内部では、年、月、日を解釈する文字数を以下で定義していますが
  iA(0) = 0 ' 年用文字数
  iA(1) = 2
  iA(2) = 2
第3引数で指定されたもので上書き更新します。
第3引数が、3 であれば、(3, 2, 2)
第3引数が、Array(4, 2, 2) であれば、(4, 2, 2)
第3引数が、Array(4, 1) であれば、(4, 1, 2)
Array で指定する順は、年、月、日で・・・

第1引数で指定された文字列は、日、月、年 の順で、文字列右側から切り取っていきます。
年 部分先頭に第2引数を付加しますが、最終的に、年が生成されていなかったら今の年を・・・
これら切り取ったもので作った文字列が日付か??・・・
日付なら、Date 型を戻します。

以下の様な感じで利用します。
得られる日付記   述
2014/10/25 Str2Date("1025")
   年の指定が無いので今年の・・・
2014/10/25 Str2Date("251025")
   文字列に年部分はあるけど、解釈は (0, 2, 2) なので
   今年の・・・
2013/10/25 Str2Date("1025", "H25")
   元の文字列には年はないけど・・・
2013/10/25 Str2Date("1025", "2013")
   元の文字列には年はないけど・・・
2014/10/25 Str2Date("141025", , Array(2, 2, 2))
   年、月、日解釈を、各2文字づつで・・・
2014/10/25 Str2Date("141025", , 2)
   年部分を2文字としてね・・・
   月、日部分は、従来通り各2文字でね・・・
2014/10/25 Str2Date("261025", "H", 2)
   年部分を2文字として・・・・
   年の解釈先頭に "H" を付けてね・・・
1951/10/25 Str2Date("261025", "S", 2)
   年部分を2文字として・・・・
   年の解釈先頭に "S" を付けてね・・・
1893/10/25 Str2Date("261025", "M", 2)
   年部分を2文字として・・・・
   年の解釈先頭に "M" を付けてね・・・
2010/02/05 Str2Date("1025", , Array(2, 1, 1))
   年の解釈を2文字、月、日は1文字でね
1998/02/05 Str2Date("1025", "平成", Array(2, 1, 1))
   年の解釈を2文字、月、日は1文字でね
   そして、年の先頭に "平成" を付けてね・・・・
2014/10/25 Str2Date("H261025", , 3)
   年の解釈を3文字で、月、日は従来通り2文字でね
2014/01/25 Str2Date("H26125", , Array(3, 1))
   年の解釈を3文字、月を1文字、日は従来通り2文字でね

 
処理の概要は既に記述していて、それ以上の説明は不要と思うのですが・・・

標準モジュールに以下を記述しておきます。

Public Function Str2Date(sDate As String _
          , Optional sHead As String = "" _
          , Optional vChrLen As Variant = Empty) As Variant
  Dim sA(0 To 2) As String, iA(0 To 2) As Long
  Dim sS As String
  Dim i As Long, j As Long

  iA(0) = 0 ' 年用文字数
  iA(1) = 2
  iA(2) = 2

  If (Not IsEmpty(vChrLen)) Then
    If (IsArray(vChrLen)) Then
      j = LBound(vChrLen)
      For i = 0 To 2
        iA(i) = vChrLen(j)
        j = j + 1
        If (j > UBound(vChrLen)) Then Exit For
      Next
    Else
      iA(0) = vChrLen
    End If
  End If
  sS = sDate
  For i = 2 To 0 Step -1
    sA(i) = Right(sS, iA(i))
    sS = Left(sS, Len(sS) - iA(i))
  Next
  sA(0) = sHead & sA(0)
  If (Len(sA(0)) = 0) Then sA(0) = Year(Date)
  sS = Join(sA, "/")
  If (IsDate(sS)) Then Str2Date = CDate(sS)
End Function

 
※ 細かいエラーチェックとか入れていないので・・・
 例えば、年、月、日 の文字数指定時、負の値を指定したら・・・とか

なお、環境に合わせて、基本となる文字数を設定する
  iA(0) = 0 ' 年用文字数
  iA(1) = 2
  iA(2) = 2
部分を変更しておけば、省略できる部分が出来ると思います。

また、日付として解釈できるかは IsDate を利用し、CDate で変換しているので
詳細は IsDate / CDate のヘルプを見てください。

日付として解釈できなければ、戻り値は Empty ですが Null が良ければ、
処理先頭にでも、Str2Date = Null しておけば良いですね。


今回のサンプルファイルはありません。


※※ str2Date という名の関数があるようですが、それとは異なります。
適宜、関数名を変更してください。
関連記事

2014/09/21

Category: 関数を作ってみる

TB: --  /  CM: 0

top △

この記事に対するコメント

top △

コメントの投稿

Secret

top △


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。