Excelでカレンダーを作る

RubydeExcelを使って、カレンダーを作ってみる。

テンプレート

これも、Excel上でカレンダーのテンプレートを作っておく。フォント設定や色もすべて設定しておく。 また、セルを指定するために、必要に応じてセルに名前をつけておく。

今回は以下のようなテンプレートを作っておいた。吹き出しはセルにつけた名前である。

カレンダーのテンプレート

このテンプレートを"cal_template.xls"という名前で保存しておく。

処理方法概要

曜日や休日を求めるためにRAAのcalendarを使う。これをあらかじめインストールしておく。

スクリプト

1年分のカレンダーを作ってみる。こんな処理になっている。

  • その月の初日の曜日を求めて、カーソルを初日のセルに移動させる(29〜34行)
  • その月の末日を求めて、初日から末日までカーソルを移動させながらループさせる(38〜55行)
  • 休日ならば赤字にする(40〜42行)
  • その月が5週を超えるなら、最終行を1行増やして、処理を続ける(47〜50行)。このように、Excel::Range#insert_hereを使うと、 状況によってセルが増減するシートも簡単に作ることができる。
  01: #!ruby -Ks
  02: require 'date'
  03: require 'date/holiday'
  04: require 'excel_lib'
  05: 
  06: YEAR = 2004
  07: 
  08: def next_month(year,month)
  09:   if (month+1)>12
  10:     month = 1; year += 1
  11:   else
  12:     month += 1
  13:   end
  14:   Date.new(year,month,1)
  15: end
  16: 
  17: excel = Excel.new
  18: book = excel.copy_book('cal_template.xls')
  19: source_sheet = book.sheets(1)
  20: 
  21: month = 1
  22: 12.times do
  23:   sheet = book.add_sheet(source_sheet)
  24:   sheet.name = "#{YEAR}・#{month}"
  25:   sheet.range("年").text = "#{YEAR}年"
  26:   sheet.range("月").text = "#{month}月"
  27:   date = Date.new(YEAR,month,1)
  28:   week_offset = date.cwday
  29:   if week_offset == 7
  30:     week_offset = 0
  31:   end
  32:   cursol = sheet.range("基点").get_cursol
  33:   cursol.h_move(week_offset)
  34:   
  35:   next_month_date = next_month(YEAR,month)
  36:   line_offset = 0
  37:   loop do
  38:     cursol.value = date.day
  39:     if date.national_holiday?
  40:       cursol.Font.ColorIndex = 3
  41:     end
  42:     cursol.h_move(1)
  43:     date += 1
  44:     break if date >= next_month_date
  45:     if date.cwday >= 7
  46:       if line_offset >= 4
  47:         sheet.range("最終行").insert_here
  48:         sheet.range("最終週").value = [""]*7
  49:       end
  50:       cursol = sheet.range("基点").get_cursol
  51:       cursol.v_move(line_offset+1)
  52:       line_offset += 1
  53:     end
  54:   end
  55:   month += 1
  56: end
  57: source_sheet.delete
  

これでできたカレンダーがこれである。

RubydeExcelで作ったカレンダー


戻る