- ベストアンサー
VBA。開いているテキストファイルを検索
エクセル2010.VBAで 開いているテキストファイルが複数あるとして、 それらの中に、 任意のテキストファイル名が含まれているかどうかを 調べるにはどうしたらいいですか? たとえば、エクセルワークシートなら For Each s In ActiveWorkbook.Worksheets という感じで網羅的に調べられますが、 テキストファイルの場合はどうしたらいいのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 >すでにエクセルがopenしているテキストファイルをあらためてエクセルでopenしようとしたら、「開いています。閉じてから実行してください」と警告を出すプログラムが必要です。 Excelでオープンしているということですね。それが分かりませんでした。 普通に、Excelのメニューから「ファイルを『開く』」で、テキストファイルを選択し、そのまま実行し、テキストファイルを開こうとすれば、「テキストウィザード」が出てくるはずです。 既にテキストファイルを開いた状態で、再度開こうとしても、テキストファイルままでは、再度、読み込まれるだけで、二重に開くことは出来ないようです。 仮に、テキストファイルが編集中でしたら、以下のようなダイアログが出てきます。 --------------------------------------------------------- ****.txtは、既に開いています。2重に開くと、これまでの変更内容は破棄されます。 ****.txt を開きますか? はい(Y), いいえ(N) --------------------------------------------------------- その時に、「いいえ」選択すれば、再度開くことは防止されます。 今のところ、Excel 2010は手元にありませんが、仕様としては同じはずです。
その他の回答 (2)
- WindFaller
- ベストアンサー率57% (465/803)
こんばんは。 >「杏果物.txt」という名前のファイルがあったとして、このファイルが現在openしているのかcloseしているのかを知りたかったのです。 Textファイルは、別に開いていても、ソフトウェアで排他的モードで開いているのかどうかの問題で、エラーそのものはソフトウェアに依存するはずだと思いましたが……。それは、なんのソフトウェアを使っているかによっても違うはずです。 >openしているファイルをopenするよう指示したらエラーになりますから「閉じてください」と表示してプログラム終了。そして、closeしているならopenして中身をシートに読み出すというプログラムです。 Textファイルに対してという意味ですよね。念のために、今、調べてみしたが、例えば、テキスト・エディタで開いているテキストファイルは、別途Openしてみても、エラーは出ませんね。 もちろん、開いているファイル名を調べることは可能ですが、それを、排他的に開いているプログラムのハンドルを取得し、そのプログラムを閉じるという作業になるはずです。しかし、今までよりも、ずっと複雑なコードになると思います。もしかしたら、それはExcel上の話ということでしょうか?しかし、排他モードということは、他人が開いているという意味になるはずですが、それ自体は、Openは回避するだけで、強制Closeは不可能だったと思います。 もう少し、詳しく説明をお願いします。
お礼
すでにopenしているテキストファイルをあらためてopenしてもエラーにはならないのですね。勉強になりました。 エクセルVBAで株の分析を行い、各社に1ずつのテキストファイルを対応させて、そこに分析データを保存したり、逆に、保存してあったデータをエクセルシートに読み込んで分析し直したりします。 完成したら第三者に配布するので、エラーが出てプログラムが途中で止まるのがいやだったのです。(私だけが使うならエラーが出てもいいのですが) しかし、エラーが出ないとなると、データを保存するテキストファイルの二重編集を防止できれば充分です。 すでにエクセルがopenしているテキストファイルをあらためてエクセルでopenしようとしたら、「開いています。閉じてから実行してください」と警告を出すプログラムが必要です。 どういうアプローチにしたらいいのか分からず手詰まっています。
- WindFaller
- ベストアンサー率57% (465/803)
こんばんは。 なぜ、VBAを使わなくてはならないのでしょうか? 一般のツールを外部からインストールしてはいけないのでしょうか? 出来ないとは言いませんが、面倒だと思います。 JGREP(Windows用)は、便利だと思います。 ただし、標準が、JISになっているので、[文字コードを自動判別する]にチェックをいれないといけません。 JGREP2.05 http://www.vector.co.jp/soft/win95/util/se174779.html スクリーンショット http://www.hi-ho.ne.jp/jun_miura/jgrep.htm 上記よりも、劣るものですが、考えてみました。 '// Sub TextSearch_Macro() Dim myDirs() As Variant Dim i As Long, j As Long, k As Long Dim myFName As String Dim TextLine As String Dim f As Long '--------検索ディレクトリ----- Const MYPATH As String = "C:\Users\[XXXX]\My Documents\Text\" '--------検索語------------ Const SRCH As String = "杏果" '--------------------------- myFName = Dir(MYPATH & "*.txt") Do While myFName <> "" ReDim Preserve myDirs(i) myDirs(i) = myFName myFName = Dir() i = i + 1 If i > 10000 Then '検索数リミット Exit Do End If Loop For j = 0 To UBound(myDirs) f = FreeFile() Open MYPATH & myDirs(j) For Input As #f Do While Not EOF(f) Line Input #f, TextLine If InStr(1, TextLine, SRCH, vbTextCompare) > 0 Then k = k + 1 Cells(k, 1).Value = myDirs(j) Exit Do Else TextLine = StrConv(TextLine, vbFromUnicode) 'Unicode 対策 If InStr(1, TextLine, SRCH, vbTextCompare) > 0 Then k = k + 1 Cells(k, 1).Value = myDirs(j) Exit Do End If End If Loop Close #f Next j If j = 0 Then MsgBox SRCH & "は見つかりませんでした。", vbInformation End If End Sub '//
お礼
全てのテキストファイルの中身を全部検索して、任意の語句が含まれるテキストファイル名を返すプログラムですね。 大変勉強になりました。 言葉足らずでしたが、やりたいと思っていたのは、 たとえば「杏果物.txt」という名前のファイルがあったとして、このファイルが現在openしているのかcloseしているのかを知りたかったのです。 openしているファイルをopenするよう指示したらエラーになりますから「閉じてください」と表示してプログラム終了。そして、closeしているならopenして中身をシートに読み出すというプログラムです。 どういうプログラムにすると、任意の名前のテキストファイルがopenしているかcloseしているか分かるでしょうか?
お礼
分かりました。ありがとうございます。