LoginSignup
1
1

More than 5 years have passed since last update.

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

Posted at

ruby 超入門を1週ざっと読んだので、練習がてら何か動くものを作りたい。
ちょうど月末だったので、勤務実績をエクセルに書く定型処理を自動化する。

七転八倒

"ruby excel"でぐぐって、以下のページなどを参考にrubyXLというgemを使おうと思った。
https://qiita.com/m-shin/items/fc6f551da921e00df54d

が、会社PCではgem installコマンドがうまく動かない。たぶんプロキシが動いてるか、ファイアウォールで邪魔されているか。。。
--localオプションも試してみたけど、20分くらい試してみてなんか上手くいかなかったし、gemをネット接続なしで入れるのは茨の道と各所で散見されたので、本筋でもないし諦めることに。

win32oleというライブラリが標準で使えるらしいし、サンプルコードを試したら動いたので採用することに。

やること:とりあえず動くものを作る。最初はハードコーディング上等。徐々に機能を増やす(ファイル自動で見つけてきたりだとか)。
やらないこと:綺麗にかく

実際にコード書き始めたら、if文、case文の書き方とか、eachメソッドの書き方とかすら頭に入ってなかったことが判明。
とりあえずエラーを出して何行目が間違っているか確認しながら進行中。

現状のコード

excel.rb


#! ruby -Ks
require 'win32ole'


def get_shift #シフト表から当月のシフトを取得

  app = WIN32OLE.new('Excel.Application')

  fso = WIN32OLE.new('Scripting.FileSystemObject') #pathで指定したいときはこの2行
  book = app.Workbooks.Open(fso.GetAbsolutePathName('2018-12-Ver01.xlsx')) 

  #book = app.Workbooks.Open(app.GetOpenFilename)
  #手動でファイルを指定するときはこれ


  begin  #メインの処理ここから

    sheet = book.Worksheets('2018年11月シフト')  #目標のシートをハードコーディング。。。

    @shift = sheet.Range('C6:AG6').Value        #目標セルをハードコーディング。。。



         #メインの処理ここまで

  ensure
    book.Close
    app.quit
  end

end


def timecard

  app = WIN32OLE.new('Excel.Application')
  fso = WIN32OLE.new('Scripting.FileSystemObject')

  book = app.Workbooks.Open(fso.GetAbsolutePathName('timecard_20181128.xlsx'))

  begin  #メインの処理ここから

  sheet = book.Worksheets(1)
  x ="C"
  y =5
  cell = sheet.Range(x + y.to_s)

  for i in @shift do
    case i
      when "N1"
        x = "C"
        cell.value = "1"
        x = "A"
        cell.value = "9:00"
      when "N2"
        x = "C"
        cell.value = "2"
        x = "A"
        cell.value = "17:30"
        x = "B"
        cell.value = "2:00"
      when "N3"
        x = "C"
        cell.value = "3"
        x = "A"
        cell.value = "1:00"
      when "休"
        x = "C"
        cell.value = "公休"
    end

    y += 1

  end

  book.save
         #メインの処理ここまで

  ensure
    book.Close
    app.quit
  end
end



会社で夜勤の暇な時間でしこしこやってたら、get_shiftメソッドは動くようになった。

帰ってきて家のPCでtimecardメソッドがある程度できてきたから、試しに動かそうとしたら、以下のエラー。
initialize': unknown OLE server: `Excel.Application' (WIN32OLERuntimeError)

家のPCにエクセルいないもんね。そりゃそうだ。。。
開発環境はCloud9を使って、試すときは1回ローカルに落としてってやってたけど、すぐに動作確認できないのは面倒だなぁ

1
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
1
1