我有一个xl加载项(.xlam文件),它使用其中一个工作表来存储从UserForm收集的数据。
如果Excel关闭,那么我希望此文件将自己保存在加载项目录中。目前在这里: C:\ Users \用户MYNAME \应用程序数据\漫游\微软\加载项\ ExcelStartUp_ExcelVersion.xlam
所以在关闭事件之前的插件中我得到了以下内容:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Save
End Sub
看起来不错但似乎将xlam的副本保存到CurDir中。因此,我们的文件系统正在复制!我该如何解决这个问题?
好的 - 事情只是超现实!如果我在xlam文件的代码窗口之一,然后打开立即窗口,那么以下两行是完全不一致的!:
?ThisWorkbook.Path
?Thisworkbook.fullname
答案 0 :(得分:1)
我一直遇到相同的问题,发现它是由外接程序在某些情况下将其ReadOnly状态更改为True引起的(无法精确指出在哪种情况下,但似乎与打开多个Excel实例有关)。 / p>
因此,解决方案是将检查添加到您的代码中,如下所示:
If ThisWorkbook.ReadOnly = False Then
ThisWorkbook.Save
End If
答案 1 :(得分:0)
我有这种行为 - 在这里和那里保存插件 - 当多个Excel实例打开时。 (我实际上昨晚只是在谷歌搜索它,但找不到确认它的任何内容。)我有一个从BeforeClose事件调用的函数,它检查多个实例。
Private Sub App_WorkbookBeforeClose(Cancel As Boolean)
If Not ThisWorkbook.Saved Then
If MsgBox(ThisWorkbook.Name & " Addin" & vbCrLf & "is unsaved. Save?", _
vbExclamation + vbYesNo, "Unsaved Addin") = vbYes Then
If ExcelInstanceCount > 1 Then
MsgBox "More than one Excel instance running." & vbCrLf & _
"Save cancelled", _
vbInformation, "Sorry"
Exit Sub
Else
ThisWorkbook.Save
End If
End If
End If
End Sub
Function GetExcelInstanceCount() As Long
Dim hwnd As Long
Dim i As Long
Do
hwnd = FindWindowEx(0&, hwnd, "XLMAIN", vbNullString)
i = i + 1
Loop Until hwnd = 0
GetExcelInstanceCount = i - 1
End Function
答案 2 :(得分:-1)
使用Application对象的ActiveWorkbook.Save方法而不是ThisWorkbook.Save方法。请看这个链接:http://www.techrepublic.com/blog/microsoft-office/avoid-this-potential-gotcha-when-using-add-ins-to-distribute-excel-macros/