Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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回ローカルに落としてってやってたけど、すぐに動作確認できないのは面倒だなぁ

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away