请问如何判断一个excel文件是否已经被局域网内其他用户打开?有没有一个什么函数?希望大家帮忙~谢谢~

解决方案 »

  1.   

    http://topic.csdn.net/t/20060221/15/4568459.html
      

  2.   

    还是不太懂,我的代码是类似下面这种方式写的,怎么设置以独占方式打开?
    另外,即使是以独占方式打开,不是也要先判断是否已经被局域网内其他用户打开吗?
    我接触VB不久,还请各位不吝赐教,谢谢~      Dim uExcel As Excel.Application    
        Dim uExcelBook As Excel.Workbook
        Set uExcel = New Excel.Application
        Set uExcelBook = uExcel.Workbooks.Open("D:\test.xls")
        Set oSheet = uExcelBook.Worksheets(1)
        Set uSheet = uExcelBook.Worksheets(2)  ...
      ...
      

  3.   

    我打开这个("D:\test.xls") 文件是之前就存在的,而且要对他进行读写等操作,所以才不希望同时有两个用户编辑它
      

  4.   

      Public   Function   IsFileInUse(ByVal   FileName   As   String)   As   Boolean   
            Dim   FileHandle   As   Long   
            On   Error   GoTo   ErrHandle   
              
            IsFileInUse   =   True   
              
            If   Not   FileExists(FileName)   Then   
                  IsFileInUse   =   True   
                  Exit   Function   
            End   If   
              
            FileHandle   =   CreateFile(FileName,   _   
                                                            GENERIC_READ   Or   _   
                                                            GENERIC_WRITE,   _   
                                                            0&,   _   
                                                            ByVal   0&,   _   
                                                            OPEN_EXISTING,   _   
                                                            FILE_ATTRIBUTE_ARCHIVE   Or   _   
                                                            FILE_ATTRIBUTE_HIDDEN   Or   _   
                                                            FILE_ATTRIBUTE_NORMAL   Or   _   
                                                            FILE_ATTRIBUTE_READONLY   Or   _   
                                                            FILE_ATTRIBUTE_READONLY   Or   _   
                                                            FILE_ATTRIBUTE_SYSTEM,   _   
                                                            0&   _   
                                                          )   
              
            If   FileHandle   =   -1   Then   Exit   Function   
              
            IsFileInUse   =   False   
              
            Call   CloseHandle(FileHandle)   
              
            Exit   Function   
      ErrHandle:   
            Err.Raise   Err.Number,   "IsFileInUse",   Err.Description   
      End   Functionif FileInUse("d:\test.xls") then
      msgbox "文件正在使用..."
    end if
      

  5.   

    我在程序里添加了以下代码:单击command4,无论("d:\test.xls") 文件是否已经打开,都会弹出"test.xls文件正在使用..."这是怎么回事呢?
    Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public Function FileExists(ByVal FileName As String) As Boolean
            Dim FileHandle     As Long
            On Error GoTo ErrHandle
            FileExists = False
            FileHandle = CreateFile(FileName, _
                                                            0&, _
                                                            FILE_SHARE_READ Or _
                                                            FILE_SHARE_WRITE, _
                                                            ByVal 0&, _
                                                            OPEN_EXISTING, _
                                                            FILE_ATTRIBUTE_ARCHIVE Or _
                                                            FILE_ATTRIBUTE_HIDDEN Or _
                                                            FILE_ATTRIBUTE_NORMAL Or _
                                                            FILE_ATTRIBUTE_READONLY Or _
                                                            FILE_ATTRIBUTE_READONLY Or _
                                                            FILE_ATTRIBUTE_SYSTEM, _
                                                            0& _
                                                          )
            If FileHandle = -1 Then Exit Function
            FileExists = True
            Call CloseHandle(FileHandle)
            Exit Function
    ErrHandle:
            FileExists = False
      End Function
      
      Public Function IsFileInUse(ByVal FileName As String) As Boolean
            Dim FileHandle     As Long
            On Error GoTo ErrHandle
              
            IsFileInUse = True
              
            If Not FileExists(FileName) Then
                  IsFileInUse = True
                  Exit Function
            End If
              
            FileHandle = CreateFile(FileName, _
                                                            GENERIC_READ Or _
                                                            GENERIC_WRITE, _
                                                            0&, _
                                                            ByVal 0&, _
                                                            OPEN_EXISTING, _
                                                            FILE_ATTRIBUTE_ARCHIVE Or _
                                                            FILE_ATTRIBUTE_HIDDEN Or _
                                                            FILE_ATTRIBUTE_NORMAL Or _
                                                            FILE_ATTRIBUTE_READONLY Or _
                                                            FILE_ATTRIBUTE_READONLY Or _
                                                            FILE_ATTRIBUTE_SYSTEM, _
                                                            0& _
                                                          )
              
            If FileHandle = -1 Then Exit Function
              
            IsFileInUse = False
              
            Call CloseHandle(FileHandle)
              
            Exit Function
    ErrHandle:
            Err.Raise Err.Number, "IsFileInUse", Err.Description
      End Function
    Private Sub Command4_Click()
    If IsFileInUse("d:\test.xls") Then
      MsgBox "test.xls文件正在使用..."
    End If
    End Sub
      

  6.   

    FileExists 里FileHandle 的值一直都是-1...   
      

  7.   

    为-1有两种情况,可以通过API函数GetLastError来判断.如果GetLastError的值为ERROR_FILE_NOT_FOUND(值是2),则表示文件不存在;如果是ERROR_ACCESS_DENIED(值为5),则表示文件正在使用中,其它的就根据具体的错误号区分了.
      

  8.   

    没有用过 GetLastError ,具体位置放在哪里呢?尝试过以下两种:实际上这个文件已经被局域网内的其他用户打开,用excel打开也会提示选择只读或是通知,但这里却一直返回的是“0” ,请指教这是怎么回事?另外在本地的文件,打开了之后运行后,同样返回值也是"0",是不是还有其他需要设置的东西?谢谢你了~一、Command4_Click里,两个返回值都是“0”
    Private Declare Function GetLastError Lib "kernel32" () As Long
    Private Sub Command4_Click() 
    If IsFileInUse("d:\test.xls") Then         ’本地或是局域网内共享文件的地址
      MsgBox "test.xls文件正在使用..." 
    End If 
    Errors = GetLastError()
    MsgBox Errors                              ’1
    MsgBox Err.LastDllError                    ’2
    End Sub 
    二、FileExists里, 两个返回值也都是“0”
    Private Declare Function GetLastError Lib "kernel32" () As Long
            ....
            If FileHandle = -1 Then        Errors = GetLastError()             
            MsgBox Errors                      ’1
            MsgBox Err.LastDllError            ’2        Exit Function        End If
           ....
      

  9.   

    IsFileInUse返回true之后,在Msgbox之前调用GetLastError.