自PC以外の共有フォルダ内のエクセルの二重起動防止

解決


トト  2008-10-03 20:31:38  No: 145269

環境: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


特攻隊長まるるう  2008-10-03 22:58:43  No: 145270

>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


トト  2008-10-04 00:45:34  No: 145271

>自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

ファイルにロックがかかっているか・・については、
今後の自分の課題とします。

ご指摘とヒント、ありがとうございました。


トト  2008-10-04 02:53:03  No: 145272

追加です。
上記リネームによる方法では、
共有フォルダに置いたファイルをファイル作成者以外がリネームすることが出来ず、
ファイル作成者しか使用できない・・という状況となりました。

下記にて対応しようとしています。

ファイルを別の名前でコピーし、そのファイルを使用して処理を行う。
コピー時にエラーが発生したら、使用中としてエラーメッセージ表示を行う。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加