0

我有一个 xl 加载项(.xlam 文件),它使用其中一张表来存储从用户窗体收集的数据。

如果 Excel 关闭,那么我希望此文件将自身保存在加载项目录中。

当前在这里:
C:\Users\myName\AppData\Roaming\Microsoft\AddIns\ExcelStartUp_ExcelVersion.xlam

在插件关闭前的事件中,我有以下内容:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Save
End Sub

看起来不错,但它将 xlam 的副本保存到 CurDir 的任何内容中。所以它在我们的文件系统周围复制自己!

如果我在 xlam 文件的代码窗口之一并打开立即窗口,则以下两行不一致!:

 ?ThisWorkbook.Path
 ?Thisworkbook.fullname
4

3 回答 3

1

我一直遇到同样的问题,发现它是由插件在某些情况下将其只读状态更改为 True 引起的(无法准确指出在哪种情况下,但似乎与打开多个 Excel 实例有关)。

因此,解决方案是在您的代码中添加一个检查,如下所示:

If ThisWorkbook.ReadOnly = False Then
    ThisWorkbook.Save
End If
于 2019-11-26T14:11:07.800 回答
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
于 2012-04-18T14:48:53.283 回答
-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/

于 2014-06-18T15:57:13.827 回答