Kの備忘録(仮)

Python、VBA、Excelを中心に記事を投稿

VBA配列とEnumステートメントの活用1

はじめに

私はEnumステートメントが大好きです!なぜならコードの可読性が上がるので便利だからです。

Enumステートメントを使うと定数をまとめて定義できます。これが配列と相性がいいので、よく一緒に使います。

今回はその一例を紹介します。

今回用意したデータ

e-Statで公開されている2020年の国税調査結果の「人口速報集計(男女別人口及び世帯総数)」を使用します。

https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00200521&tstat=000001136464&cycle=0&tclass1=000001136465&tclass2=000001154388&tclass3val=0

ダウンロードしたファイルを確認します。 f:id:lbibouroku:20220219224129p:plain

このままでは、ちょっとVBAの配列が使いにくいですね・・・。なので手を加えて以下のように加工しました。 f:id:lbibouroku:20220219224242p:plain

ちなみに、このブックのシートは、もともとあった「a01」と、今回転記用に使用する「都道府県別総人口」を追加した2シートです。 f:id:lbibouroku:20220219230909p:plain

今回やりたい処理

では、このデータを使用してEnumステートメントと配列を活用して実施する内容を決めます。

まずはざっくり、こんな感じで決めてみました。

「a01」シートから全国と各都道府県の総人口情報を収集して、必要な項目のみ「都道府県別総人口」シートへ転記する

このままでは抽象的なので、具体的に条件を決めていきます。

地域識別コードを調べてみると、総数の情報は「地域識別コード:a」のようですね。よって「地域識別コードが「a」の項目を転記対象とする」という条件ができました。

また、転記する項目は以下7項目としましょう。

  • 地域識別コード
  • 都道府県
  • 人口/総数
  • 人口/男
  • 人口/女
  • 人口密度
  • 世帯数

まとめると以下の処理になります。

「a01」シートの「地域識別コードが「a」の項目かつ、上記7項目のみ「都道府県別総人口」シートへ転記する

さて、やりたいことが決まったところで、 Enumステートメントの定義内容を決めます。

Enumステートメントの定義内容

まずはEnumステートメントで定義したいグループ名を決めます。

今回は「「a01」シート1行目の項目名」を対象にします。

よって、Enumステートメントのグループ名は「a01シート項目」とします。

では、グループの各要素名を決めましょう。

「a01」シート1行目の項目名は以下の16個です。

  • 地域識別コード
  • 都道府県
  • 地域名
  • 人口/総数
  • 人口/男
  • 人口/女
  • 2015年(平成27年)の人口(組替)
  • 5年間の人口増減数
  • 5年間の人口増減率
  • 人口性比
  • 面積(参考)
  • 人口密度
  • 世帯数
  • 2015年(平成27年)の世帯数(組替)
  • 5年間の世帯増減数
  • 5年間の世帯増減率

さて、ここで注意点があります。

VBAでは変数名や、Enumステートメントのグループ名や要素名などには、命名ルールがあります。

Office TANAKAさんのサイトからVBAの変数の命名の注意点を引用します。 http://officetanaka.net/excel/vba/variable/06.htm

  1. 変数名には文字(日本語を含む)のほか、アンダーバー(_)だけを使えて、そのほかの記号やスペースは使えない
  2. 変数名の先頭が数字やアンダーバー(_)ではいけない
  3. 同じ適用範囲で同じ名前は使えない
  4. 変数名の長さは半角で255文字まで

Enumステートメントのグループ要素も同じ命名ルールです。よって、少し工夫して今回は以下のEnumステートメントのグループの要素名で定義します。

  • 地域識別コード
  • 都道府県
  • 地域名
  • 人口_総数
  • 人口_男
  • 人口_女
  • 人口_2015年
  • 過去5年間の人口増減数
  • 過去5年間の人口増減率
  • 人口性比
  • 面積_参考
  • 人口密度
  • 世帯数
  • 世帯数_2015年
  • 過去5年間の世帯増減数
  • 過去5年間の世帯増減率

Enumステートメントの定義内容が決まったところでコードを書きたいのですが、長くなってしまったので一旦ここで区切ります。