捕获.XLAM的FileFormat属性而不会与.XLSM混淆

时间:2015-01-20 16:30:16

标签: vba

上下文

我开发了一个包含用户数据的.xlam加载项。换句话说,用户可以决定通过ThisWorkbook.IsAddIn = False显示加载项文件来编辑内容,该内容对加载项本身起作用。

然而,当用户处理加载项的电子表格而不是正常情况时,用户不应该执行某些操作加载项正在运行的工作簿。

需要检查文件扩展名

从这里开始,我需要检查文件扩展名并在某些特定的"禁止"程序可能会被调用。我做了以下测试:

  • 如果ThisWorkbook.IsAddIn = True,则ThisWorkbook.FileFormat = 55;
  • 如果ThisWorkbook.IsAddIn = False,则ThisWorkbook.FileFormat = 52;

混乱的根源

这不是我所期待的。只需在加载项设置为可见时执行FullName请求

ThisWorkbook.IsAddIn = False
MsgBox ThisWorkbook.FullName

我可以读到我的文件仍被命名为C:\myFile.xlam,即使在那一刻对用户可见。因此,即使在运行时可见,我也希望ThisWorkbook.FileFormat提升55。但显然,它并没有做到这一点。

问题

我需要确保在用户创建的可能的.xlsm文件上区分加载项(.xlam)上的修改和修改,从中使用我的添加-in 。 为什么我的加载项的FileFormat等于xlsm的加载项,如果文件明确xlam55而不是52相关联{1}}?我哪里错了?

编辑 - 禁止

的动作示例

在功能区上,有一个从加载项创建并添加的按钮,该加载项连接到无法运行到加载项中的宏。所以我想到的检查是这样的:

If ActiveWorkbook.FileFormat = 55 Then
    Exit Sub
End If 

但是,如上所述,此检查不会执行,因为加载项在设置为FileFormat = 52的时刻有.IsAddIn = False;因此,即使ActiveWorkbook是加载项,我想要运行宏,检查也会失败,宏仍然会运行。

2 个答案:

答案 0 :(得分:1)

.IsAddIn workbook property simply indicates whether the file is being run as an Add-in。它不会更改文件格式。来自文档:

  

将此属性设置为True时,工作簿具有以下特征:

     
      
  • 如果在工作簿打开时进行了更改,则不会提示您保存工作簿。
  •   
  • 工作簿窗口将不可见。
  •   
  • 工作簿中的任何宏都不会显示在“宏”对话框中(通过指向“工具”菜单上的“宏”并单击“宏”来显示)。
  •   
  • 工作簿中的宏仍然可以从“宏”对话框运行,即使它们不可见。此外,宏名称不需要使用工作簿名称限定。
  •   
  • 打开工作簿时按住SHIFT键无效。
  •   

我觉得这是你试图解决的真正问题:

  

但是,当用户处理加载项的电子表格而不是加载项的正常工作簿时,用户不应该执行某些操作。运行

如果您可以指定您尝试限制的操作,也许最好?可能有更好的方法来解决这个问题。

答案 1 :(得分:1)

目前我已经找到了四种可能的解决方案,我将在这里发布,以防有​​人遇到同样的问题:

比较全名 - 感谢Tim Williams

"特殊代码"如果全名不同,则无法运行

If ActiveWorkbook.FullName = ThisWorkbook.FullName Then
    Exit Sub
End If
'"special code"

比较isAddIn属性 - 奖励给David Zemens

"特殊代码"如果此工作簿当前不是加载项

,则无法运行
If ThisWorkbook.IsAddIn = False Then
    Exit Sub
End If
'"special code"

比较两个对象

"特殊代码"如果活动工作簿是加载项工作簿

,则无法运行
If ActiveWorkbook Is ThisWorkbook Then
    Exit Sub
End If 
'"special code"

检查" xlam"扩展

"特殊"如果文件的扩展名为xlam:

,则不会运行代码
If Right(ActiveWorkbook.FullName,4) = "xlam" Then
    Exit Sub
End If

上述四个解决方案可以正常运行,但问题仍然存在:为什么FileFormat属性会因ThisWorkbook.IsAddIn False而改变同一文件比True