以下に掲げるrubyスクリプトのサンプルは、Excel操縦用ライブラリ exlap.rb 最新版: exlap_latest.zipに同梱のものを利用するとの前提で書かれています。
目次
#! ruby -Ks # シナリオ作成とその表示 require "exlap" labels = %w(事業 収入 支出 利益) # 見出しの名前 cell_names = labels filename = "test01.xls" Exlap.new(filename) {|wb| ss = wb.fes # 空のワークシートを選択 ss.Name = "事業別収支計画書" ss[1,1] = "2011年度 事業別収支計画書" # A1欄にタイトルを書き込む ss.rr(1,1, 1,labels.size).MergeCells = true # セル結合 # 第2行目に見出しを書き込む ss.rr(2,1, 2,labels.size).Value = [labels] # 第3行目の変化させるセルに名前を付ける(名前付き範囲の定義) cell_names.each_with_index {|name, i| ss.cell(3,i+1).Name = name } # セルに関するその他の設定 ss.Range("利益").Value = "=収入-支出" # 計算式 %w(収入 支出 利益).each {|name| ss.Range(name).NumberFormatLocal = "#,##0" # 数値の表示形式 } # 3つのシナリオを登録 changing_cells = ss.Range("事業,収入,支出") ss.Scenarios.Add({ 'Name'=>"飲食店のシナリオ", 'ChangingCells'=>changing_cells, 'Values'=>["飲食店", 20000000, 11300000], 'Comment'=>"飲食店事業の見込み", 'Locked'=>true, 'Hidden'=>false}) ss.Scenarios.Add({ 'Name'=>"通信販売のシナリオ", 'ChangingCells'=>changing_cells, 'Values'=>["通信販売", 12000000, 6680000], 'Comment'=>"通信販売事業の見込み", 'Locked'=>true, 'Hidden'=>false}) ss.Scenarios.Add({ 'Name'=>"塾経営のシナリオ", 'ChangingCells'=>changing_cells, 'Values'=>["塾経営", 30000000, 20520000], 'Comment'=>"塾経営事業の見込み", 'Locked'=>true, 'Hidden'=>false}) ss.Scenarios(1).Show # 第1のシナリオを表示 ss.range_autofit # セルの幅と高さを自動調整 wb.save }download snr01.rb
#! ruby -Ks # シナリオの要約レポート表示 require "exlap" labels = %w(事業 収入 支出 利益) # 見出しの名前 cell_names = labels filename = "test01_2.xls" Exlap.new(filename) {|wb| ss = wb.fes # 空のワークシートを選択 ss.Name = "事業別収支計画書" ss[1,1] = "2011年度 事業別収支計画書" # A1欄にタイトルを書き込む ss.rr(1,1, 1,labels.size).MergeCells = true # セル結合 # 第2行目に見出しを書き込む ss.rr(2,1, 2,labels.size).Value = [labels] # 第3行目の変化させるセルに名前を付ける(名前付き範囲の定義) cell_names.each_with_index {|name, i| ss.cell(3,i+1).Name = name } # セルに関するその他の設定 ss.Range("利益").Value = "=収入-支出" # 計算式 %w(収入 支出 利益).each {|name| ss.Range(name).NumberFormatLocal = "#,##0" # 数値の表示形式 } # 3つのシナリオを登録 changing_cells = ss.Range("事業,収入,支出") ss.Scenarios.Add({ 'Name'=>"飲食店のシナリオ", 'ChangingCells'=>changing_cells, 'Values'=>["飲食店", 20000000, 11300000], 'Comment'=>"飲食店事業の見込み", 'Locked'=>true, 'Hidden'=>false}) ss.Scenarios.Add({ 'Name'=>"通信販売のシナリオ", 'ChangingCells'=>changing_cells, 'Values'=>["通信販売", 12000000, 6680000], 'Comment'=>"通信販売事業の見込み", 'Locked'=>true, 'Hidden'=>false}) ss.Scenarios.Add({ 'Name'=>"塾経営のシナリオ", 'ChangingCells'=>changing_cells, 'Values'=>["塾経営", 30000000, 20520000], 'Comment'=>"塾経営事業の見込み", 'Locked'=>true, 'Hidden'=>false}) ss.Scenarios(1).Show # 第1のシナリオを表示 ss.range_autofit # セルの幅と高さを自動調整 # 標準タイプの要約レポート ss.Scenarios.CreateSummary({ 'ReportType'=>XlStandardSummary, 'ResultCells'=>ss.Range("利益")}) # ピボットテーブルの要約レポート ss.Scenarios.CreateSummary({ 'ReportType'=>XlSummaryPivotTable, 'ResultCells'=>ss.Range("収入,支出,利益")}) wb.save }download snr01_2.rb
#! ruby -Ks # 各シナリオの表示結果を別シートにコピー require "exlap" labels = %w(事業 収入 支出 利益) # 見出しの名前 cell_names = labels filename = "test02.xls" Exlap.new(filename) {|wb| ss = wb.fes # 空のワークシートを選択 ss.Name = "事業別収支計画書" ss[1,1] = "2011年度 事業別収支計画書" # A1欄にタイトルを書き込む ss.rr(1,1, 1,labels.size).MergeCells = true # セル結合 # 第2行目に見出しを書き込む ss.rr(2,1, 2,labels.size).Value = [labels] # 第3行目の変化させるセルに名前を付ける(名前付き範囲の定義) cell_names.each_with_index {|name, i| ss.cell(3,i+1).Name = name } # セルに関するその他の設定 ss.Range("利益").Value = "=収入-支出" # 計算式 %w(収入 支出 利益).each {|name| ss.Range(name).NumberFormatLocal = "#,##0" # 数値の表示形式 } # 3つのシナリオを登録 changing_cells = ss.Range("事業,収入,支出") ss.Scenarios.Add({ 'Name'=>"飲食店のシナリオ", 'ChangingCells'=>changing_cells, 'Values'=>["飲食店", 20000000, 11300000], 'Comment'=>"飲食店事業の見込み", 'Locked'=>true, 'Hidden'=>false}) ss.Scenarios.Add({ 'Name'=>"通信販売のシナリオ", 'ChangingCells'=>changing_cells, 'Values'=>["通信販売", 12000000, 6680000], 'Comment'=>"通信販売事業の見込み", 'Locked'=>true, 'Hidden'=>false}) ss.Scenarios.Add({ 'Name'=>"塾経営のシナリオ", 'ChangingCells'=>changing_cells, 'Values'=>["塾経営", 30000000, 20520000], 'Comment'=>"塾経営事業の見込み", 'Locked'=>true, 'Hidden'=>false}) ss.Scenarios.each {|snr| snr.Show # 1つのシナリオを表示 ss.range_autofit # セルの幅や高さを自動調整 ss.Copy({'Before'=>ss}) # 現シートの前に複製シートを新設 ss2 = wb.offset_sheet(ss, -1) # 新設の複製シートのオブジェクトを得る ss2.Name = snr.Name } wb.save }download snr02.rb
#! ruby -Ks # 各シナリオの表示結果を並べて表示(ChangeScenarioの利用) require "exlap" labels = %w(事業 収入 支出 利益) # 見出しの名前 cell_names = labels filename = "test02_2.xls" Exlap.new(filename) {|wb| ss = wb.fes # 空のワークシートを選択 ss.Name = "事業別収支計画書" ss[1,1] = "2011年度 事業別収支計画書" # A1欄にタイトルを書き込む ss.rr(1,1, 1,labels.size).MergeCells = true # セル結合 # 第2行目に見出しを書き込む ss.rr(2,1, 2,labels.size).Value = [labels] # 第3行目の変化させるセルに名前を付ける(名前付き範囲の定義) cell_names.each_with_index {|name, i| ss.cell(3,i+1).Name = name } # セルに関するその他の設定 ss.Range("利益").Value = "=収入-支出" # 計算式 %w(収入 支出 利益).each {|name| ss.Range(name).NumberFormatLocal = "#,##0" # 数値の表示形式 } # 3つのシナリオを登録 changing_cells = ss.Range("事業,収入,支出") ss.Scenarios.Add({ 'Name'=>"飲食店のシナリオ", 'ChangingCells'=>changing_cells, 'Values'=>["飲食店", 20000000, 11300000], 'Comment'=>"飲食店事業の見込み", 'Locked'=>true, 'Hidden'=>false}) ss.Scenarios.Add({ 'Name'=>"通信販売のシナリオ", 'ChangingCells'=>changing_cells, 'Values'=>["通信販売", 12000000, 6680000], 'Comment'=>"通信販売事業の見込み", 'Locked'=>true, 'Hidden'=>false}) ss.Scenarios.Add({ 'Name'=>"塾経営のシナリオ", 'ChangingCells'=>changing_cells, 'Values'=>["塾経営", 30000000, 20520000], 'Comment'=>"塾経営事業の見込み", 'Locked'=>true, 'Hidden'=>false}) # ワークシートをコピー ss.Copy({'After'=>ss}) # 現シートの次に複製シートを新設 ss2 = wb.offset_sheet(ss, 1) # 新たな複製シートのオブジェクトを得る ss2.Name = "複製シート" if ss2.Scenarios.Count == 0 ss2.Scenarios.Merge(ss) # シナリオを読み込む end # 2番、3番のシナリオのChangingCellsを変更しつつ表示 ss2.Scenarios.each {|snr| i = snr.Index if i > 1 # 2番目、3番目のシナリオの変更 old_changing_cells = snr.ChangingCells values = snr.Values changing_cells = ss2.rr(i+2,1, i+2,3) snr.ChangeScenario(changing_cells, values) old_changing_cells.Copy(changing_cells) # 書式も含めてコピー ss2.cell(i+2,4).Value = "=RC[-2]-RC[-1]" # 「利益」欄の設定 ss2.cell(i+2,4).NumberFormatLocal = "#,##0" end snr.Show } ss2.range_autofit wb.save }download snr02_2.rb
#! ruby -Ks # 本業と副業の2種類のシナリオを登録 require "exlap" require "csv" # 名前定義のcsv cell_names_format = <<EON タイトル ラベル 事業,収入,支出,利益 副業,副業収入,副業支出,副業利益 合算,合算収入,合算支出,合算利益 EON cell_names = CSV.parse(cell_names_format) # csvを配列に変換 # セルの値のcsv cell_values_format = <<EOV 2011年度 事業別収支計画書 事業,収入,支出,利益 ,,,=収入-支出 ,,,=副業収入-副業支出 合算,=収入+副業収入,=支出+副業支出,=利益+副業利益 EOV cell_values = CSV.parse(cell_values_format) # csvを配列に変換 # シナリオ情報のcsv scenario_group = [] scenario_data1 = <<EOS1 飲食店のシナリオ,飲食店,20000000,11300000 通信販売のシナリオ,通信販売,12000000,6680000 塾経営のシナリオ,塾経営,30000000,20520000 EOS1 scenario_group << CSV.parse(scenario_data1) scenario_data2 = <<EOS2 副業Aのシナリオ,副業A,1500000,100000 副業Bのシナリオ,副業B,1000000,50000 副業Cのシナリオ,副業C,750000,50000 EOS2 scenario_group << CSV.parse(scenario_data2) filename = "test03.xls" Exlap.new(filename) {|wb| ss = wb.fes # 空のワークシートを選択 ss.Name = "事業別収支計画書" # セルに名前を付ける cell_names.each_with_index {|list, r| list.each_with_index {|name, c| ss.Cells.Item(r+1, c+1).Name = name if name.to_s != '' } } # セルの値をセットする cell_values.each_with_index {|list, r| list.each_with_index {|val, c| ss.Cells.Item(r+1, c+1).Value = val if val.to_s != '' } } ss.rr(1,1, 1,cell_values[1].size).MergeCells = true # タイトル部のセル結合 # セルに関するその他の設定 (%w(収入 支出 利益) + %w(副業収入 副業支出 副業利益) + %w(合算収入 合算支出 合算利益)).each {|name| ss.Range(name).NumberFormatLocal = "#,##0" # 数値の表示形式 } # シナリオの登録 changing_cells = [ss.Range("事業,収入,支出"), ss.Range("副業,副業収入,副業支出")] scenario_group.each_with_index {|info, idx| info.each {|ary| name = ary[0] values = ary[1...ary.size] ss.Scenarios.Add({ 'Name'=>name, 'ChangingCells'=>changing_cells[idx], 'Values'=>values}) } } ss.Scenarios("飲食店のシナリオ").Show ss.Scenarios("副業Aのシナリオ").Show ss.range_autofit # セルの幅と高さを自動調整 wb.save }download snr03.rb
#! ruby -Ks # 本業と副業の総ての組合せパターンを表示・保存 require "exlap" require "csv" # 名前定義のcsv cell_names_format = <<EON タイトル ラベル 事業,収入,支出,利益 副業,副業収入,副業支出,副業利益 合算,合算収入,合算支出,合算利益 EON cell_names = CSV.parse(cell_names_format) # csvを配列に変換 # セルの値のcsv cell_values_format = <<EOV 2011年度 事業別収支計画書 事業,収入,支出,利益 ,,,=収入-支出 ,,,=副業収入-副業支出 合算,=収入+副業収入,=支出+副業支出,=利益+副業利益 EOV cell_values = CSV.parse(cell_values_format) # csvを配列に変換 # シナリオ情報のcsv scenario_group = [] scenario_data1 = <<EOS1 飲食店のシナリオ,飲食店,20000000,11300000 通信販売のシナリオ,通信販売,12000000,6680000 塾経営のシナリオ,塾経営,30000000,20520000 EOS1 scenario_group << CSV.parse(scenario_data1) scenario_data2 = <<EOS2 副業Aのシナリオ,副業A,1500000,100000 副業Bのシナリオ,副業B,1000000,50000 副業Cのシナリオ,副業C,750000,50000 EOS2 scenario_group << CSV.parse(scenario_data2) filename = "test03_2.xls" Exlap.new(filename) {|wb| ss = wb.fes # 空のワークシートを選択 ss.Name = "事業別収支計画書" # セルに名前を付ける cell_names.each_with_index {|list, r| list.each_with_index {|name, c| ss.Cells.Item(r+1, c+1).Name = name if name.to_s != '' } } # セルの値をセットする cell_values.each_with_index {|list, r| list.each_with_index {|val, c| ss.Cells.Item(r+1, c+1).Value = val if val.to_s != '' } } ss.rr(1,1, 1,cell_values[1].size).MergeCells = true # タイトル部のセル結合 # セルに関するその他の設定 (%w(収入 支出 利益) + %w(副業収入 副業支出 副業利益) + %w(合算収入 合算支出 合算利益)).each {|name| ss.Range(name).NumberFormatLocal = "#,##0" # 数値の表示形式 } # シナリオの登録 changing_cells = [ss.Range("事業,収入,支出"), ss.Range("副業,副業収入,副業支出")] scenario_group.each_with_index {|info, idx| info.each {|ary| name = ary[0] values = ary[1...ary.size] ss.Scenarios.Add({ 'Name'=>name, 'ChangingCells'=>changing_cells[idx], 'Values'=>values}) } } scenario_group[0].each {|info1| scenario_name1 = info1[0] scenario_group[1].each {|info2| scenario_name2 = info2[0] ss.Scenarios(scenario_name1).Show ss.Scenarios(scenario_name2).Show ss.range_autofit # セルの幅と高さを自動調整 ss.Copy({'Before'=>ss}) # 現シートの前に複製シートを新設 ss2 = wb.offset_sheet(ss, -1) # 新設の複製シートのオブジェクトを得る ss2.Name = scenario_name1 + "&" + scenario_name2 } } wb.save }download snr03_2.rb
#! ruby -Ks # 本業と副業の総ての組合せパターンを表示・保存(汎用版) require "exlap" require "csv" # 2次元配列groupの要素の「組合せ」総てを返す # groupの要素数が0の時は [] を返す def combine(group) res = [] if group.size == 1 group[0].each {|x| res << [x] } elsif group.size == 2 first = group[0] second = group[1] first.each {|x1| second.each {|x2| res << [x1, x2] } } elsif group.size > 2 first = group[0] other = group[1...group.size] w = combine(other) first.each {|x| w.each {|ary| res << ([x] + ary) } } end return res end # 名前定義のcsv cell_names_format = <<EON タイトル ラベル 事業,収入,支出,利益 副業,副業収入,副業支出,副業利益 合算,合算収入,合算支出,合算利益 EON cell_names = CSV.parse(cell_names_format) # csvを配列に変換 # セルの値のcsv cell_values_format = <<EOV 2011年度 事業別収支計画書 事業,収入,支出,利益 ,,,=収入-支出 ,,,=副業収入-副業支出 合算,=収入+副業収入,=支出+副業支出,=利益+副業利益 EOV cell_values = CSV.parse(cell_values_format) # csvを配列に変換 # シナリオ情報のcsv scenario_data_csv = <<EOS 飲食店のシナリオ,"事業,収入,支出",飲食店,20000000,11300000 通信販売のシナリオ,"事業,収入,支出",通信販売,12000000,6680000 塾経営のシナリオ,"事業,収入,支出",塾経営,30000000,20520000 副業Aのシナリオ,"副業,副業収入,副業支出",副業A,1500000,100000 副業Bのシナリオ,"副業,副業収入,副業支出",副業B,1000000,50000 副業Cのシナリオ,"副業,副業収入,副業支出",副業C,750000,50000 EOS scenario_data = CSV.parse(scenario_data_csv) # csvを配列に変換 filename = "test03_3.xls" Exlap.new(filename) {|wb| ss = wb.fes # 空のワークシートを選択 ss.Name = "事業別収支計画書" # セルに名前を付ける cell_names.each_with_index {|list, r| list.each_with_index {|name, c| ss.Cells.Item(r+1, c+1).Name = name if name.to_s != '' } } # セルの値をセットする cell_values.each_with_index {|list, r| list.each_with_index {|val, c| ss.Cells.Item(r+1, c+1).Value = val if val.to_s != '' } } ss.rr(1,1, 1,cell_values[1].size).MergeCells = true # タイトル部のセル結合 # セルに関するその他の設定 (%w(収入 支出 利益) + %w(副業収入 副業支出 副業利益) + %w(合算収入 合算支出 合算利益)).each {|name| ss.Range(name).NumberFormatLocal = "#,##0" # 数値の表示形式 } # シナリオの登録 scenario_data.each {|ary| name = ary[0] changing_cells = ss.Range(ary[1]) values = ary[2...ary.size] ss.Scenarios.Add({ 'Name'=>name, 'ChangingCells'=>changing_cells, 'Values'=>values}) } # changing_cellsを手がかりにしたグループ分け # changing_cellsが同じものを同じグループとみなす group = [] hs = {} scenario_data.each {|ary| name = ary[0] changing_cells = ary[1] num = hs[changing_cells] unless num num = hs[changing_cells] = hs.size end unless group[num] group[num] = [] end group[num] << name } res = combine(group) res.each {|ary| ary.each {|name| ss.Scenarios(name).Show } ss.range_autofit # セルの幅と高さを自動調整 ss.Copy({'Before'=>ss}) # 現シートの前に複製シートを新設 ss2 = wb.offset_sheet(ss, -1) # 新設の複製シートのオブジェクトを得る ss2.Name = ary.join("&") } wb.save }download snr03_3.rb
#! ruby -Ks # 本業と副業の2種類のシナリオの要約レポート require "exlap" require "csv" # 名前定義のcsv cell_names_format = <<EON タイトル ラベル 事業,収入,支出,利益 副業,副業収入,副業支出,副業利益 合算,合算収入,合算支出,合算利益 EON cell_names = CSV.parse(cell_names_format) # csvを配列に変換 # セルの値のcsv cell_values_format = <<EOV 2011年度 事業別収支計画書 事業,収入,支出,利益 ,,,=収入-支出 ,,,=副業収入-副業支出 合算,=収入+副業収入,=支出+副業支出,=利益+副業利益 EOV cell_values = CSV.parse(cell_values_format) # csvを配列に変換 # シナリオ情報のcsv scenario_group = [] scenario_data1 = <<EOS1 飲食店のシナリオ,飲食店,20000000,11300000 通信販売のシナリオ,通信販売,12000000,6680000 塾経営のシナリオ,塾経営,30000000,20520000 EOS1 scenario_group << CSV.parse(scenario_data1) scenario_data2 = <<EOS2 副業Aのシナリオ,副業A,1500000,100000 副業Bのシナリオ,副業B,1000000,50000 副業Cのシナリオ,副業C,750000,50000 EOS2 scenario_group << CSV.parse(scenario_data2) filename = "test03_4.xls" Exlap.new(filename) {|wb| ss = wb.fes # 空のワークシートを選択 ss.Name = "事業別収支計画書" # セルに名前を付ける cell_names.each_with_index {|list, r| list.each_with_index {|name, c| ss.Cells.Item(r+1, c+1).Name = name if name.to_s != '' } } # セルの値をセットする cell_values.each_with_index {|list, r| list.each_with_index {|val, c| ss.Cells.Item(r+1, c+1).Value = val if val.to_s != '' } } ss.rr(1,1, 1,cell_values[1].size).MergeCells = true # タイトル部のセル結合 # セルに関するその他の設定 (%w(収入 支出 利益) + %w(副業収入 副業支出 副業利益) + %w(合算収入 合算支出 合算利益)).each {|name| ss.Range(name).NumberFormatLocal = "#,##0" # 数値の表示形式 } # シナリオの登録 changing_cells = [ss.Range("事業,収入,支出"), ss.Range("副業,副業収入,副業支出")] scenario_group.each_with_index {|info, idx| info.each {|ary| name = ary[0] values = ary[1...ary.size] ss.Scenarios.Add({ 'Name'=>name, 'ChangingCells'=>changing_cells[idx], 'Values'=>values}) } } ss.Scenarios("飲食店のシナリオ").Show ss.Scenarios("副業Aのシナリオ").Show ss.range_autofit # セルの幅と高さを自動調整 # 標準タイプの要約レポート ss.Scenarios.CreateSummary({ 'ReportType'=>XlStandardSummary, 'ResultCells'=>ss.Range("利益,副業利益,合算収入,合算支出,合算利益")}) # ピボットテーブルの要約レポート ss.Scenarios.CreateSummary({ 'ReportType'=>XlSummaryPivotTable, 'ResultCells'=>ss.Range("収入,支出,利益," + "副業収入,副業支出,副業利益," + "合算収入,合算支出,合算利益")}) wb.save }download snr03_4.rb