更新excel文件,而无需同时由多个用户打开文件

时间:2018-07-09 03:32:05

标签: excel vba excel-vba

场景

我有一个包含数据的Excel文件。有多个用户同时访问文件。

问题

如果多个用户试图一次将数据输入到该excel文件中,则会出现问题,因为一次只能允许一个用户打开该文件

问题

有什么方法可以打开excel文件(例如:向单元格添加值,从单元格中删除值,找到特定的单元格等)而无需打开它,以便多个用户可以同时更新它时间使用excel VBA?

1 个答案:

答案 0 :(得分:0)

我转向了使用共享文件的方向。但是后来发现是excel共享文件,非常容易出错。如果使用共享文件,Excel /宏可能会非常慢,间歇性崩溃,并且有时整个文件可能会损坏,此后无法打开或修复。还取决于有多少用户使用该文件,文件大小会变得很大。因此,最好不要使用共享工作簿。完全不值得尝试。相反,如果需要多个用户同时更新数据,最好使用带有Excel的MSAccess,MSSql等数据库。对于我的情况,由于用户数较少,所以我没有使用任何数据库,而是提示用户等待其他用户关闭该文件。请查看下面的代码,检查是否打开了文件,如果打开,则提示用户。我从堆栈溢出本身获取了此代码,并根据自己的需要进行了修改。

如下调用模块TestFileOpened

Sub fileCheck()
  Call TestFileOpened(plannerFilePathTemp)
    If fileInUse = True Then
        Application.ScreenUpdating = True
        Exit Sub
    End If
End Sub

plannerFilePathTemp是原始文件的临时文件位置。每当打开excel文件时,都会创建一个临时文件。例如,您的原始文件位置如下所示

plannerFilePath = "C:\TEMP\XXX\xxx.xlsx"

因此您的临时文件位置将为

plannerFilePathTemp = "C:\TEMP\XXX\~$xxx.xlsx"

或换句话说,临时文件名将为~$xxx.xlsx

将在Call TestFileOpened(plannerFilePathTemp)

上调用以下代码
Public fileInUse As Boolean
Sub TestFileOpened(fileOpenedOrNot As String)
Dim Folder As String
Dim FName As String

Set objFSO = CreateObject("Scripting.FileSystemObject")

If objFSO.FileExists(fileOpenedOrNot) Then
    fileInUse = True
    MsgBox "Database is opened and using by " & GetFileOwner(fileOpenedOrNot) & ". Please wait a few second and click again", vbInformation, "Database in Use"
Else
    fileInUse = False
End If

End Sub

Function GetFileOwner(strFileName)
    Set objWMIService = GetObject("winmgmts:")
    Set objFileSecuritySettings = _
    objWMIService.Get("Win32_LogicalFileSecuritySetting='" & strFileName & "'")
    intRetVal = objFileSecuritySettings.GetSecurityDescriptor(objSD)

    If intRetVal = 0 Then
       GetFileOwner = objSD.Owner.Name
    Else
       GetFileOwner = "Unknown"
    End If
End Function

使用共享文件时,我也遇到了内存不足的问题。因此,在此过程中,我想出了以下方法来最大程度地减少内存消耗

Some tips to clear memory