![][1]

Excel VBAの最大の課題が、保守性。 Excelの中にコードが縛られている。このコードを外に出すと、

  • バージョン管理ができる
  • VimやEmacsなどのエディタで開発できる
  • テスト駆動開発できる

などなど。

レガシーなExcelVBAもバージョン管理、テスト、自動化という 現代ソフトウェア開発の三種の神器に従って開発ができる。

調べてみると、同じようなことを考えている人たちがいた。

これらの方法を利用してもいいのだが、 現在VBA絶賛勉強中のため、自分の学習も兼ねて、 VBAのコードをExcel内からimort/exportするコードを書いてみた。

Rubyの win32oleがつかえなかった

はじめはRubyでやっちゃえと思ったけど、どうもwin32oleではメソッドがみつからなかった。

Excel Objectについて

標準モジュール、クラスモジュールはImpot/Exportができるのだが、 ThisWorkbookやSheetなどのExcel Objectはそれができない。 これらは、行の削除と挿入で対応した。

Private Sub InsertLines(myFile As String)
  Dim myFSO As New FileSystemObject
  Dim myBaseName As String: myBaseName = myFSO.GetBaseName(myFile)
  
  With ThisWorkbook.VBProject.VBComponents(myBaseName).CodeModule
    .DeleteLines StartLine:=1, count:=.CountOfLines
    .AddFromFile myFile
    
    ' Delete header lines
    .DeleteLines StartLine:=1, count:=4
  End With

  Set myFSO = Nothing
End Sub

自分で自分をリロードできない

VBAで書くと、自分自身のコードをimport/exportすることができない。

なので、ThisWorkbookとFileManagerという二種類のファイルに処理を分けて 2段階でインポートすることにした。

Environment

  • Windows 7 64bit
  • Excel 2010

最後に

このベージの解説が素晴らしい。本当に、Special Thanks.