<FreeFile関数で空いてるファイル番号を返す方法>
こんにちは、三流プログラマーKen3です。 今回は、 空いてるファイル番号を返す FreeFile関数 を使ってみます。 気楽に読んでください。 /* * 1. 今までの流れ */ 前回、まで、 テキストファイルの関係をいろいろとやりました。 No.27 テキストファイル処理 ファイルへの書き込み /vba/backno/vba027.html Open Close Print # No.29 テキストファイル処理 ファイルからの読み込み /vba/backno/vba029.html Line Input # Eof関数 No.31 Write #で ””を付けた書き込み /vba/backno/vba031.html Write # と来て、で今回は、 Open 〜 AS #1,Close #1,Print #1 や Write #1 と固定のファイル番号1を使っていたところを、 FreeFile関数を使って空いている番号を取得し使用するをテストしてみたいと思います ~~~~~~~~~~~~ /* * 2.FreeFile関数の使い方 */ FreeFile関数 ~~~~~~~~~~~~ 主な目的は、空いているファイル番号を問い合わせて、 三流君の好きな固定番号処理、ファイル番号を重複して使うのを防ぐかなぁ。 前回、ファイルの書きこみテストで、Writeを使用しました。 Sub test031_6() Dim strFNAME As String 'ファイル名格納用 'ブックと同じ位置にtest031-6.txtを作成する strFNAME = ThisWorkbook.Path & "\test031-6.txt" 'ファイル名の作成 Open strFNAME For Output As #1 'ファイル番号1で新規作成 'テストデータ書き込み、 Write #1, "こんな感じかぁ、なんかなぁ" Write #1, Range("A1").Value '決り文句A1セル文章を出力 Print #1, Now & "に作成したファイルです" Print #1, "終わりです" Close #1 '開いたら閉じようね '終了メッセージの表示 MsgBox strFNAME & "を作成しました、確認してね" End Sub これくらいの小さなプログラムだと、あまり問題にならないのですが(本当かおい?) 基本的には固定処理はやめたほうがいいので、 この機会にFreeFile関数を覚えて、使ってみてください。 使い方は簡単で、 ^^^^^^^^^^^^^^ Sub test033_1() Dim strFNAME As String 'ファイル名格納用 Dim nFNO As Integer 'ファイル番号 'ブックと同じ位置にtest033-1.txtを作成する strFNAME = ThisWorkbook.Path & "\test033-1.txt" 'ファイル名の作成 nFNO = FreeFile() '空いているファイル番号をもらう Open strFNAME For Output As #nFNO '受け取った番号で新規作成 'テストデータ書き込み、 Write #nFNO, "こんな感じかぁ、なんかなぁ" Write #nFNO, Range("A1").Value '決り文句A1セル文章を出力 Print #nFNO, Now & "に作成したファイルです" Print #nFNO, "終わりです" Close #nFNO '開いたら閉じようね '終了メッセージの表示 MsgBox strFNAME & "を作成しました、確認してね" End Sub '---- nFNO = FreeFile() '空いているファイル番号をもらう ~~~~~~~~~~~~~~~~~ で、OKです。 なんだぁ、1固定のとこが変数になっただけですねぇ、 *値をFreeFileで取ってきただけですね。 #1の方がわかりやすいし、 入出力ファイルの数なんて覚えてるし、1から順にふってけば、 FreeFileなんて使わなくっていいよ なんて言う人はいないと思いますが(テストプログラムなら#1でいいと思いますよ) /* * 3.固定のファイル番号が好きな人達の災難 */ いつもの架空の小話に少しお付き合いください。 頼み方の悪いA先輩が新人のB君に、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ String型でID番号、 String型で氏名、 String型で格納場所ドライブ付き後ろ¥ を渡すから、 受け取った場所+ID.txtファイルを新規で作成し、 1行だけID,氏名のデータを書いたファイルを作ってほしいんだぁ。 B君は確認で先輩に、 関数 XXXX(id as string, strNAME as string, strDIR as string) で、3つ変数を受け取り たとえば、 idにA100、氏名に三流君、格納場所にC:\Temp\ と入っていたとしたら、 C:\Temp\A100.txtを作成して、 1行目に A100,三流君 でいいんですね。 先輩は、OKそれで頼むよ。(おっ、話が通じるいい後輩だ?) なんて簡単なやり取りがあったとして。 新人君は、 下記のプログラムを作成した。 Sub MakeDataFile(strID As String, strNAME As String, strDIR As String) Open strDIR & strID & ".TXT" For Output As #1 'ファイルを新規作成 Print #1, strID & "," & strNAME 'データ書き込み Close #1 '開いたら閉じようね End Sub まったくそれくらい自分で作れよなぁ、、、と思いつつ、 テストの呼ぶ側も作成し、 Sub testmain() Call MakeDataFile("A100", "三流君", ThisWorkbook.Path & "\") End Sub OK出来あがり。 早く完成したけど、先輩に報告するとまたいろいろやらされるから(爆) 17時チョット前に出来たことにして今日は帰ろう (*冗談です、マネしないでね、、) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 次の日来てみると、朝っぱらから先輩が、 お前の作ったサブルーチンでファイルは既に開かれてますでこけるんだけど、 クローズ処理とかチャントしてる? などと、言って来た。 変なクレームつけやがってテメエが間違ってんダロと思いつつ、 ~~~~~~~~~~~~~~~~~~~~~~~~ テストもOKだった新人君は、エラーの原因がわからなかった。 ほらこんな感じだよと先輩にエラー発生場所を見せられた、、、 ~~~~~~~~~~~~~~~~~~ 新人君、しばらく考えて、 先輩のメインプログラムを見て、 新人君は激怒した!! ~~~~~~~~~~~~~~~~~~~ Sub TAKO_MAIN() Dim strREC '元データOPEN Open ThisWorkbook.Path & "\名簿.TXT" For Input As #1 'データが無くなるまでループ While EOF(1) = False Line Input #1, strREC '4桁と20桁に分けてサブ関数をコール Call MakeDataFile(Left(strREC, 4), _ Mid(strREC, 5, 20), _ ThisWorkbook.Path & "\") Wend Close #1 MsgBox "ファイル作成終了" End Sub なんと、 先輩のプログラム内でファイル番号1番を使用しており、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 自分のと重なっていたのが原因だった。 先輩に報告すると、 オレの番号を直すか、お前の番号を直すかと言われ、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ まぁ置換するだけだからイイヤと 自分の番号を2番に修正した。 Ken3)どっちもどっちだけどね、仲悪いよねこいつら(笑) ^^^^^^^^^^^^^^^^^^^^^^ Sub MakeDataFile(strID As String, strNAME As String, strDIR As String) Open strDIR & strID & ".TXT" For Output As #2 'ファイルを新規作成 Print #2, strID & "," & strNAME 'データ書き込み Close #2 '開いたら閉じようね End Sub ところが、 安易な修正はさらに混乱を呼び、 今度はC先輩がオレ2番使ってんだけど、などといってきた。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~おいおい、続くの?まだ終わらせようよ *実際は、ファイルをあまり同時に使っていないので、 Closeしてれば1番使いまわしでも大丈夫なんだけど。 なんてお馬鹿な連中なんでしょうね(笑) じゃなくって、 お互いが FreeFileの関数を使って作っていれば、 ~~~~~~~~~~~~~~~~~~~~~~ リンクさせてもスムーズに行った、 苦しい無さそうであるかもの小話でした。 /* * 4.終わりの挨拶 */ 今回は、 ・FreeFile関数の使い方 ・ファイル番号が重なるとエラーがでるよ。 (Ken3とゆかいな仲間達?) でした。 今回のサンプルは、 http://www.ken3.org/vba/lzh/vba033.lzh に test033-book.xlsと名簿.txtが保存されています。 遊んでくださいね。 *小話で作ったプログラム、#1と#2のままなので、 FreeFile版に変更してみてください。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
気になったジャンル↓を選択してください。 人気記事(来場者が多いTOP3): Excel関係: Access関係: その他:VBAの共通関数やテキストファイルの操作など 開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う] 仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力] ※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。 |
Blogとリンク:[三流君の作業日記]/
[VBAやASPのサンプルコード]/
広告-[通販人気商品の足跡]