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>