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マクロでもエクセルマクロでも同じで、両方共そのまま使えます。
登録:
コメントの投稿 (Atom)

0 件のコメント:
コメントを投稿