ワークシートの目次を作る

複数のワークシートが入っているExcelファイルがあるとする。ワークシートの目次をつくってみよう。 当然、目次にはリンクをつけて、クリックで目的のワークシートを開けるようにする。

テンプレート

ワークシートの目次となるテンプレートワークブックを用意しておく。 このワークブックにワークシートを追加していき、目次を作っていく。 吹き出しはセルにつけた名前である。

テンプレート

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

単純にワークシート名を目次に並べてみる

まずは、単純にワークシート名を目次にならべてみよう。 もちろん、リンクはつける。

  # mk_mokuji.rb
  require 'excel_lib'
  excel = Excel.new
  list_book = excel.copy_book("./collect_sheet.xls")
  
  filename = ARGV.shift
  src_book = excel.copy_book(filename)
  src_book.each_sheet {|sheet|
    list_book.add_sheet(sheet)
  }
  src_book.close
  
  # 目次を作ろう
  mokuji_sheet = list_book.sheets[1]
  (2..list_book.sheets.size).each {|index|
    sheet = list_book.sheets[index]
    p sheet.name
    mokuji_sheet.range("No").text = index-1
    sheetname_range = mokuji_sheet.range("シート名")  # (A)
    sheetname_range.text = sheet.name
    sheetname_range.HyperLinks.add(                   # (B)
      "Anchor"=>sheetname_range.raw,                  # (C)
      "Address"=>"",
      "SubAddress"=>"'#{sheet.name}'!A1"
    )
    mokuji_sheet.range("水平領域").insert_here        # (D)
  }
  mokuji_sheet.range("水平領域").delete               # (E)
  

解説します。

  • (A)でsheetname_rangeがリンクをはりたいRangeをさすようにしている
  • (B)でsheetname_rangeにリンクを張ってる
  • (C)でHyperLinks.addの引数をセットしている。"Anchor"にはRangeオブジェクトを指定しないといけないのだが、 sheetname_rangeを指定してしまうと、WIN32OLEオブジェクトのラッパーオブジェクトなのでエラーになってしまう。 そのため、sheetname_range.rawを指定している。その下の"Address"パラメータも無いとエラーになってしまう。
  • (D)insert_here()はRubydeExcelのオリジナルメソッド。行をコピーして増やすときの上等手段
  • (E)で最後に消しておかないと、余計な行ができちゃう

ちょっと変更すれば、単純にワークシート名を目次に出すのではなく、各ワークシート内に書いてある特定の名称を ひっぱってくることも可能。


戻る