環境:WindowsXP
VB.NET2003
エクセルの二重起動防止に、下記ファンクションを作成し、
Bool値がFalseの時にエラーメッセージを表示するようにしています。
が、エクセルを起動しているのと同じPCでは、エラーメッセージ表示が可能ですが、
自席PCではなく、ネットワーク上の共有フォルダ内のエクセルに対し、
別のPCからエクセルを起動している場合に、自席PCから該当エクセルが起動しているか
の確認をしたいです。
どのようにすればよいでしょうか・・。
Google検索とかもしてみたのですが、うまく情報が検索できなかったので・・。
Private Function CHK_XLS(ByVal strFilePath As String) As Boolean
Dim oExcel As Object
CHK_XLS = True
Try
oExcel = GetObject(, "Excel.Application")
'「ActiveXコンポーネントはオブジェクトを作成できません」の回避
If oExcel Is Nothing Then
CHK_XLS = True
Exit Function
End If
With oExcel
For i As Integer = 1 To .Workbooks.Count
If .Workbooks(i).Path & "\" & .Workbooks(i).Name = strFilePath Then
CHK_XLS = False
Exit Function
End If
Next i
End With
Catch ex As Exception
CHK_XLS = False
Finally
oExcel = Nothing
End Try
End Function
>Google検索とかもしてみたのですが、うまく情報が検索できなかったので・・。
それほど困らずにできましたが?
キーワード『Excel VB ファイル 開いている』
自PCでも、Excel のプロセスを2つ以上起動していた時は、提示のコードでは
判別できないのではないかと思いますが。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=18667
ファイルにロックが掛かっているかを調べた方が良いのでは?
また、VB.NET で Excel を操作するには COM オブジェクトの解放処理が
必要であり、これが抜けているため、提示のプログラムを実行すると
Excel が起動したままになってしまいます。
http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm
>自PCでも、Excel のプロセスを2つ以上起動していた時は、提示のコードでは
>判別できないのではないかと思いますが
確かにそうでした。
教えて頂いたリンクは、意味が分からなかったのでしばらく奮闘してみます。
COM オブジェクトの解放処理は、以前勉強していたつもりでしたが、
すっかり忘れていました。
ただ、エクセルが起動したまま・・にはなっていなかったので、気付いていませんでした。
-----
他の方法を調べていたところ、下記サイトにて、
ファイルをそのファイル名でリネームし、エラーが出たら使用中・・、
とする方法を見つけました。
http://hanatyan.sakura.ne.jp/vbhlp/excel03.htm
下記のようにしてエラー時に、エラーメッセージを表示するようにしてみました。
Private Function CHK_XLS(ByVal strXLSFilePath As String) As Boolean
Try
Microsoft.VisualBasic.FileSystem.Rename(strXLSFilePath, strXLSFilePath)
CHK_XLS = True
Catch ex As Exception
CHK_XLS = False
End Try
End Function
ファイルにロックがかかっているか・・については、
今後の自分の課題とします。
ご指摘とヒント、ありがとうございました。
追加です。
上記リネームによる方法では、
共有フォルダに置いたファイルをファイル作成者以外がリネームすることが出来ず、
ファイル作成者しか使用できない・・という状況となりました。
下記にて対応しようとしています。
ファイルを別の名前でコピーし、そのファイルを使用して処理を行う。
コピー時にエラーが発生したら、使用中としてエラーメッセージ表示を行う。
ツイート | ![]() |