サポンテ 勉強ノート

サポンテの勉強ノート・読書メモなどを晒します。

e-Stat 時間軸コードを、人間が見て分かりやすい表現に変換する Excel 関数【Excel/ユーザー定義関数/E_STAT_TO_STRING()】

はじめに

 官公庁の統計で使われている「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

参考