LoginSignup
8
8

More than 5 years have passed since last update.

VBAのコメントに記述したrubyスクリプトを実行する

Last updated at Posted at 2014-07-11

以前に、複数の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スクリプト記載用シートがおかしな記述の場合のエラーチェックもないので、使用するときは注意が必要。

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