ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

仕様書からプログラムソースを生成する方法(Excelの仕様書編 その4:マクロ説明)

2006-10-27 17:41:21 | ケータイ

シリーズ仕様書からプログラムソースを生成する方法のつづきです。

 前々回、マクロを公開し、前回、そのマクロをExcelに貼り付けて、生成させる方法について書きました。今回は、その前々回公開したマクロの説明です。




■マクロの関数の概要
 このマクロには、3つのサブルーチン(Sub)または、ファンクション(function)があります。

(1)ボタンから起動されるサブルーチン(shiyoToFile)
(2)雛形ファイルと仕様書を読み込んで、自動生成する(makefile)
(3)制御内容ごとの処理(chgTagToStr)

 (1)から、(2)が呼び出され、(2)から(3)が呼び出されます。
 (1)は、仕様書によっては、書き換わります。

 以下、それぞれの関数を説明します。



■(1)ボタンから起動されるサブルーチン(shiyoToFile)

 ここでは、以下の処理をします。

(1-1)前処理
     (2)のプログラムは、固定化するため、
     (2)で処理できるようにするため、
     前処理を行う

(1-2)(2)のプログラムを呼び出す

(1-3)後しまつ
     (1-1)でシートやファイルを作成したら、
     削除します。

 今回は、(1-1)、(1-3)が必要ないので、(1-2)だけ行います。
Call makefile(雛形ファイル名,シート名,出力ファイル名)

 です。



■(2)雛形ファイルと仕様書を読み込んで、自動生成する(makefile)
 makefile(雛形ファイル名,シート名,出力ファイル名)というカタチの
サブルーチンです。内容は、以下のとおり

(2-1)雛形ファイルを読み込みます
   indataに、ファイル内容を全部入れます。

(2-2)書き出し内容を作成します
   ・indataの開始ポイント(str_pos)を1、
    (VBAにおいて、文字列の先頭は0でなく、1)
    出力内容を(outdata)を空文字("")として
   ・制御内容のタグ$#$があるかないかチェックします **
   ・あったら、
      前回のタグの終わりから、今回のタグまでoutdataにセットし、
      制御内容部分を切り出し
      chgTagToStrで制御内容を処理します
       →この内部でoutdata(書き出し内容)をセットします
       →chgTagToStrは、次の開始ポイント(str_pos)を返します
      **に戻ります
   ・**のループが終わったら、残り部分をoutdataにセットします

(2-3)作成データを書き出します
  ・まず、書き出しファイルがあったら削除し
    ここが、変な風になっているのは、<>っていうのを書くと、
    変換しないといけないので、面倒だからというだけで深い意味はないです
  ・書き出します   
 


■(3)制御内容ごとの処理(chgTagToStr)
chgTagToStr(制御内容,次の開始ポイント候補,仕様書のシート名)というカタチの
ファンクションです。返り値は、次の開始ポイントです。

内容は、制御内容が、それぞれのタグだったら、それにあった内容をします。
こんなかんじ

(3-1)制御コードが"REPEND"だったら、
  仕様書チェック行(lpgyo)を次の行にして(1足す)
  そこの行の指定箇所が空白だったら
    ループ終わりなので、引数の次の開始ポイント候補を返す
  そうじゃない(まだ行続く場合)
    ループするため、ループ開始ポイント(lpstr_pos )を返す

(3-2)制御コードが"REP"だったら、
  仕様書チェック行(lpgyo)を取得
  ループするためのループ開始ポイント(lpstr_pos)を、セット
   →この制御コードの終わりの次の文字
        =次の開始ポイント候補にする
  引数の次の開始ポイント候補を返す

(3-3)制御コードが"CELL"だったら、
  指定箇所を、出力データ(outdata)に追加して
  引数の次の開始ポイント候補を返す

(3-4)制御コードが"KETA"だったら、
  現在行の指定桁を、出力データ(outdata)に追加して
  引数の次の開始ポイント候補を返す


*"REPEND"を先に聞き、"REP"をあとに聞く理由は、
 先に"REP"を聞いてしまうと、そこに"REPEND"も
 引っかかってしまうからです("REP "で聞けばいいんだけどね)

**今後、ここに条件文IFが追加される予定です




こんなかんじです。
人に、「同じプログラムを使えば枯れるから」とかいっておきながら、
実はこのプログラム、よく作るんだけど、いつも即興で作ってしまっていて、
今回も、即興でつくったので、バグとかもあるかも。。
あったらごめんなさい。

では、今回はここまで。


この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ソフトバンクとウィルコムで... | トップ | YOU TUBEの著作権違... »
最新の画像もっと見る

ケータイ」カテゴリの最新記事