はじめに
官公庁の統計で使われている「e-Stat 時間軸コード」を見やすく変換する Excel 関数(ユーザー定義関数)です。
こんなもの、探せばありそうな気がしたのですが無かったので VBA で作りました。
関数の使い方イメージ
セルに数式で =E_STAT_TO_STRING(A1)
などとすると、以下のイメージのように文字列変換して表示します。
範囲外のコード値を使用すると「#VALUE!
」エラーに、数字以外の文字が含まれると「#NUM!
」エラーを返します。
ソースコード
クラスモジュールと標準モジュールが必要です。
ユーザー定義関数の使い方自体が分からない方は、本記事末尾の「参考」にあるリンクを先にご参照ください。
クラスモジュール「EStatTimeSpanCode」
クラスモジュールを作成し、名前を「EStatTimeSpanCode」として保存してください。
Option Explicit ''' e-Stat 時間軸コードをあらわすクラス。 ' "年" の表現。4桁。 Public YearEx As String ' "種別" の表現。0: 年、1: 年度。1桁。 Public TypeEx As String ' "上期/下期" の表現。0: 指定なし、1: 上期、2: 下期。1桁。 ' 上期:"種別"が「年」の場合、1〜6月期を示す。「年度」の場合、4〜9月期を示す。 ' 下期:"種別"が「年」の場合、7〜12月期を示す。「年度」の場合、10〜翌3月期を示す。 Public HalfEx As String ' "期" の表現。4桁。 ' "0000":年または年度全体を示す。 ' "0103":1〜3月期を示す。 ' "0101":1月を示す。 Public PeriodEx1 As String Public PeriodEx2 As String ' 初期化時に発生する可能性のあるエラーコード。 Public ErrorCode As Variant ''' e-Stat 時間軸コードから、オブジェクトを初期化する。 Public Sub Init(ByVal src As String) ErrorCode = 0 ' 桁数をチェックする If Len(src) <> 10 Then ErrorCode = CVErr(xlErrValue) Exit Sub End If ' 数値かどうかチェックする If Not IsNumeric(src) Then ErrorCode = CVErr(xlErrNum) Exit Sub End If Dim tmp As Integer ' 年 Me.YearEx = Mid(src, 1, 4) ' 種別 Me.TypeEx = Mid(src, 5, 1) If Me.TypeEx <> "0" And Me.TypeEx <> "1" Then ErrorCode = CVErr(xlErrValue) Exit Sub End If ' 上期/下期 Me.HalfEx = Mid(src, 6, 1) tmp = Val(Me.HalfEx) If tmp < 0 Or tmp > 2 Then ErrorCode = CVErr(xlErrValue) Exit Sub End If ' 期(1) Me.PeriodEx1 = Mid(src, 7, 2) tmp = Val(Me.PeriodEx1) If tmp < 0 Or tmp > 12 Then ErrorCode = CVErr(xlErrValue) Exit Sub End If ' 期(2) Me.PeriodEx2 = Mid(src, 9, 2) tmp = Val(Me.PeriodEx2) If tmp < 0 Or tmp > 12 Then ErrorCode = CVErr(xlErrValue) Exit Sub End If End Sub ''' "年" の表現を返す。 Public Function GetYear() As String GetYear = Me.YearEx End Function ''' "種別" の文字列表現を返す。 Public Function GetType() As String If Me.TypeEx = "0" Then GetType = "年" Else GetType = "年度" End If End Function ''' "上期/下期" の文字列表現を返す。 Public Function GetHalf() As String If Me.HalfEx = "0" Then GetHalf = "" ElseIf Me.HalfEx = "1" Then If Me.TypeEx = "0" Then GetHalf = "1〜6月期" Else GetHalf = "4〜9月期" End If ElseIf Me.HalfEx = "2" Then If Me.TypeEx = "0" Then GetHalf = "7〜12月期" Else GetHalf = "10〜3月期" End If Else GetHalf = "" End If End Function ''' "期" の文字列表現を返す。 Public Function GetSeason() As String If Me.PeriodEx1 = "00" Then GetSeason = "" ElseIf Me.PeriodEx1 = Me.PeriodEx2 Then GetSeason = Val(Me.PeriodEx1) & "月" Else GetSeason = Val(Me.PeriodEx1) & "〜" & Val(Me.PeriodEx2) & "月期" End If End Function ''' 文字列表現を返す。 Public Function ToString() As String ToString = Me.GetYear() & Me.GetType() & Me.GetHalf() & Me.GetSeason() End Function
標準モジュール
そして実際に呼び出す関数「E_STAT_TO_STRING()」を、標準モジュールに作成してください。コードは以下です。
Option Explicit ''' e-Stat コードから、文字列に変換します。 ''' 例:"2006000101" -> "2006年1月" Public Function E_STAT_TO_STRING(ByVal e_statCode As String) As Variant Dim o As EStatTimeSpanCode Set o = New EStatTimeSpanCode Dim errCode As Variant o.Init e_statCode If IsError(o.ErrorCode) Then E_STAT_TO_STRING = o.ErrorCode Exit Function Else E_STAT_TO_STRING = o.ToString() End If End Function