アプリ版:「スタンプのみでお礼する」機能のリリースについて

[技術者向] コンピューター > プログラミング > その他(プログラミング) でも質問させて頂いたのですが
URL:http://oshiete1.goo.ne.jp/qa3166356.html

回答を得ることができず、こちらのカテゴリを勧められた為、再度質問させて頂きます。

ExcelVBAの勉強を始めて間もない者です。
Office2000のExcelでマクロを作成しています。

テキストストリームオブジェクトを作成してファイルを開き、
ファイルの内容をセルに展開するプログラムを書いているのですが、
開こうとしているファイルが他のプロセスで開かれているかどうかを調べる方法はありませんか?

Openステートメントを使用すればロックをかけることができるので、
エラーを発生させることができるみたいなのですが、
テキストストリームオブジェクトを使用してファイルを開いている場合に
開くファイルが他のプロセスで使用してるか調べる方法が知りたいです。

説明がわかりにくいとは思いますがよろしくお願いします。

A 回答 (2件)

こんばんは。



>このプログラムを実行する前にテキストエディタなど他のプログラムでファイルを開き、データを変更した後に上書き保存をせずファイルを開いたままの状態でプログラムを実行したところエラーは発生せずに変更前のデータが展開されました。

「何だか気持ち悪い結果」というのは、あくまでも、個人の感性に関する問題だと思います。エディタ側には、後で開けば、Read Only にはなるはずですが、Excelもエディタ側も、事実上、排他モードは存在しません。それで、Excel側が書き込み不能になるわけではありません。ですから、実害はありません。ある意味で、それは、Windows の仕様としか言いようがありません。

>データを展開する前(ファイルオープン時)に調べる方法は無いのか?と思い質問させて頂きました。

あえて、そのようなコードを書くなら、以下のようにすればよいけれども、実際に、メモリの中を取り出すようなことを考えていなければ、本来、使う意味がないと思います。

なお、キャプションが正しく出ないものに対しては、アプリケーションのみを探すしかありません。

'標準モジュール

'Option Explicit
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) As Long

Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long

Public Const GW_HWNDLAST = 1
Public Const GW_HWNDNEXT = 2

Public Function GetProcessName_Check(fName As String) As Boolean
  Dim hwnd As Long
  Dim strClassName As String * 100 'クラス
  Dim strCaption As String * 80 'キャプション
  Dim buf As String
  GetProcessName_Check = False
  hwnd = FindWindow(vbNullString, vbNullString)
  Do
    If IsWindowVisible(hwnd) Then
      GetWindowText hwnd, strCaption, Len(strCaption)
      GetClassName hwnd, strClassName, Len(strClassName)
      buf = Left(strCaption, InStr(strCaption, vbNullChar) - 1)
      If InStr(1, buf, fName, vbTextCompare) > 0 Then
        GetProcessName_Check = True
        Exit Function
      End If
    End If
    hwnd = GetNextWindow(hwnd, GW_HWNDNEXT)
  Loop Until hwnd = GetNextWindow(hwnd, GW_HWNDLAST)

End Function
  
Sub TestCheck()
 Dim fName As String
 Dim msg as String
 fName = "Test1.csv"
 If GetProcessName_Check(fName) Then
   msg = "起動しています。"
 Else
   msg = "起動していません。"
 End If
 MsgBox msg
End Sub
    • good
    • 0

こんにちは。



テキストストリームの方法の回答を書いた者です。

>開くファイルが他のプロセスで使用してるか調べる方法が知りたいです。

他のプロセスと他者が使用するのとでは意味が違います。
他のプロセスというのは、他のExcelという意味だと思います。それを許して使うという意味なのですか?もし、そうなら、Excelを二度目に起動する時、アラートが返ったはずです。

それとも、単に、For Each sh in ActiveWorkbook.ActiveSheets で、ループして調べるだけではありませんか?しかし、こちらは、Binary Open で、エラーレベルは返ります。

それ以外というのは、「オートメーション」で開いているという意味なのですか?
「オートメーション」では、一般的には、私は、あまり使いませんが、GetObjecct で、単発のファイルを狙うと、他にプロセスが占有していないとエラーが返るというスキルを利用する方法はありますが、ただ、どちらかというと、Excelでは不必要なワザです。

もちろん、他のプロセスで使用しているというなら、別の方法はありますが、もともと、Excelは、純粋に、MDIではありませんから、そういう必要性というのは、どちらかというと誤用に近い使い方ではないか、と思うのです。

「VBAの勉強を始めて間もない」という人が、なぜ、そんなに高度なスキルが必要になってくるのかわかりません。以前のVisual Basic や他の言語をされてきた方なのですか?

時々、VB(.Net ではない)を使ってきた方が、かなりイレギュラーな使い方を「アリ」としてしまうように見受けられます。

最初の質問から見ましたが、もう少し、詳しい事情を説明してみてほしいです。
それぞれのスキルを問われても、全体のステージが違えば、それは違うはずです。

>読み込みモードで開いた場合はエラーは発生せずに開いてしまいます。

「読み込みモード」というのは何を意味しているのでしょうか?

エラーレベルを発生させるための条件があります。その条件が違えば、エラーレベルは発生しません。

どのようにして使って、どのような状態の時に、どのようにするのか、分からないのです。また、もし上級者でしたら、他力に頼まず、ご自身で見つけたほうがよいと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ExcelVBA、VBでのプログラミングは初めてです。
ですが、趣味のレベルではありますがC言語でのプログラミングは2年ほど経験があります。

2回も説明してるのに説明が不足していて申し訳ないのですが、
今回やろうとしていることは、
csvファイルやtsvファイルなどデータのみが記述されているファイルを読み込んでセルに展開する。
ということをしたいと思っています。

ひとまず動くものができた為、
このプログラムを実行する前にテキストエディタなど他のプログラムでファイルを開き、
データを変更した後に上書き保存をせずファイルを開いたままの状態でプログラムを実行したところ
エラーは発生せずに変更前のデータが展開されました。

エラーが発生すると思って試しにやってみたところ、何だか気持ち悪い結果になってしまった為、
データを展開する前(ファイルオープン時)に調べる方法は無いのか?と思い質問させて頂きました。

こんな説明で伝わるか不安ですが説明不足でしたら注意をお願いします。

高度なことでVBA初心者に理解できない処理が必要でしたら
そう伝えて頂けるだけでも助かります。

お手数ですが再度回答して頂ければ幸いです。

お礼日時:2007/07/19 21:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!