以前に、複数のExcelが起動しているときにrubyのWIN32OLEで特定のブックを操作するなんて記事や
vbaさようなら、rubyこんにちは。なんてブログを書いたんですが。今回、以下の記事にインスピレーションを受けて、新たな実行方法の模索をしました。
上記記事中ではVBScriptを使用して、Excel VBAのソースコードをテキストファイルに出力し、そのファイルをDoxygenに読み込ませることでドキュメントの出力を行っています。
ということは、Excel VBAに記述したrubyスクリプトをテキストファイルに出力し、そのファイルをrubyに読み込ませることでスクリプトを実行できるようになるはず。
考え方としては、以下の流れ
- rubyスクリプト記述用シートを一枚用意し、マクロにコメント行としてrubyスクリプトを記述する。
- 別シートのマクロで記述用シートに記載したコメントを読出し、rubyスクリプトをファイルに落とす。
- Shellコマンドでruby スクリプトをrubyで実行する
以下サンプルマクロ
rubyスクリプト記述用シートのマクロ(Sheet1)
' puts 'Hello world'
' gets
標準モジュール(Module1)
Option Explicit
'* rubyスクリプトを抽出し実行する
Public Sub ExecuteRuby()
Dim rbfile As String
rbfile = "testfile.rb"
Call CreateRubyFile(rbfile, "Sheet1")
Call Shell("ruby " + rbfile, vbNormalFocus)
End Sub
'* rubyスクリプト用シートからスクリプトを抽出する
'* @param[in] rbfile rubyスクリプトファイル名
'* @param[in] sheetname rubyスクリプト記述用シート名
'*
Private Sub CreateRubyFile(rbfile As String, sheetname As String)
Dim fso
Dim fo
Dim cdm
Dim codes
Dim i
Application.DisplayAlerts = False
Set fso = CreateObject("Scripting.FileSystemObject")
Set fo = fso.CreateTextFile(rbfile, True)
Set cdm = ThisWorkbook.VBProject.VBComponents(sheetname).CodeModule
If cdm.CountOfLines > 0 Then
codes = Split(cdm.lines(1, cdm.CountOfLines), vbCrLf)
' rubyスクリプト記述用シートから一行ずつファイルに落とす
' 行の初めがシングルクオテーションで始まっていると仮定して
' 動作する為、コメント行以外の記述があるとバグる
For i = 0 To cdm.CountOfLines - 1
fo.WriteLine (Mid(codes(i), 2, Len(codes(i))))
Next i
End If
fo.WriteLine ""
fo.Close
Set cdm = Nothing
Set fo = Nothing
Set fso = Nothing
End Sub
CreateRubyFile() にrubyスクリプトファイル名とrubyスクリプト記載用シートを渡した後、rubyスクリプトファイル名でrubyを実行すれば実行できる。ただし、ファイルが正しく生成されているかどうかのチェックもなければ、rubyスクリプト記載用シートがおかしな記述の場合のエラーチェックもないので、使用するときは注意が必要。