2012年10月7日日曜日


○第169回目 エクセルマクロ、プログラムの構成表をつくる

 前回の『第168回目 QXマクロ、プログラムの構成をつくる』はQXマクロのため、一般的には、普及していないので、エクセルマクロでは出来ないかという声に対応したものです。

 QXマクロとエクセルマクロの違いとは、片や文書のようなデータをあつかうもの、片やセルに入っているデータを扱うものというところが、大きく違います。
 基本的(?)なコマンド群の差はないと思います。

 前回のQXマクロは、その文書を開いた状態で処理をしていましたが、エクセルマクロではこういうことができません。そこで、文書ファイル(テキストデータ)を扱うという方法で対応します。

 エクセルマクロの1つのマクロ(例えば、Subで定義されたもの)を、テキストファイルに保存します。
 Notepadなどのテキストエディタを起動して、貼り付け保存すればいいです。
 テキスト形式のファイルでは1行が1レコードということになります。次のレコードと区分けるのは、改行コード(半角2桁)です。

 処理は、次のような流れになります。
 0.入出力ファイル名は指定されているものとします。
 1.テキストファイル(入力)を開きます。テキストファイルのパス名が必要です。
 2.テキストファイル(出力)を開きます。パス名が必要です(1.のパス名+日付などとしてもいいでしょう)。
 3.1行ずつ読み込みます
 4.その行が必要な行かどうかを判断します。
 5.必要な行であれば、2.のファイルに出力します。
 6.2.から4.を繰り返します。
 7.ファイルの終わりになれば、2つのファイルを閉じます。
  8.処理結果を出力します。 
 
 新しく作られたテキストファイルが、抜き出されたコマンドだけのファイルとなります。
 

 この処理の基本コマンドは次の通りです。
 

 1.ファイルを入力系で開く。
   Open p_f_name_in0$ For Input As #1
   p_f_name_in0$ はパス名です。
 

 2.ファイルを出力系で開く。
   Open p_folder$ & "\" & f_name_out2$ & ".txt" For Output As #2
     p_folder$ はファイルを入れるフォルダ名です。
     f_name_out2$ はファイル名です。
     ".txt" は拡張子です。
   または、
   Open p_f_name_out$ For Output As #2
     p_f_name_out$ はパス名です。

 3.1行ずつ読み込みます
  これは do loop文で処理します。
   Do Until EOF(1)  'ファイルが終われば、do loop文を抜け出します。
     Line Input #1, aa$  'aa$には改行コードは含まれません。
     jj_cnt1 = jj_cnt1 + 1 '入力件数をカウントしています。
   
   【4.と5.の処理】
  
   Loop
 
 4.その行が必要な行かどうかを判断します。
   例えば、input文かどうかの判定。
   flag_out = 0
   p1 = InStr(aa$, "Input")
    If p1 <> 0 Then flag_out = 9
    ※行いたい処理を必要な分追加してください。
  
 5.必要な行であれば、2.のファイルに出力します。
    if flag_out = 9 then
      Print #2, aa$  'aa$に改行コードを付加して出力されます。
      jj_cnt2 = jj_cnt2 + 1 '出力件数をカウントしています。
    end if

 6.3.から5.を繰り返します。
    do loop文による繰り返し

 7.ファイルを閉じる。
   Close #1
   Close #2

  8.処理結果を出力します。 
 エクセルシートに、入力ファイル名、出力ファイル名、入出力件数などの処理結果を出力します。
  p1 = 4: pp1 = 0  'C4のセルから処理結果を打ち出します。
  Cells(p1 + pp1, 3) = " 処理ファイルは、『" & p_f_name_in2 & "』です。": pp1 = pp1 + 1
  Cells(p1 + pp1, 3) = " 出力ファイルは、『" & f_name_out2$ & "』です。": pp1 = pp1 + 1
  Cells(p1 + pp1, 3) = " 入力件数は、" & jj_cnt1 & "件です。": pp1 = pp1 + 1
  Cells(p1 + pp1, 3) = " 出力件数は、" & jj_cnt2 & "件です。": pp1 = pp1 + 1
  ※ファイル名からは、フォルダまでの部分、拡張子を除いています。
 
 

 ※この基本的なコマンド(8.を除く)は、QXマクロでもエクセルマクロでも同じで、両方共そのまま使えます。
 

0 件のコメント: