pagetaka

写真、PC、ネット、岡山、旅の話題をお届けします

Excel:町内会名簿から一定年齢以上の名簿をピックアップする

久方ぶりにExcelの宿題です。まあ、実データはない、お話の中の空想の課題だと思ってください。
条件・環境は次の通りです。

  • Excelのブック(ファイル)があります。単位町内会ごとにシートになっていて15枚。
  • ひとつのシートは、A列・シート内の逐次番号、B列・氏名、C列・町丁名、D列・番地、E列・生年月日、F列・備考
  • 1シートあたり10件のところもあれば、170件のところもある。
  • 収録総人数は約1700名で1943年生まれ以前。
  • すべてのシートから、今回は1934年生まれ以前の人を抽出し、単位町内会ごとに生年月日降順で、別シートにする。
  • その別シートは、印刷時、見出し1行+データ25行を収納し、単位町内会が異なっても続けて一つのページに収める。

生年月日のなかから、対象・非対象の区別をつける

現在の見かけ上の表示例は、「S09.12.31」で表示元データは「1934/12/31」。これを表示しているセル内の書式を「文字列」にするとシリアル値(12784)が表示されます。この方は対象。
「S10.01.01」(1935/1/1)の方は対象外です(シリアル値は、12785)。今回の条件で、月日は関係なく、年だけ気をつければOKみたいです。また、毎年対象とする年はひとつずつプラスされますので、現在年から79を引くと対象年のなかで一番大きい数(=生まれが遅い=若い人)を見つける目印とすることができそうです。

関数DATEVALUE(生年月日のセル)

エクセルは、日付をシリアル値で管理しています。表示している「S09.12.31」が正しく認識されるか「DATEVALUE」関数で試したらNGでした。認識できないセル値というエラーです。今回の場合、セルの表示形式を「文字列」にしたら日付のシリアル値が表示されました(実データはシリアル値が入っていた…)ので、これにYEAR関数を使うと、正しく、1934の判定に使う年が表示が得られたことになります。日付を作ったときの条件により見かけは同じようでもパソコン的には異なった内容になっている可能性もあります。シリアル値を得ようと失敗しても、イロイロ試してみたら案外成功するかも…。

西暦表示 日付シリアル値 西暦年
S09.12.31 1934年12月31日 12784 1934
S10.01.01 1935年1月1日 12785 1935
セル表示のデータ セル書式西暦表示 セル書式:文字列 関数 YEAR(一つ左のセル)

上のテーブルのような手順で、元データの表示から西暦年を表示させることができました。実際には、一気にやりますけどね。
これで、セルに表示されている生年月日から対象・非対象を選り分ける目印ができたことになります。

一つのシート内のデータがある行の最後を求める

単位町内会の対象者が多いところで170件というようなことですから、1行目から200件ぐらいまでを順次処理していくというのでもOKですが、すこしスマートに、そうですね、自動的に使用セルの最後の行番号を得る、というのが良いかもしれません。

結果的にどうするかは、今回条件に書いてないことも影響を受けそうですので、あえてスルーということで。

すべてのシートを調べる

シート数を調べ、それをすべて巡回する必要がありそうです。

概略

  • シートの数を得る
  • シート1からNまで順番に見ていく
  • 各シート内で対象かどうか行ごとに判定し、対象であれば行内の各セルを配列に収める
  • シートNまでチェックがすんだら、N+1番目のシートを作成(書式設定省略)
  • 配列に収めた対象データをN+1番目のシートに貼り付ける

以上のような流れでしょうか。あまりExcelやらないもので、苦手…。でも、爺の中では概略が絵になったので、なんとかできるんじゃないかと妄想中…。