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

问题描述 投票:0回答:1

场景

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

问题是

由于一次只允许一个用户打开该文件,如果多个用户同时尝试输入数据到该excel文件,将会出现问题。

问题

有没有什么方法可以让我在不打开excel文件的情况下更新excel文件(例如:在单元格中添加一个值,从单元格中删除一个值,找到一个特定的单元格等),以便多个用户可以同时使用excel VBA更新它?

excel vba excel-vba
1个回答
0
投票

我去使用共享文件的方向。但后来发现excel共享文件是非常错误的。如果使用共享文件,excelmacro会很慢,间歇性崩溃,有时整个文件可能会被破坏,之后无法打开或修复。此外,取决于有多少用户使用该文件,文件大小可能会变得相当大。所以最好不要使用共享工作簿。完全不值得尝试。相反如果需要多个用户同时更新数据,最好使用一些数据库,如MSAccess、MSSql (从Excel更新MSSQL)等。对于我的情况,由于用户数量较少,我没有使用任何数据库,而是设置了一个提示,让用户等待,直到其他用户关闭该文件。请看下面的代码来检查一个文件是否被打开,如果是,则提示用户。这段代码是我从stack overflow中得到的,我根据自己的需要进行了修改。

调用模块 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

我在使用共享文件时也遇到了Out of memory的问题。所以在这个过程中,我想出了以下方法来减少内存的消耗

一些清除记忆的小窍门

© www.soinside.com 2019 - 2024. All rights reserved.