保存xlam文件

时间:2012-04-18 09:52:09

标签: excel excel-vba vba

我有一个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

3 个答案:

答案 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/