備忘録的な何か

技術ブログ的な何かです

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"))で直接変換結果を実行できる。