[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.033 FreeFile関数で空いてるファイル番号を返す方法

FreeFile関数で空いてるファイル番号を返す方法

メルマガ発行内容

<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でした。

フィードバック

VBA系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.033を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

ページフッター(リンクや広告など)


[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます


広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列

情報を探す

情報を探すならGoogleかな?

↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
Google
Web www.ken3.org
www.microsoft.com support.microsoft.com

あとは、項目別にMSでお勉強かな?
◆ マイクロソフト サイトの歩き方
◇ How-To インデックス
◇ FAQ インデックス
◇ スキルレベル別おすすめコンテンツ
◇ テクノロジ マップ
◇ テーマ別技術資料一覧

書籍の購入

Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??

コンピュータ書籍の発送がハヤイ専門店

コンピュータの本・専門店
種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり

amazon.co.jpでキーワード別チェック

下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・