# GoalSeek02.rb.txt: ruby script (encoding: Windows-31J) # コールシークの操作 z_goal02.xls を出力 # 第1シート: 正六面体(サイコロ)の辺の長さ・体積・表面積を算出 # 目標値を100, 200, 300, …… 1000(立方メートル)として、 # その退席の箱の大きさを調べる。辺の長さは退席の3乗根 # 第2シート: 第2シートと同じだが、ゴールシークの精度を上げて試す。 # 精度を上げるため、「最大反復回数」と「変化の最大値」を変更 require "exlap" filename = "z_goal02.xls" if test(?e, filename) # z_goal02.xlsが存在するなら削除 File.unlink(filename) end xl = Exlap.new # Excelの起動 xl.opens(filename) do |wb| ## 立方体の辺の長さと体積と表面積 ss = wb.fes # 空のワークシートを選択 ss.Name = "正六面体の大きさ調査" ss[1,1] = "正六面体(サイコロ)の辺の長さと体積と表面積(メートル単位)" ss.rr(1,1, 1,4).MergeCells = true ss.from_a(2,1, ["体積(目標値)", "辺の長さ(3乗根)", "試算体積", "試算表面積"]) y = 3 100.step(1000, 100) do |n| # 100, 200, 300, …… 1000 ss.cell(y,1).Value = n # 目標値(体積) ss.cell(y,3).Formula = "=RC[-1]^3" # 試算体積 ss.cell(y,3).GoalSeek('Goal'=>n, 'ChangingCell'=>ss.cell(y,2)) ss.cell(y,4).Formula = "=RC[-2]^2*6" # 試算表面積 ss.rr(y,2, y,4).NumberFormatLocal = "#0.0##" # 数値の有効桁数を指定 y += 1 end ss.range_autofit ## 立方体の体積と表面積(試算の精度を上げる) ss = wb.fes # 空のワークシートを選択 ss.Name = "正六面体の大きさ調査・その2" ss[1,1] = "正六面体(サイコロ)の辺の長さと体積と表面積・精度向上版" ss.rr(1,1, 1,4).MergeCells = true ss.from_a(2,1, ["体積(目標値)", "辺の長さ", "試算体積", "試算表面積"]) max_iterations = xl.MaxIterations # 最大反復回数 xl.MaxIterations = 500 max_change = xl.MaxChange # 変化の最大値 xl.MaxChange = 0.0001 y = 3 100.step(1000, 100) do |n| ss.cell(y,1).Value = n # 目標値(体積) ss.cell(y,3).Formula = "=RC[-1]^3" # 試算体積 ss.cell(y,3).GoalSeek('Goal'=>n, 'ChangingCell'=>ss.cell(y,2)) ss.cell(y,4).Formula = "=RC[-2]^2*6" # 試算表面積 ss.rr(y,2, y,4).NumberFormatLocal = "#0.0##" # 数値の有効桁数を指定 y += 1 end ss.range_autofit xl.MaxIterations = max_iterations # 最大反復回数を復元 xl.MaxChange = max_change # 変化の最大値を復元 wb.ss(1).Activate wb.save # ワークブックの保存 end xl.quit