【问题标题】:How to deal with co-authoring while editing an Excel file in Sharepoint via VBA如何在通过 VBA 在 Sharepoint 中编辑 Excel 文件时处理共同创作
【发布时间】:2020-07-17 01:52:51
【问题描述】:

我有一个存储在 Sharepoint 中的 excel 文件(也可以通过 Microsoft Teams 访问),路径为:https://organization.sharepoint.com/PathOfFile/myFile.xlsx

借助 Sharepoint 中的共同创作功能,可以多人同时编辑文件。

我想使用本地存储在我的计算机中的另一个 excel 文件来访问和修改 Sharepoint 中的那个。这个本地文件有一个按钮,里面有这个 VBA 代码:

Sub UpdateSP():

    f_name = "https://organization.sharepoint.com/PathOfFile/myFile.xlsx"

    Workbooks.Open f_name
    Workbooks("myFile.xlsx").Activate
    ActiveWorkbook.Sheets("sheet1").Activate

    Range("A" & Rows.Count).End(xlUp).Offset(1).Select
    ActiveCell.Value = 9999
    ActiveCell.Offset(0, 1).Select
    ActiveCell.Value = 0000

    ActiveWorkbook.Close SaveChanges:=True

End Sub

原则上它可以工作,Sharepoint 中的文件被修改了。但是如果有人在我运行代码时编辑文件,就会出现问题,然后似乎创建了两个版本的文件,一个用于在线实时编辑,另一个用于我的代码。

如果发生这种情况,文件的在线版本将不会显示代码所做的更改,并且每当使用 excel 应用程序打开文件时,都会弹出一个窗口,询问应保留哪个版本的文件,丢失在已处置版本中所做的所有更改。

我尝试使用 CanCheckOutCheckOut 方法,但无论出于何种原因,CanCheckOut 总是返回 False(这里有一些关于相同问题的问题,但我还没有找到解决方案) .

有人可以提出解决此问题的方法吗?谢谢。

【问题讨论】:

    标签: excel vba sharepoint


    【解决方案1】:

    我不能 100% 确定它是否可以在 SharePoint 上运行,但理论上,ADODB 是一个用于 VBA 的库,它具有使用 Microsoft Jet Engine 的对象语法,因此您可以打开文件 AdLockOptimistic---ally。 ((在 ADO.net 中查找锁类型))

    这在文件目录的基础上工作,所以如果正在修改的数据库是打开的,它将处理更新。

    您将建立一个 ADO 连接,然后指定 Lock 的类型,以便访问其中的 Excel 工作表和表格,而不是使用 Excel 的应用程序打开文件。

    这适用于共享/网络驱动器,所以我猜既然 SharePoint 可以映射为文件资源管理器驱动器,那么 ADO 应该可以工作并且值得一试。

    这是一个让您入门的基本示例:ADO question

    【讨论】:

      【解决方案2】:

      激活工作簿后尝试启用自动保存。

      为此,请添加以下行: ActiveWorkbook.AutoSaveOn = True

      Workbooks("myFile.xlsx").Activate 行之后。

      我在协作文件方面遇到过类似问题,确保启用自动保存已解决。

      【讨论】:

        【解决方案3】:

        为了能够以这种方式合并更改,您的代码必须在共同创作的上下文中运行。

        代码必须在从同一源 URL(Sharepoint 或 OneDrive)打开的同一个文档中运行,而不是从另一个文档或本地副本打开文档,这样加载项或宏可以对 Excel 进行更改它本身将处理共同创作的上下文。

        我建议查看 Office 开发中心的Coauthoring in Excel add-ins,包括里面的链接文章(特别是“共同创作”、重定向到支持中心以及底部的“关于 Excel 中的共同创作 (VBA)”以及更多内容样本)。

        【讨论】:

          【解决方案4】:

          如果工作簿打开,CanCheckOut 将始终返回 false。因此,您必须在触摸它之前进行检查。 CheckOut 命令不会打开文件,所以我们还必须在 CheckOut 之后有一个 open 语句。

          使用您的示例,它看起来像这样;

          Option Explicit
          
          Public Sub UpdateSP()
              Dim fName As String
              fName = "https://organization.sharepoint.com/PathOfFile/myFile.xlsx"
          
              If Workbooks.CanCheckOut(fName) Then
                  Workbooks.CheckOut fName
                  Dim myFile As Workbook
                  Set myFile = Workbooks.Open(fName)
                  Dim mySheet As Worksheet
                  Set mySheet = myFile.Sheets("Sheet1")
                  Dim startRange As Range
                  Set startRange = mySheet.Range("A" & mySheet.Rows.Count).End(xlUp).Offset(1)
              
                  startRange.Value = 9999
                  startRange.Offset(0, 1).Value = 0
              
                  myFile.Close SaveChanges:=True
              Else
                  MsgBox fName & " can't be checked out at this time.", vbInformation
              End If
          End Sub
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-07-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-23
            相关资源
            最近更新 更多