国勢調査から男女別の5歳階級の人口推移を積み上げ横棒グラフに描く

 前回の記事では大正 9 年から平成 17 年までの日本人口総数の年齢階級推移を積み上げ縦棒グラフに描いた.今回は男女別に描く.

テーブルのソート順位に注意

 テーブルは前回同様であるが,年度を降順ソートするところが違う.まず年度を降順ソート,ついで生年を降順ソートである.

まずテーブルの年度を降順ソート
まずテーブルの年度を降順ソート
ついでテーブルの生年を降順ソート
ついでテーブルの生年を降順ソート

生年階級のオブジェクトテーマカラー

 5 歳階級を 5 系統ごと,つまり 25 年ごとに 1 系統のテーマカラーを割り当てる.詳細はEXCEL VBA から見たオブジェクトテーマカラーと RGB の変換を参照されたい.

コード

Option Explicit

Sub MaleFemaleChart()

Dim mySht1      As Worksheet
Dim mySht2      As Worksheet
Dim myLstObj    As ListObject
Dim myCht1      As Chart
Dim myCht2      As Chart

Set mySht1 = Worksheets("Sheet3")
Set myLstObj = mySht1.ListObjects(1)
Set mySht2 = Worksheets.Add(after:=mySht1)
Set myCht1 = mySht2.Shapes.AddChart2(Style:=-1, _
                              XlChartType:=xlBarStacked, _
                                     Left:=0, _
                                      Top:=0, _
                                    Width:=400, _
                                   Height:=400).Chart
Set myCht2 = mySht2.Shapes.AddChart2(Style:=-1, _
                               XlChartType:=xlBarStacked, _
                                      Left:=400, _
                                       Top:=0, _
                                     Width:=400, _
                                    Height:=400).Chart

Dim i           As Long
Dim j           As Long
Dim myRng       As Range

Dim FiscalYear()    As Long
Dim Male()          As Long
Dim Female()        As Long

Dim mySeries1       As Series
Dim mySeries2       As Series

For i = 2005 To 1835 Step -5
    With myLstObj
        .Range.AutoFilter field:=1, Criteria1:=i
        Set myRng = Intersect(.DataBodyRange, _
                               .Range.SpecialCells(Type:=xlCellTypeVisible))
        If myRng Is Nothing Then
        Else
            For j = 0 To myRng.Rows.Count - 1
                ReDim Preserve FiscalYear(j)
                ReDim Preserve Male(j)
                ReDim Preserve Female(j)
                FiscalYear(j) = myRng.Cells(j + 1, 2)
                Male(j) = myRng.Cells(j + 1, 4)
                Female(j) = myRng.Cells(j + 1, 5)
            Next j
            Set mySeries1 = myCht1.SeriesCollection.NewSeries
            Set mySeries2 = myCht2.SeriesCollection.NewSeries
            With mySeries1
                .Name = i
                .XValues = FiscalYear
                .Values = Male
            End With
            With mySeries2
                .Name = i
                .XValues = FiscalYear
                .Values = Female
            End With
        End If
        .Range.AutoFilter field:=1
    End With
Next i

Dim myChtObj    As ChartObject
Dim myAxis      As Axis
Dim myChtGrp    As ChartGroup

'Debug.Print TypeName(mySht2.ChartObjects)
For Each myChtObj In mySht2.ChartObjects
    'Debug.Print myChtObj.Parent.Index
    Set myCht1 = myChtObj.Chart
    'Debug.Print myCht1.Name
    With myCht1
        .HasTitle = True
        With .ChartTitle
            If myCht1.Name = "Sheet3 グラフ 1" Then
                .Caption = "男性人口の年齢階級推移"
                .Left = 0
            Else
                .Caption = "女性人口の年齢階級推移"
                .Left = 240
            End If
        End With
        Set myAxis = .Axes(xlCategory)
        With myAxis
            .Format.Line.Visible = msoFalse
            .MajorGridlines.Format.Line.Visible = msoFalse
        End With
        Set myAxis = .Axes(xlValue)
        With myAxis
            If myCht1.Name = "Sheet3 グラフ 1" Then
                .ReversePlotOrder = True
            End If
            .DisplayUnit = xlTenThousands
            .Format.Line.Visible = msoFalse
            .MaximumScale = 75000000
            .MajorUnit = .MaximumScale / 3
            .MajorGridlines.Format.Line.Visible = msoFalse
            With .DisplayUnitLabel
                .Delete
            End With
        End With
        With .PlotArea
            .Format.Fill.Visible = msoFalse
            .Format.Line.Visible = msoFalse
            .Left = -10
            .Width = 400
            .Top = 30
            .Height = 380
        End With
        With .ChartArea
            .Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorBackground1
            .Format.TextFrame2.TextRange.Font.Name = "TimesNewRoman"
        End With
        Set myChtGrp = .ChartGroups(1)
        With myChtGrp
            .GapWidth = 0
        End With
        For Each mySeries1 In .SeriesCollection
            With mySeries1
                'Debug.Print .Format.Fill.ForeColor.RGB
                Select Case .Name
                Case "2020"
                .Format.Fill.ForeColor.RGB = RGB(218, 227, 243)
                Case "2015"
                .Format.Fill.ForeColor.RGB = RGB(180, 199, 231)
                Case "2010"
                .Format.Fill.ForeColor.RGB = RGB(143, 170, 220)
                Case "2005"
                .Format.Fill.ForeColor.RGB = RGB(47, 85, 151)
                Case "2000"
                .Format.Fill.ForeColor.RGB = RGB(32, 56, 100)
                Case "1995"
                .Format.Fill.ForeColor.RGB = RGB(226, 240, 217)
                Case "1990"
                .Format.Fill.ForeColor.RGB = RGB(197, 224, 180)
                Case "1985"
                .Format.Fill.ForeColor.RGB = RGB(169, 209, 142)
                Case "1980"
                .Format.Fill.ForeColor.RGB = RGB(84, 130, 53)
                Case "1975"
                .Format.Fill.ForeColor.RGB = RGB(56, 87, 35)
                Case "1970"
                .Format.Fill.ForeColor.RGB = RGB(255, 242, 204)
                Case "1965"
                .Format.Fill.ForeColor.RGB = RGB(255, 230, 153)
                Case "1960"
                .Format.Fill.ForeColor.RGB = RGB(255, 217, 102)
                Case "1955"
                .Format.Fill.ForeColor.RGB = RGB(191, 144, 0)
                Case "1950"
                .Format.Fill.ForeColor.RGB = RGB(127, 96, 0)
                Case "1945"
                .Format.Fill.ForeColor.RGB = RGB(251, 229, 214)
                Case "1940"
                .Format.Fill.ForeColor.RGB = RGB(248, 203, 173)
                Case "1935"
                .Format.Fill.ForeColor.RGB = RGB(244, 177, 131)
                Case "1930"
                .Format.Fill.ForeColor.RGB = RGB(197, 90, 17)
                Case "1925"
                .Format.Fill.ForeColor.RGB = RGB(132, 60, 12)
                Case "1920"
                .Format.Fill.ForeColor.RGB = RGB(242, 242, 242)
                Case "1915"
                .Format.Fill.ForeColor.RGB = RGB(217, 217, 217)
                Case "1910"
                .Format.Fill.ForeColor.RGB = RGB(191, 191, 191)
                Case "1905"
                .Format.Fill.ForeColor.RGB = RGB(166, 166, 166)
                Case "1900"
                .Format.Fill.ForeColor.RGB = RGB(127, 127, 127)
                Case "1895"
                .Format.Fill.ForeColor.RGB = RGB(242, 242, 242)
                Case "1890"
                .Format.Fill.ForeColor.RGB = RGB(217, 217, 217)
                Case "1885"
                .Format.Fill.ForeColor.RGB = RGB(191, 191, 191)
                Case "1880"
                .Format.Fill.ForeColor.RGB = RGB(166, 166, 166)
                Case "1875"
                .Format.Fill.ForeColor.RGB = RGB(127, 127, 127)
                Case "1870"
                .Format.Fill.ForeColor.RGB = RGB(242, 242, 242)
                Case "1865"
                .Format.Fill.ForeColor.RGB = RGB(217, 217, 217)
                Case "1860"
                .Format.Fill.ForeColor.RGB = RGB(191, 191, 191)
                Case "1855"
                .Format.Fill.ForeColor.RGB = RGB(166, 166, 166)
                Case "1850"
                .Format.Fill.ForeColor.RGB = RGB(127, 127, 127)
                Case "1845"
                .Format.Fill.ForeColor.RGB = RGB(242, 242, 242)
                Case "1840"
                .Format.Fill.ForeColor.RGB = RGB(217, 217, 217)
                Case "1835"
                .Format.Fill.ForeColor.RGB = RGB(191, 191, 191)
                End Select
            End With
        Next mySeries1
    End With
Next myChtObj
End Sub

結果

男女別の5歳階級の人口推移(国勢調査より筆者作成)
男女別の5歳階級の人口推移(国勢調査より筆者作成)

 男女別にすることで見えてくるものもある.1975 年以降,一貫して少子化が進行している.女性の方が長生きする.日本は「おばあちゃん大国」になる.

 少子化の原因は女性が生む子供の数が減ったからではない.母親となりうる年齢の女性が減ったためである.そして,いったん負のスパイラルに陥った人口減少は複利効果で指数関数的に減少していく.それが 1975 年以降続いている長期的なトレンドだ.

 少子化対策は必要だ.しかし,それと今後の予測,つまり確実にやってくる未来とは切り離して受け止める必要がある.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください