场景
我有一个包含数据的Excel文件。有多个用户同时访问文件。
问题
如果多个用户试图一次将数据输入到该excel文件中,则会出现问题,因为一次只能允许一个用户打开该文件
问题
有什么方法可以打开excel文件(例如:向单元格添加值,从单元格中删除值,找到特定的单元格等)而无需打开它,以便多个用户可以同时更新它时间使用excel VBA?
答案 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
使用共享文件时,我也遇到了内存不足的问题。因此,在此过程中,我想出了以下方法来最大程度地减少内存消耗