Excel VBA To Ruby Converter
手抜きプログラムシリーズ。
Excel VBAが吐き出したコードをRubyのWin32ole対応のコードに変換するスクリプトを作成した。やっぱ、ExcelやるならRubyでしょ的な。
https://www.dropbox.com/s/jw51apxtrgjle3k/vba2ruby.rb
基本的な文法(SubとかWithとかForとか)は変換できるが、LEFTとかMIDとかの関数の変換は面倒なので対応していない。
実装は、オープンクラスを結構している&超絶適当な正規表現置換でお察しな感じ。
簡単に説明すると、
・withはinstance_evalで解決。
・他構文は頑張って変換。(ここ参考。http://slingfive.com/pages/code/scriptConverter/)
・大文字変数は、snakecaseに変換。
・名前付き引数はHashに変換。
・全体を WIN32OLE.connect('#{path}').Application.instance_eval do |_| で囲むことで、Applicationオブジェクトのメソッドをグローバル化。
・後は、ほそぼそした対応。手前に、_.付けたり、()つけたり。
どんな感じになるかというと、
require './vba2ruby.rb'
WIN32OLE.convert_vba_to_ruby(s,"C:\\hoge.xls") #sはvbaコード
を実行すると、
Range("C9").Select
ActiveCell.FormulaR1C1 = "fd"
Range("C9").Select
With Selection.Font
.Color = -16776961
.TintAndShade = 0
End With
が
WIN32OLE.connect('C:\hoge.xls').Application.instance_eval do |_|
Range("C9").Select
ActiveCell().FormulaR1C1 = "fd"
Range("C9").Select
with Selection().Font do |_1|
_1.Color = -16776961
_1.TintAndShade = 0
end
end
となる。単純な変換とは行かなくて、()がついたり、_1がついたりしている。(大文字メソッドは括弧を抜いてしまうと定数と判断されてしまう...)
あと、connectなので、対象のエクセル(上記だと、C:\\hoge.xls)を開いてる状態で実行する必要あり。
eval(WIN32OLE.convert_vba_to_ruby(s,"C:\\hoge.xls"))で直接変換結果を実行できる。