月末処理用のエクセル自動化を試みる。
シフト表からデータを読み込んで、配列に格納。そのデータをもとに別のエクセルファイルにデータを記入することを目指す。
処理の途中で配列がいつの間にか二重になってたりと、いくつかのエラーは解決できた。
が、取得した配列のデータを.eachメソッド使ってセルの上から下に書き込もうとしたのだけど、繰り返しのなかで条件分岐がうまく動作せず。時間ぎれで今月の月末処理には間に合わず。
実はこのプログラムを作るより、WEBスクレイピングできるようにしたほうが手間が減りそうと気づいたので、これで作成中止。
とは言え、いい勉強になったかな。
最終的には以下のようなコードになった。
#! ruby -Ks
require 'win32ole'
puts "何月の勤務表作る?"
@month = gets.chomp
@year = 2018
puts "#{@month}月の勤務表つくるよ"
def get_shift #シフト表から当月のシフトを取得
filename = Dir.glob("shift*")
app = WIN32OLE.new('Excel.Application')
fso = WIN32OLE.new('Scripting.FileSystemObject') #pathで指定したいときはこの2行
book = app.Workbooks.Open(fso.GetAbsolutePathName(filename[0]))
#book = app.Workbooks.Open(app.GetOpenFilename)
#手動でファイルを指定するときはこれ
begin #メインの処理ここから
sheet = book.Worksheets("#{@year}年#{@month}月シフト") #ハードコーディングから対話式で情報取得に。
@shift = sheet.Range("C6:AG6").Value #目標セルをハードコーディング。。。
#メインの処理ここまで
ensure
book.Close
app.quit
end
end
def timecard
filename = Dir.glob("timecard*")
app = WIN32OLE.new('Excel.Application')
fso = WIN32OLE.new('Scripting.FileSystemObject')
book = app.Workbooks.Open(fso.GetAbsolutePathName(filename[0]))
begin #メインの処理ここから
sheet = book.Worksheets(1)
x = "I"
y = 5
cell = sheet.Range(x + y.to_s)
#↓配列を取り出してcaseの判定にかけることは動作してるっぽいが、書き込むセルが最初のI5から動いてないくさい。。。
@shift[0].each do |i| #@shiftがなぜか二次元配列になってた。pで表示すると二重の括弧がついてる→[[]]
case i
when "N1"
x = "I"
cell.value = "1"
x = "G"
cell.value = "9:00"
x = "H"
cell.value = "18:00" if cell.value == nil
when "N2"
x = "I"
cell.value = "2"
x = "G"
cell.value = "17:30"
x = "H"
cell.value = "2:00"
when "N3"
x = "I"
cell.value = "3"
x = "G"
cell.value = "1:00"
x = "H"
cell.value = "10:30" if cell.value == nil
when "休"
x = "I"
cell.value = "公休"
when nil
break
end
y += 1
end
book.save
#メインの処理ここまで
ensure
book.Close
app.quit
end
end
get_shift
timecard