LoginSignup
0
1

More than 5 years have passed since last update.

プログラム初めて1週間ちょっとだけどエクセルを自動化する

Last updated at Posted at 2018-12-01

月末処理用のエクセル自動化を試みる。
シフト表からデータを読み込んで、配列に格納。そのデータをもとに別のエクセルファイルにデータを記入することを目指す。

処理の途中で配列がいつの間にか二重になってたりと、いくつかのエラーは解決できた。
が、取得した配列のデータを.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
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1