13 Apr 2014, 06:51

ExcelVBA統合BDD開発環境をrakeでまとめてみた

ExcelVBAで統合BDD開発環境を構築したメモです。

この記事は以下の記事の続きです。

機能

開発環境というところが指す意味は、 rakeをつかってVBA開発で役立つ機能をまとめたということです。

以下のような機能が実装済み。


rake clean    # Remove any temporary products.
rake clobber  # Remove any generated file.
rake export   # export all files to specified dir
rake hide     # Hide Excel
rake import   # import All Modules
rake open     # Open or Connect Excel File
rake release  # Make releasee excel file
rake save     # Save Excel File
rake show     # Show Excel
rake spec     # Run All Tests
rake step     # Count Steps in Project
rake vbe      # Open Visual Basic Editor for Application

rakeからExcelマクロを実行する

<div class="outline-text-3" id="text-1-1">
  <p>
    ruby の win32oleを利用して、Excelのマクロを実行するところがこのツールのキモ。
  </p>

  <pre><code>@book.run("ShowTotalCodeLinesInProject")

  <p>
    こんな感じで、runメソッドをつかって実行する。
  </p></p>
</div></p>

BDD実行エンジン

<div class="outline-text-3" id="text-1-2">
  <p>
    実は、VB Lite Unitが会社の環境では使えなかった。おそらく、Excelが64bit版なことが原因。 ということで、代替手段を探したところ、コンナツールを発見。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/timhall/Excel-TDD">timhall/Excel-TDD</a>
    </li>
  </ul>

  <p>
    記法がRSpecに似ていて、しかも純VBAで書かれている。これを採用。
  </p>

  <p>
    これと、VBAコードの import/export機能の組み合わせによって
  </p>

  <ol class="org-ol">
    <li>
      Emacsで編集
    </li>
    <li>
      rake spec -> Excelにコードがインポートされてテスト実行
    </li>
    <li>
      イミディエイトウィンドウで結果を確認。
    </li>
    <li>
      バグってたらデバッガでステップ実行とか
    </li>
    <li>
      テストが成功したら、rake exportしてgitにcommit
    </li>
  </ol>

  <p>
    というTDDサイクルを回すことができるようになった。
  </p>

  <p>
    Excelを起動していない状態で rake specを実行すると、 メモリ不足でテストが実行できないというバグがある。(というより解消方法がわからない) rake openしたあとに、一旦 rake saveをすることで回避できる。
  </p></p>
</div></p>

フォルダ構造

<div class="outline-text-3" id="text-1-3">
  <p>
    src/spec/helperの3つに分けた。
  </p>

  <p>
    生産物はsrcにいれる。テストコードは specフォルダに入れる。helperはお助けツール。
  </p>

  <p>
    specの命名規則はxxx_specとする。 ファイル名が_specかどうかでテストコードを判定しているので。 本当はもっと設定ファイルとかで設定させたいけど、そのうち。
  </p></p>
</div></p>

コード

Environment

<div class="outline-text-3" id="text-2-1">
  <ul class="org-ul">
    <li>
      Windows 7 64bit
    </li>
    <li>
      Excel 2010
    </li>
  </ul>

  <p>
    ツールバーから 参照設定を選択肢、以下を追加する必要あり。
  </p>

  <ul class="org-ul">
    <li>
      Microsoft Visual Basic for Application Extention
    </li>
  </ul>
</div></p>

12 Apr 2014, 17:07

ExcelVBAのステップ数をカウントする

Excel VBAのステップ数を数えるツールを探そうとおもったけれども、勉強のために自作してみる。

[toc]

ステップ数を数える方法について

ソースコードから以下の情報を得たい。

  • 全体のステップ数
  • 実行ステップ数
  • コメント行
  • 空白行

こんな出力結果を得たい。


--------------------------
  FileName    Exxecute
--------------------------
 hogehoge.cls       10
 hugahuga.bas       10
--------------------------
 Sum                20
--------------------------

サンプルを探してみた。以下のサイトのコードが良さそうだ。

テンプレートエンジンをつかってみる

テンプレートエンジンについて

<div class="outline-text-3" id="text-2-1">
  <p>
    テンプレートエンジンとは、データとテンプレートからドキュメントを作成するもの。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3">テンプレートエンジン &#8211; Wikipedia</a>
    </li>
  </ul>

  <p>
    VBAで利用できるテンプレートエンジンは、「Mini Templator」が唯一の選択肢のようだ。
  </p>
</div>

Mini Templatorについて

<div class="outline-text-3" id="text-2-2">
  <p>
    Mini TemplatorはHTML用のテンプレートエンジン。 VBAだけではなくて、Java, PHPでもつかえる模様。オープンソース。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.source-code.biz/MiniTemplator/">MiniTemplator &#8211; A compact template engine for HTML files</a>
    </li>
  </ul>

  <p>
    上記サイトからVBA用のファイル一式をダウンロード。 なかにあるMiniTemplator.clsをインポートする。
  </p>

  <ul class="org-ul">
    <li>
      MiniTemplator_vbasic.zip <ul class="org-ul">
        <li>
          MiniTemplator.cls
        </li>
      </ul>
    </li>
  </ul>

  <p>
    ドキュメントは以下。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.source-code.biz/MiniTemplator/vbasic/MiniTemplator.htm">MiniTemplator Class API Documentation</a>
    </li>
  </ul>
</div>

Mini Templatorのつかいかた

<div class="outline-text-3" id="text-2-3">
  <p>
    キホンは以下の4ステップ
  </p>

  <ol class="org-ol">
    <li>
      テンプレートエンジン生成
    </li>
  </ol>

  <pre><code>  Dim templator As New MiniTemplator

  <ol class="org-ol">
    <li>
      テンプレート読み込み
    </li>
  </ol>

  <pre><code> templator.ReadTemplateFromFile STEPCOUNTE_TEMPLATE_PATH

  <ol class="org-ol">
    <li>
      データ入力
    </li>
  </ol>

  <p>
    3.1 変数代入 3.2 ブロック代入
  </p>

  <pre><code>    templator.SetVariable "filename", vbcComp.Name
templator.SetVariable "execute", vbcLine
templator.SetBlock "file"</code></pre>

  <ol class="org-ol">
    <li>
      データを文字列 or ファイルに出力
    </li>
  </ol>

  <pre><code>  Debug.Print templator.GenerateOutputToString</code></pre>
</div>

テンプレートを用意

<div class="outline-text-3" id="text-2-4">
  <p>
    こんな感じでテンプレート用意。
  </p>

  <pre><code>-------------------------

FileName} Execute

${filename} ${execute}

————————-

Sum ${execute}

————————-

コード

<p>
</p>

<h3 id="sec-2-6">
  出力結果
</h3>

<div class="outline-text-3" id="text-2-6">
  <p>
    ずれずれ・・・もともとがHTMLようなので、フォーマット出力なんて考えてないようだ。
  </p>

  <p>
    テキスト出力はつらい。
  </p>

  <pre><code>-------------------------

FileName} Execute

ThisWorkbook 39 Sheet2 0 Calc 3 Calc_spec 11 FileManager_spec 47 InlineRunner 112 MiniTemplator 608 SpecDefinition 62 SpecExpectation 164 SpecRunner 4 SpecSuite 42 StepCounter 64

FileManager 129

Sum 1285

printf的なものはないかな

C言語でのprintfにあたる機能がVBAにないものか、と探したらあった。

このツールが良さそうだ。

上記からダウンロードして、PrintF.basをインポート。

使い方も、C言語のprintfと同じ。

コード

<p>
</p>

<h3 id="sec-3-2">
  出力結果
</h3>

<div class="outline-text-3" id="text-3-2">
  <p>
    完璧、素晴らしい。
  </p>

  <pre><code>-----------------------

FileName Execute

ThisWorkbook 39 Sheet2 0 Calc 3 Calc_spec 11 FileManager_spec 47 InlineRunner 112 MiniTemplator 608 mdlPrintF 282 SpecDefinition 62 SpecExpectation 164 SpecRunner 4 SpecSuite 42 StepCounter 51

FileManager 129

Sum 1554

Special Thanks

<div class="outline-text-3" id="text-3-3">
  <ul class="org-ul">
    <li>
      <a href="http://d.hatena.ne.jp/lam_bda/20081124/1227502941">会社でRuby使用禁止になったのなら、VBAでテンプレートエンジンを使えばいいじゃない &#8211; ランバダ</a>
    </li>
    <li>
      <a href="http://wasuke.shioya.jp.net/archives/=344">MiniTemplator VBAで使えるテンプレートエンジン &#8211; わすけのブログわすけのブログ</a>
    </li>
    <li>
      <a href="http://www.1stdegree.co.jp/blog/yokomaku/archives/=103">横のマーク &#8211; EXCELのVBAでsprintf</a>
    </li>
  </ul>
</div>

12 Apr 2014, 12:37

ExcelVBAのコードをimport/exportする

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

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

などなど。

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

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

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

苦労した点とか

Rubyの win32oleがつかえなかった

<div class="outline-text-3" id="text-1-1">
  <p>
    はじめはRubyでやっちゃえと思ったけど、どうもwin32oleではメソッドがみつからなかった。
  </p></p>
</div></p>

Excel Objectについて

<div class="outline-text-3" id="text-1-2">
  <p>
    標準モジュール、クラスモジュールはImpot/Exportができるのだが、 ThisWorkbookやSheetなどのExcel Objectはそれができない。 これらは、行の削除と挿入で対応した。
  </p>

  <pre><code>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

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

<div class="outline-text-3" id="text-1-3">
  <p>
    VBAで書くと、自分自身のコードをimport/exportすることができない。
  </p>

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

Environment

<div class="outline-text-3" id="text-1-4">
  <ul class="org-ul">
    <li>
      Windows 7 64bit
    </li>
    <li>
      Excel 2010
    </li>
  </ul>

  <p>
    </div>
  </p>
</div></p>

最後に

<div class="outline-text-2" id="text-2">
  <p>
    このベージの解説が素晴らしい。本当に、Special Thanks.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://rsh.csh.sh/text-scripting-vba/">vi で書こう VBA — Text Scripting on VBA</a>
    </li>
  </ul>
</div></p>

05 Apr 2014, 11:33

EmacsでのExcel VBA開発環境を構築

Excel VBAなどの開発環境は、たいていVisual Basic Editorです。

しかし、なんでもEmacs上でやらないと病気になってしまう、 もやしな人間たちにとってはEmacsでVBAが書きたいところ。

というわけで、無謀にもEmacsでVBAの開発がでいないものか、調べてみました。

[toc]

visual-basic-mode.el

visual-basic-mode.elというものを見つけました。

emacswikiからダウンロードして、ロードパスの通った場所に配置します。init.elにも以下を記述。

 (autoload 'visual-basic-mode "visual-basic-mode" "Visual Basic mode." t)
 (setq auto-mode-alist (append '(("\\.\$latex frm\\|bas\\|cls\$$" .
                                 visual-basic-mode)) auto-mode-alist))

VBAのファイルがハイライト表示される。

text-scripting-vba

Excel VBAのコードのインポート・アウトポートを簡単にできる。そうすると、

  • ViやEmacsでコードがかける
  • バージョン管理ができる
  • TDDでコーディングができる

と、いろいろなメリットがある。

本サイトは、以下。

使い方

<div class="outline-text-3" id="text-2-1">
  <p>
    xlsm拡張子のExcelデータを新規作成。test.xlsm
  </p>

  <p>
    開発タブからVBE起動(Alt+F11でも)。 開発タブはデフォルトで隠されているので、表示されていなければオプションから表示させる。
  </p>

  <p>
    ツールバーのファイル -> インポートを選択。 以下から落としてきたThisWorkbook.clsをインポート。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/tcsh/text-scripting-vba">tcsh/text-scripting-vba</a>
    </li>
  </ul>

  <p>
    ちなみに、文字コードがUTF-8なので、Shift-Jisに変換したほうがよい。変換方法は以下。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/1331">Cygwinにnkfをインストールして文字化け攻略する! | Futurismo</a>
    </li>
  </ul>

  <pre><code>nkf -s ThisWorkbook.cls > ThisWorkbook_sjis.cls

  <p>
    ExportThisNotebokとReloadModuleのマクロが追加される。
  </p>

  <p>
    標準Moduleに追加されるので、その内容をThisWorkBookに切り取り・貼り付けをする。
  </p></p>
</div></p>

コードを書く

<div class="outline-text-3" id="text-2-2">
  <p>
    サンプルとしてコンナコードを書く。./src/hello.bas
  </p>

  <pre><code>Sub Hello()

MsgBox (“Hello VBA”) End Sub

  <p>
    libdef.txtを作成。ここに読みこむソースのパスを相対パスで記述。
  </p>

  <pre><code>./src/hello.bas

  <p>
    マクロ(F5 or Alt+F8)のReloadModuleを実行すると、 先ほど作成したhello.basが取り込まれる。
  </p>

  <p>
    こんなふうにすれば、Emacsで編集して取り込んでテストということが可能。
  </p></p>
</div></p>

VB Lite Unit

VBAで TDDを実施するためのツールとして、VB Lite Unitがある。

詳しくは過去記事参照。

vbasense.el

vbasenseなるものは、オムニ補間ができるとのこと。Special Thanks.

el-getからインストールします。init.elにも以下を追加。

(require 'vbasense)

;; キーバインド
(setq vbasense-popup-help-key "C-:")
(setq vbasense-jump-to-definition-key "C->")

;; 必要に応じて適宜カスタマイズして下さい。以下のS式を評価することで項目についての情報が得られます。
;; (customize-group "vbasense")

;; 推奨設定を行う
(vbasense-config-default)

M-x vbasense-load-libraryを実行したときに、 [VBASense] Not yet regist TLBINF32.DLLというエラーがでることがある。

ただし、自分の環境ではどうも動かし方がわかりませんでした。 TLBINF32.DLLの登録方法がわからずに導入は挫折、残念。

windows7 64bitだと、ダメなのかな?

C:\Windows\SysWOW64>regsvr32.exe TLBINF32.DLL

vbasense-tli-filesに自分の環境のパスを変更しても、うまくパスをみつけてくれない。 chkTLI.vbsをNop応答にして、だましで少しつかってみる。

Excelenium

この記事とはまったく関係ないけれども、このツールがとてもおもしろそうなので、memo。

ExcelとSeleniumを組合せたもので、Excelのテスト仕様書からSeleniumを実行できる。しかも、OSSとか。

07 Jan 2013, 11:54

TweetConsoleを使って、デスクトップからホットキーでtweetする

前回、twitcurlライブラリを利用した自作twitterクライアントでつぶやく方法を書いた。

フリーソフトで、この手のコマンドプロンプトからtwitterを利用するツールはけっこうあるらしく、その中で一つ『TweetConsole』とVBSを組み合わせたTipsを紹介。

TweetConsoleの詳細情報 : Vector ソフトを探す!

 

 

はじめに、twitterの認証が必要(これは、twtcnsl.exeを実行して認証する)

一度認証すれば、あとは認証は必要なく利用できる。

TweetConsoleでつぶやく方法は以下。twtcnslが実行コマンドで /tがオプション。

twtcnsl /t テスト投稿です

ダウンロードしたtwtcnsl.exeをどこかに移動して、前回作ったVBSを少し書き換える。

Program Filesみたいに、パス名に空白が入ると実行できない。

https://gist.github.com/4466704

06 Jan 2013, 10:41

twitcurlでWindowsのデスクトップからホットキーでtwitterにtweetする

はじめに

デスクトップからショートカットでtwitterにつぶやきたいなと思い、いろいろと探してみたがいいフリーソフトがみつからなかったので、twitCurlというC++用のtwitterライブラリを利用して、作ってみました。

[http://www.youtube.com/embed/2FhRoTXbpHM]

 

環境

  • Windows 7 64bit
  • Cygwin 1.7.17-1
  • curlツꀀツꀀツꀀツꀀツꀀ 7.28.1-1

twitcurlを使う

twitcurl – twitcurl is a pure C++ twitter API library based on cURL – Google Project Hosting

twitcurlとは、twitter API用のC++ライブラリ。

これを使えば、C++のソースからtwitter APIを叩くことができる。

twitcurlの導入

twitcurlの導入方法は以下が詳しい

今回は、Windows上のcygwin環境で試してみたので、Linuxの方を参考にした。

まずは、事前にg++,libcurl4-dev, subversion を setup.exeを使って取得しておく。

Curlというのは、ファイル転送用プロトコルをサポートするライブラリで、コレを利用して、HTTPをコマンドラインから利用するらしい。

次に、libtwitcurlをsvnコマンドで取得。

svn co http://twitcurl.googlecode.com/svn/trunk/libtwitcurl

subversionがないと、ソースを取ってこれない。

取得後に、libtwitcurlに移動して、makeコマンドでコンパイルをかける。

libtwitcurl.so.1.0という共用ライブラリが作成されるのでこれを/usr/lib/配下にlibtwitcurl.soとリネームしてコピーする。

mv libtwitcurl.so.1.0 /usr/lib/libtwitcurl.so

サンプルコード改造してつぶやき専用クライアント作成

つぎに、twitcurlのサンプルコードを改造してみて、つぶやき専用にした。

サンプルコードは以下のように持ってこれる。

svn co http://twitcurl.googlecode.com/svn/trunk/twitterClient

こんな感じで改造(というよりも、いらない部分を削除したという方が正しい)

ユーザ名とパスワードを変更する。

デスクトップからtwitterにアクセスするためには、以下の4つのキーの取得が必要。

  • ConsumerKey
  • ConsumerSecuret
  • AuthAccessTokenKey
  • AuthAccessTokenSecret

取得方法はドットインストールで学習した。

コンパイルをかけて実行

コンパイルをかける。

g++ quicktweet.cpp -o quicktweet -l/usr/lib/twitcurl

-ltwitcurlをコンパイルオプションにつければコンパイルできる。

(libtwitcurl.soだけと、libと.soはいらない。自分の場合、どうもパスの通し方がわからないので、フルパスでリンクさせた)

実行するときに、共用ライブラリlibtwitcurl.so.1.0を実行するディレクトリに持ってきておく。Cygwinの場合、共用ライブラリを実行するためには、PATHにlibtwitcurl.so.1.0かあるディレクトリの環境変数を通しておく必要があるけれども、面倒臭いで横着した。

quicktweet.exeにつぶやきたい言葉を渡して実行するとつぶやけた。

VBSからtwitterクライアントを呼び出す

次に、VBScriptからquicktweetを実行できるように、VBScriptを作成。

メッセージボックスを表示させて、メッセージを入力してEnterを押すと、メッセージがquickktweetの引数として渡される。

https://gist.github.com/4466455

VBSにショートカットキーを割り当てる

VBSをホットキーから実行できるようにする。

作成したVBSのショートカットをデスクトップか、[スタートメニュー] > [すべてのプログラムで右クリック] > [開く]を選択して、スタートメニューのフォルダに作成する。

ショートカットを右クリックして、プロパティを選択。

ショートカットの欄で、好きなショートカットを入力する。

ここでは[Ctrl + Shift + T]を割り当てた。

これで、デスクトップのどこからでもつぶやけるようになった。

これで 、お手軽にツꀀ Let’s Tweet。

05 May 2012, 12:45

Outlookでタスクシュ-ト2

前回に続き、タスクシュ-ト機能の表示改善。

その1. 一日の予測時間と実働時間の表示改善

その2. 実施中のタスクの予測時間と実働時間の表示改善

まだまだハックしたりないけれど、とりあえずこんなところでゴ-ルデンウィ-クの目標は達成。

VBAの使い方がなんとなくわかったよ。

05 May 2012, 10:13

VBA で TDDできるか調べてみた

1 はじめに

VBA で TDDできるか調べてみた.以下の3つがあるらしい

  • VBAUnit
  • VB Lite Unit
  • xlUnit

Outlookでも使えそうな VB Lite Unit を使ってみる。

2 使い方

前提として Visual Basic 6.0 Runtime Liblaryが必要。とりあえずよくわからないのでパス。

  1. ダウンロードしたものを、ハ-ドディスクの適当な場所に保存
C:\Windows\VbLiteUnit
  1. スタートメニュ「ファイル名を指定して実行」より
regsvr32.exe “C:\Windows\VbLiteUnit\VbLiteUnit.dll”

(管理者権限で実行しないと失敗した)

3.Outlookから VBEを開き、ツ-ルバ-から[ツ-ル] > [参照設定] を選択 4.表示されたダイアログボックスの中からVBLiteUnitを選択

5.デモソ-スをダウンロード

6.[ファイル] > [ファイルのインボ-ト]でデモソ-スをインポ-ト

  1. サンプルソ-スのtclsTestClauseTextを実行

表示のタブからイミディエイトウィンドウを起動。 入力コンソールに以下を打ち込んで実行。RunTests New (クラス名)で実行する。

RunTests New tclsTestClauseText

ただ、自分でテストコ-ドを書く方法はちょっと難しそうなので、また今度

2.1 参考リンク

<div class="outline-text-3" id="text-2-1">
  <ul class="org-ul">
    <li>
      <a href="http://d.hatena.ne.jp/miau/20110301/1298935505">http://d.hatena.ne.jp/miau/20110301/1298935505</a>
    </li>
    <li>
      <a href="http://blogs.yahoo.co.jp/mummykinoi/63579957.html">http://blogs.yahoo.co.jp/mummykinoi/63579957.html</a>
    </li>
    <li>
      <a href="http://kawakawa2000.jugem.jp/?eid=22">ExcelマクロでTDDをやってみよう! | プログラマーの外部記憶箱</a>
    </li>
  </ul>
</div></p>

30 Apr 2012, 23:19

Outlookのタスクをショ-トカットから生成するマクロ

Outlookのタスクをショ-トカットから生成するVBScriptを作った。

参考にしたのはこのペ-ジ

http://www.ken3.org/cgi-bin/group/vba_outlook_Task.asp

上記リンクのスクリプトを少しカスタマイズした。

具体的には

  • 分類項目にInboxを割り当てる機能を追加
  • ツꀀ開始日や期限の割り当てを解除
  • タスク件名を入力するメッセ-ジで[ GTD Prosess Start!!]と表示

さらにvbsのショ-トカットにショ-トカットキ-を割り当てて(Ctrl+Alt+Tとか)

どこからでも起動できるようにした。

ショ-トカットキ-を起動するにはショ-トカットをデスクトップかスタ-トメニュ-に置かなければいけないらしい。

http://support.microsoft.com/kb/134552/ja

デスクトップに置くのは自分の美学が許さないので??

[ スタ-トメニュ-] > [すべてのプログラム]を右クリックして、その先の[プログラム]の下にショ-トカットをセット。

これで頭に浮かんだアイデアを即座に Outlookという GTD システムへキャブチャ-できる。