• ベストアンサー

VBA。開いているテキストファイルを検索

エクセル2010.VBAで 開いているテキストファイルが複数あるとして、 それらの中に、 任意のテキストファイル名が含まれているかどうかを 調べるにはどうしたらいいですか? たとえば、エクセルワークシートなら   For Each s In ActiveWorkbook.Worksheets という感じで網羅的に調べられますが、 テキストファイルの場合はどうしたらいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

こんにちは。 >すでにエクセルがopenしているテキストファイルをあらためてエクセルでopenしようとしたら、「開いています。閉じてから実行してください」と警告を出すプログラムが必要です。 Excelでオープンしているということですね。それが分かりませんでした。 普通に、Excelのメニューから「ファイルを『開く』」で、テキストファイルを選択し、そのまま実行し、テキストファイルを開こうとすれば、「テキストウィザード」が出てくるはずです。 既にテキストファイルを開いた状態で、再度開こうとしても、テキストファイルままでは、再度、読み込まれるだけで、二重に開くことは出来ないようです。 仮に、テキストファイルが編集中でしたら、以下のようなダイアログが出てきます。   ---------------------------------------------------------   ****.txtは、既に開いています。2重に開くと、これまでの変更内容は破棄されます。   ****.txt を開きますか? はい(Y), いいえ(N)   --------------------------------------------------------- その時に、「いいえ」選択すれば、再度開くことは防止されます。 今のところ、Excel 2010は手元にありませんが、仕様としては同じはずです。

shinseikoutei
質問者

お礼

分かりました。ありがとうございます。

その他の回答 (2)

回答No.2

こんばんは。 >「杏果物.txt」という名前のファイルがあったとして、このファイルが現在openしているのかcloseしているのかを知りたかったのです。 Textファイルは、別に開いていても、ソフトウェアで排他的モードで開いているのかどうかの問題で、エラーそのものはソフトウェアに依存するはずだと思いましたが……。それは、なんのソフトウェアを使っているかによっても違うはずです。 >openしているファイルをopenするよう指示したらエラーになりますから「閉じてください」と表示してプログラム終了。そして、closeしているならopenして中身をシートに読み出すというプログラムです。 Textファイルに対してという意味ですよね。念のために、今、調べてみしたが、例えば、テキスト・エディタで開いているテキストファイルは、別途Openしてみても、エラーは出ませんね。 もちろん、開いているファイル名を調べることは可能ですが、それを、排他的に開いているプログラムのハンドルを取得し、そのプログラムを閉じるという作業になるはずです。しかし、今までよりも、ずっと複雑なコードになると思います。もしかしたら、それはExcel上の話ということでしょうか?しかし、排他モードということは、他人が開いているという意味になるはずですが、それ自体は、Openは回避するだけで、強制Closeは不可能だったと思います。 もう少し、詳しく説明をお願いします。

shinseikoutei
質問者

お礼

すでにopenしているテキストファイルをあらためてopenしてもエラーにはならないのですね。勉強になりました。 エクセルVBAで株の分析を行い、各社に1ずつのテキストファイルを対応させて、そこに分析データを保存したり、逆に、保存してあったデータをエクセルシートに読み込んで分析し直したりします。 完成したら第三者に配布するので、エラーが出てプログラムが途中で止まるのがいやだったのです。(私だけが使うならエラーが出てもいいのですが) しかし、エラーが出ないとなると、データを保存するテキストファイルの二重編集を防止できれば充分です。 すでにエクセルがopenしているテキストファイルをあらためてエクセルでopenしようとしたら、「開いています。閉じてから実行してください」と警告を出すプログラムが必要です。 どういうアプローチにしたらいいのか分からず手詰まっています。

回答No.1

こんばんは。 なぜ、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 '//

shinseikoutei
質問者

お礼

全てのテキストファイルの中身を全部検索して、任意の語句が含まれるテキストファイル名を返すプログラムですね。 大変勉強になりました。 言葉足らずでしたが、やりたいと思っていたのは、 たとえば「杏果物.txt」という名前のファイルがあったとして、このファイルが現在openしているのかcloseしているのかを知りたかったのです。 openしているファイルをopenするよう指示したらエラーになりますから「閉じてください」と表示してプログラム終了。そして、closeしているならopenして中身をシートに読み出すというプログラムです。 どういうプログラムにすると、任意の名前のテキストファイルがopenしているかcloseしているか分かるでしょうか?