前回の記事では大正 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
結果

男女別にすることで見えてくるものもある.1975 年以降,一貫して少子化が進行している.女性の方が長生きする.日本は「おばあちゃん大国」になる.
少子化の原因は女性が生む子供の数が減ったからではない.母親となりうる年齢の女性が減ったためである.そして,いったん負のスパイラルに陥った人口減少は複利効果で指数関数的に減少していく.それが 1975 年以降続いている長期的なトレンドだ.
少子化対策は必要だ.しかし,それと今後の予測,つまり確実にやってくる未来とは切り離して受け止める必要がある.

