SharePoint文件执行Workbook.SaveAs时Workbook.Open()触发两次问题
问题描述
我希望文件位于SharePoint时,自动保存副本到用户桌面并让用户使用这个桌面文件。但执行Workbook.SaveAs时,Workbook.Open会被触发两次,导致代码重复执行。我原本想关闭SharePoint端的文件,重新打开桌面的新文件,但路径始终没变化。以下是我在ThisWorkbook中尝试的代码:
Private Sub Workbook_Open() MsgBox ThisWorkbook.Path If Left(ThisWorkbook.Path, 2) <> "C:" Then MsgBox "This workbook will now be saved on you desktop. Please use it from your desktop location." ThisWorkbook.SaveAs Filename:="C:\Users\" & Environ$("Username") & _ "\Desktop\" & ThisWorkbook.Name, _ FileFormat:=xlOpenXMLWorkbookMacroEnabled ThisWorkbook.Close End If End Sub
解决方案
问题根源
SaveAs操作会自动打开新保存的文件,触发其Workbook_Open事件,和原文件的事件执行逻辑冲突,导致重复触发。- 原代码仅关闭了原文件,未主动打开桌面的新文件,所以路径没有更新。
修改后的代码
- 插入一个标准模块(比如
Module1),声明全局控制变量:
Public SkipOpenEvent As Boolean
- 修改
ThisWorkbook中的Workbook_Open事件代码:
Private Sub Workbook_Open() ' 跳过代码自动触发的打开事件 If SkipOpenEvent Then SkipOpenEvent = False Exit Sub End If ' 判断文件是否位于SharePoint(非C盘路径) If Left(ThisWorkbook.Path, 2) <> "C:" Then MsgBox "此工作簿将保存到你的桌面,请使用桌面版本操作。" Dim desktopFilePath As String desktopFilePath = "C:\Users\" & Environ$("Username") & "\Desktop\" & ThisWorkbook.Name ' 设置标志,避免新文件打开时重复执行逻辑 SkipOpenEvent = True ' 保存副本到桌面 ThisWorkbook.SaveAs Filename:=desktopFilePath, FileFormat:=xlOpenXMLWorkbookMacroEnabled ' 打开桌面的新文件 Workbooks.Open desktopFilePath ' 关闭原SharePoint文件,无需保存更改 ThisWorkbook.Close SaveChanges:=False End If End Sub
关键说明
- 全局变量
SkipOpenEvent:用来区分用户手动打开和代码自动触发的打开事件,彻底避免重复执行逻辑。 - 主动打开新文件:通过
Workbooks.Open明确打开桌面副本,解决路径未更新的问题。 - 关闭原文件时不保存:因为已经生成了桌面副本,原SharePoint文件无需额外保存,避免不必要的同步问题。
内容的提问来源于stack exchange,提问作者Svein Arne Hylland
相关产品推荐
相关产品推荐

