tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15120
投稿日: 2011/03/03(Thu) 16:33
投稿者よすみ
共有フォルダにエクセルファイルを保存して、
別のエクセルファイルからVBAを使用して共有フォルダ内のファイルにアクセスしたとき、
他で誰かが使用していたらその使用者の名前を取得し、「○○が使用中です」というメッセージを出したいと思っています。
この時、共有フォルダのファイルを開かないようにしたいのですが。

逆引きヘルプの、指定のファイルが使用中なら開かないようにはできたのですが、
使用者名の取り方がわかりません。
何か方法はありますでしょうか?
  

  Windows XP Professional(SP3)
  Microsoft Office Excel 2007
  VB6.0でのプログラマ歴3年(ブランク4年有)  

[ツリー表示へ]
タイトルRe: 共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15121
投稿日: 2011/03/03(Thu) 17:29
投稿者しるふぃん
自分でキーワードを指定して調べてみましたか?

[VBA] [EXCEL] [誰が開いているか]で、ぐぐればでてきますよ。

☆ヒント☆
WorkbookオブジェクトのUserStatusプロパティ

[ツリー表示へ]
タイトルRe^2: 共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15123
投稿日: 2011/03/04(Fri) 11:21
投稿者よすみ
レスありがとうございます。

いろいろぐぐってはみたんですが、
(「Workbookオブジェクト」「UserStatus」にもたどりつきました)
ActiveWorkbook.UserStatus のような形ででてくるので、

@Workbooks("ファイル名.xls").UserStatus で 自分のPCで共有フォルダのファイルを開いておいてテストしたところ、使用者名(自分の名前)をとることができました。
A他端末のPCで開いてもらい試したら、「インデックスが有効範囲でありません」のエラーがでます。

取得したいファイルをどう「ActiveWorkbook」という形にしたらいいのかわかりません。
(共有フォルダにあるファイルがフルパスではなくファイル名だけなので、
認識できないということなんでしょうか?
だとすると、ActiveWorkbookをフルパスを使用して開かずに設定することはできるんでしょうか?)

[ツリー表示へ]
タイトルRe^3: 共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15124
投稿日: 2011/03/04(Fri) 19:46
投稿者ミッキー
まず、実際にテストしてみたプログラムを投稿してください。
そうでないと、よくわかりません。

> @Workbooks("ファイル名.xls").UserStatus で
> 自分のPCで共有フォルダのファイルを開いておいてテストしたところ、
> 使用者名(自分の名前)をとることができました。
> A他端末のPCで開いてもらい試したら、
> 「インデックスが有効範囲でありません」のエラーがでます。

本当に同じプログラム(環境も同じ)ですか?
何か違いはありませんか?

> (共有フォルダにあるファイルがフルパスではなくファイル名だけなので、
> 認識できないということなんでしょうか?

共有フォルダのファイルは、例えば

共有フォルダがあるPC名 PC123
共有フォルダ名           Test
エクセルファイル名       ABC.xls

とした場合、「\\PC123\Test\ABC.xls」と指定していますか?
「ファイル名だけなので」というところに引っかかっています。

まさか「ABC.xls」としか指定していない、ってことはないですよね?

[ツリー表示へ]
タイトルRe^4: 共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15125
投稿日: 2011/03/05(Sat) 11:58
投稿者しるふぃん
お返事が遅くなり申し訳ありません。
ミッキーさんのおっしゃるとおりですが、どのようなプログラムでテストしたのかが
よくわかりませんので、返答が難しいです。

こちら側のテストプログラムではキチンとできていますが、
そのまま答えを載せてしまうと意味がないと思いますので。

まずはファイル名をキチンと指定できているかどうか。
そして、該当Excelをキチンと開いているか、その後該当Excelが開かれているなら
UserStatusで状況を取得、表示すれば大丈夫ですよ^^

[ツリー表示へ]
タイトルRe^4: 共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15126
投稿日: 2011/03/07(Mon) 10:33
投稿者よすみ
御返答ありがとうございます。
実際のプログラムを添付させていただきます。

    Dim sFilename As String
    Dim sFile     As String
    Dim Name As String    
    Dim Users, buf As String, i As Long

    On Error Resume Next

    'エラーのトラップを留保します。
    sFilename = ファイル名のフルパス

    'ファイルが存在するか調べる
    sFile = Dir$(sFilename)

    If Len(sFile) = 0 Then
       buf = "そのファイルは存在しません。"
    Else

       'ファイルがあればファイルの名前を同じ名前で変更します。
       Name sFilename As sFilename

       'ファイルが使用中であればエラーが発生します
       If Err.Number Then
          buf = Err.Number          
          
          '※※※          
       Users = Workbooks(ファイル名).UserStatus

       For i = 1 To UBound(Users)
           buf  = buf & Users(i, 1) & Chr(9) & Users(i, 2) & Chr(9) & Users(i, 3) & vbCrLf
       Next i
      
       End If
    End If


共有フォルダがあるPC名 PC123
共有フォルダ名           Test
エクセルファイル名       ABC.xls

@まず、自分のパソコン共有フォルダのファイルを開き、「ファイル名」をABC.xlsにすれば、bufには自分の名前が入ります。
A次に同じように自分のパソコンで共有フォルダのファイルを開き、「ファイル名」を\\PC123\Test\ABC.xlsにしたら取得できません。
B他のパソコンで共有フォルダのファイルを開いてもらって、上記両方(@A)を試したら両方エラーになりました。

共有フォルダ内のフルパスは、ファイルのプロパティからコピペした「\\」から始まるパスにしてます。

どこに問題があるのか、教えていただければ幸いです。
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe^5: 共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15127
投稿日: 2011/03/07(Mon) 12:44
投稿者しるふぃん
私が確認したのは、VB6.0上からexcelアプリケーションとして一度ワークブックを開きます。
その後UserStatusを取得しすでに開かれているか、誰が開いているか等の判断を行っています。

【サンプル】
    Dim xlApp    As Excel.Application
    Dim xlBook   As Excel.Workbook
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open(\\*****\***.xls)
    Dim Users, buf As String, i As Long
        
    If xlBook.MultiUserEditing Then
        Users = xlBook.UserStatus
        If UBound(Users) = 1 Then
            MsgBox "他に開いているユーザーはいません"
        Else
            MsgBox "あなた以外の誰かがブックを開いています"
            For i = 1 To UBound(Users)
                buf = buf & Users(i, 1) & Chr(9) & Users(i, 2) & Chr(9) & Users(i, 3) & vbCrLf
            Next i
            MsgBox buf
        End If
    Else
        MsgBox "共有ブックとして開いていません"
    End If
    
    xlBook.Close
    Set xlBook = Nothing
    xlApp.Quit
    Set xlApp = Nothing

私がよすみさんの趣旨をうまく理解できていないかもしれませんが
ファイル一覧のようなフォームを開くと、そこに使用状況がある。という感じなのですかね?

私の例はあくまでもファイル名を選択してからそのファイルが〜という形なら流用できそうですがファイル一覧のフォームの使用状況にという形であれば、少し改良が必要ですね。
(使用状況の更新をどうするかも考慮しないとですが)

[ツリー表示へ]
タイトルRe^6: 共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15128
投稿日: 2011/03/07(Mon) 13:28
投稿者よすみ
返信ありがとうございます。

私がやろうとしているのは、
共有フォルダにデータベースとなるエクセルファイルをおいて、
そのファイルにアクセスする(入出力用)エクセルファイルを数人に配布します。
ADODBを使用してアクセスしています。

初めは、データ取得や登録する度に、共有フォルダのファイルに接続していたのですが、
同時処理された場合、読み取り専用が開いてしまう現象が起こったので、
誰かが入出力用のファイルを開いた時に、
共有フォルダのファイルを開いたままにしておき、そのファイルが使用中であれば他では使えないように処理しようとしてます。

このサイトの引用(「指定のファイルが使用中かどうかを調べる」)で、使用中かどうかは確認できるようになったのですが、
誰が開いているのかがわかれば、よりよいものが出来ると思っております。

(UserStatusもあるサイトのをそのままコピーしているので、一覧にしたいわけではなく、
一人しかでてこないはずです。ややこしい書き方をしてしまい、すいません)

読み取り専用で開いたときに、端末によってデータベースとしているファイルが立ち上がったので、(読み取りではない方も立ち上がることがありました。)データベースを開けることなく使用者名を取得したいのです。

いろいろと、説明不足で申し訳ありません。

[ツリー表示へ]
タイトルRe^7: 共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15129
投稿日: 2011/03/07(Mon) 16:08
投稿者しるふぃん
いえいえ、説明いただいて大体の考え方はあっていたのでほっとしました。

サンプルコードを例にして、ファイル名の渡し方と使用中の際のメッセージをどう表示するかを考えていけばいけそうですね。

がんばってください!

[ツリー表示へ]
タイトルRe^7: 共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15130
投稿日: 2011/03/07(Mon) 22:38
投稿者ミッキー
該当のエクセルファイルを「ブックを共有する」にしたらどうですか?
そうすれば、他の利用者がいてもアクセスできますよ。

[ツリー表示へ]
タイトルRe^8: 共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15131
投稿日: 2011/03/08(Tue) 06:46
投稿者しるふぃん
> 該当のエクセルファイルを「ブックを共有する」にしたらどうですか?
> そうすれば、他の利用者がいてもアクセスできますよ。

ブックを共有するは必須ですね。

[ツリー表示へ]
タイトルRe^9: 共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15132
投稿日: 2011/03/08(Tue) 12:57
投稿者よすみ
ありがとうございます。

現状なのですが、
しるふぃん様やミッキー様のアドバイスをふまえ、
試したり調べたりしました。

UserStatusを取得するには、やはりファイルをOpenしないといけないのですね。
そして読取専用の状態だとUserStatusはエラーがでて取得できませんでした。

共有ブックにするとのことですが、
複数PCから同じセルに書き込んだ時、
エクセル自身が有効なものを判断するだとかしないだとか…
妙にエクセルそのもののメッセージを表にだしたくなくて(^^;)
(前に少し試した時、最終更新者とか更新したリストみたいなのがでてきたような…)

共有ブックにして、共有で自分以外にユーザーがいたら開かないようするべきか
共有ブックはさけて(読取専用なら落とす)、誰が開いているのか取得するのはあきらめるか…

どちらがより安全な運用になるのか、検証しながらつめていきたいと思います。

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

[ツリー表示へ]
タイトルRe^10: 共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15133
投稿日: 2011/03/08(Tue) 18:38
投稿者よすみ
データベースにしているファイルを共有ブックにして、
ファイルをOpenし、UserStatusを取得しようとしたところ、
「ファイルが破損しているか読取専用になっている」のエラーがでてうまくいきませんでした。

2台を使って検証したのですが、
1台はADOでデータファイルにつないでいるともう1台で開こうとするとそのようなエラーがでるみたいです。
2台とも、普通に開くとちゃんと共有ファイルとして開きました。

何か方法や対策、自分の知らない設定等があるのかもしれませんが、
やはりユーザーの取得は諦めることにします。
一応報告させていただきます。

[ツリー表示へ]
タイトルRe^11: 共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15134
投稿日: 2011/03/08(Tue) 19:14
投稿者オショウ
> 何か方法や対策、自分の知らない設定等があるのかもしれませんが、
> やはりユーザーの取得は諦めることにします。
> 一応報告させていただきます。

  あら、あきらめるの・・・

  http://www.atmarkit.co.jp/fwin2k/win2ktips/083opened_net_file/083opened_net_file.html

  英語サイトですが・・・こんなの
  http://www.dotnet247.com/247reference/msgs/41/206104.aspx

  情報は取得できます。

以上。参考まで

[ツリー表示へ]
タイトルRe^12: 共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15135
投稿日: 2011/03/08(Tue) 22:42
投稿者あかちん
初めまして
的はずれかもしれませんが、私の場合はデータファイルのデータをGridで表示(VB6で組む)して、任意のセルに対してデータを入力したい場合はスペースキーを押してテータファイルの該当セルに「編集中」を書き込んで他のユーザーが入力できないようにしました。データの入力が終わると「編集中」のセルだけが書き換わるようにします。データファイルはバイナリファイルです。参考までに

[ツリー表示へ]
タイトルRe^13: 共有フォルダ内のエクセルファイルを現在誰が使用しているのか知りたい
記事No15136
投稿日: 2011/03/09(Wed) 15:52
投稿者よすみ
オショウ様

記入のURL拝見させていただきました。
データファイルを開いているモードが問題なのかなと感じたんですが、
勉強不足の為、解決法がよくわかりませんでした。
取得は出来るとのことなので、もう少し時間をかけて挑戦してみたいと思います。
ありがとうございます。


あかちん様

いろいろな方法で対策をしているものですね。
みなさんのアイデアに関心させられます。
共有ファイルにして複数から更新できるようにするには、プログラム・検証等時間がかかりそうなのでもう少し考えたいと思います。
ご意見ありがとうございました。

[ツリー表示へ]