You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA写入OneDrive同步Excel文件后同步挂起的解决方法求助

解决OneDrive同步挂起问题的VBA方案

方法1:强制刷新文件系统元数据

OneDrive依赖文件系统的变更事件(如修改时间更新)触发同步,VBA保存操作可能未完整触发该事件。通过手动修改文件的最后修改时间,可以强制让OneDrive检测到文件变更。

修改后的代码示例:

Public Sub InsertToSharedDataBase()
    
    Dim sFullFileName As String
    Dim SharedDataBaseWb As Workbook
    Dim SharedDataBaseWs As Worksheet
      
    sFullFileName = "C:\Users\tk\MyCompanyOneDrine\MyFolder\Database.xlsx"
      
    Set SharedDataBaseWb = GetObject(sFullFileName)
    Set SharedDataBaseWs = SharedDataBaseWb.Worksheets("MyWorksheet")
    
    '写入数据
    With SharedDataBaseWs
        .Cells(1, 1).Value2 = "values"
        .Cells(1, 2).Value2 = "values"
        .Cells(1, 3).Value2 = "values"
        .Cells(1, 4).Value2 = "values"
    End With
    
    '保存并关闭工作簿
    SharedDataBaseWb.Close SaveChanges:=True
    
    '强制更新文件修改时间,触发OneDrive同步
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    fso.GetFile(sFullFileName).DateLastModified = Now()
    
    '释放对象
    Set fso = Nothing
    Set SharedDataBaseWs = Nothing
    Set SharedDataBaseWb = Nothing
    
End Sub

方法2:显式打开工作簿+双重触发同步

改用Workbooks.Open显式打开文件,完成保存后同时更新修改时间和访问时间,进一步强化文件变更信号:

Public Sub InsertToSharedDataBase()
    
    Dim sFullFileName As String
    Dim SharedDataBaseWb As Workbook
    Dim SharedDataBaseWs As Worksheet
      
    sFullFileName = "C:\Users\tk\MyCompanyOneDrine\MyFolder\Database.xlsx"
      
    '隐藏打开工作簿,避免干扰用户操作
    Set SharedDataBaseWb = Workbooks.Open(Filename:=sFullFileName, Visible:=False)
    Set SharedDataBaseWs = SharedDataBaseWb.Worksheets("MyWorksheet")
    
    '写入数据
    With SharedDataBaseWs
        .Cells(1, 1).Value2 = "values"
        .Cells(1, 2).Value2 = "values"
        .Cells(1, 3).Value2 = "values"
        .Cells(1, 4).Value2 = "values"
    End With
    
    '先保存再关闭,确保写入完成
    SharedDataBaseWb.Save
    SharedDataBaseWb.Close SaveChanges:=False
    
    '更新文件修改和访问时间
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    With fso.GetFile(sFullFileName)
        .DateLastModified = Now()
        .DateLastAccessed = Now()
    End With
    
    '释放对象
    Set fso = Nothing
    Set SharedDataBaseWs = Nothing
    Set SharedDataBaseWb = Nothing
    
End Sub

方法3:主动调用OneDrive同步命令

通过VBA执行OneDrive的同步命令,强制触发立即同步。注意替换代码中OneDrive的实际安装路径:

Public Sub InsertToSharedDataBase()
    
    Dim sFullFileName As String
    Dim SharedDataBaseWb As Workbook
    Dim SharedDataBaseWs As Worksheet
    Dim oneDrivePath As String
      
    sFullFileName = "C:\Users\tk\MyCompanyOneDrine\MyFolder\Database.xlsx"
    '替换为你的OneDrive实际安装路径
    oneDrivePath = "C:\Users\tk\AppData\Local\Microsoft\OneDrive\OneDrive.exe"
      
    Set SharedDataBaseWb = GetObject(sFullFileName)
    Set SharedDataBaseWs = SharedDataBaseWb.Worksheets("MyWorksheet")
    
    '写入数据
    With SharedDataBaseWs
        .Cells(1, 1).Value2 = "values"
        .Cells(1, 2).Value2 = "values"
        .Cells(1, 3).Value2 = "values"
        .Cells(1, 4).Value2 = "values"
    End With
    
    '保存并关闭工作簿
    SharedDataBaseWb.Close SaveChanges:=True
    
    '调用OneDrive强制同步
    Shell oneDrivePath & " /syncnow", vbMinimizedNoFocus
    
    '释放对象
    Set SharedDataBaseWs = Nothing
    Set SharedDataBaseWb = Nothing
    
End Sub

核心说明

手动打开保存能触发同步,是因为该操作会完整更新文件元数据并触发文件系统的变更通知;而VBA的批量保存操作可能跳过部分通知逻辑。以上方法通过强制更新文件元数据或主动调用同步指令,让OneDrive及时检测到文件变更并完成同步。

内容的提问来源于stack exchange,提问作者JustGreat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:25:04