Vba 捕获.XLAM的FileFormat属性而不与.XLSM混淆 上下文
我开发了一个Vba 捕获.XLAM的FileFormat属性而不与.XLSM混淆 上下文,vba,Vba,我开发了一个.xlam插件,其中包含用户数据。换句话说,用户可以决定通过ThisWorkbook.IsAddIn=False来显示外接程序文件,以编辑内容,这对外接程序本身起作用 但是,用户在处理外接程序的电子表格时,而不是在运行外接程序的正常工作簿上,应该不能执行某些操作 需要检查文件扩展名 从这里开始,我需要检查文件扩展名,并在调用某些特定的“禁止”过程时验证它。我做了以下测试: 如果thiswoolk.IsAddIn=True,则thiswoolk.FileFormat=55 如果thi
.xlam
插件,其中包含用户数据。换句话说,用户可以决定通过ThisWorkbook.IsAddIn=False
来显示外接程序文件,以编辑内容,这对外接程序本身起作用
但是,用户在处理外接程序的电子表格时,而不是在运行外接程序的正常工作簿上,应该不能执行某些操作
需要检查文件扩展名
从这里开始,我需要检查文件扩展名,并在调用某些特定的“禁止”过程时验证它。我做了以下测试:
- 如果
,则thiswoolk.IsAddIn=True
李>thiswoolk.FileFormat=55
- 如果
,则thiswoolk.IsAddIn=False
李>thiswoolk.FileFormat=52
FullName
请求:
ThisWorkbook.IsAddIn = False
MsgBox ThisWorkbook.FullName
我可以读到我的文件仍然命名为C:\myFile.xlam
,即使在那一刻用户是可见的。因此,我希望thiswoolk.FileFormat
即使在运行时可见,也会引发55
。但很显然,它并没有做到这一点
问题
我需要确保区分外接程序(.xlam)上的修改和用户创建的可能的.xlsm文件(使用我的外接程序)上的修改。
为什么我的外接程序的FileFormat
等于xlsm
,如果文件显然是xlam
,并且与55
而不是52
关联?我哪里错了
编辑-禁止操作的示例
功能区上有一个从外接程序创建和添加的按钮,该按钮连接到无法在外接程序中运行的宏。所以我想到的支票是这样的:
If ActiveWorkbook.FileFormat = 55 Then
Exit Sub
End If
但是,如上所述,将不执行此检查,因为加载项在设置为时具有FileFormat=52
。IsAddIn=False
;因此,即使ActiveWorkbook
是我不想运行宏的外接程序,检查也将失败,宏仍将运行 。它不会更改文件格式。从文件中:
将此属性设置为True时,工作簿具有以下特征:
- 如果在工作簿打开时进行了更改,则不会提示您保存工作簿
- 工作簿窗口将不可见
- 工作簿中的任何宏在“宏”对话框中都不可见(通过指向“工具”菜单上的“宏”并单击“宏”来显示)
- 工作簿中的宏即使不可见,也可以从“宏”对话框中运行。此外,宏名称不需要使用工作簿名称限定
- 打开工作簿时按住SHIFT键无效
如果您可以指定您试图限制的操作,也许这将是最好的?也许有更好的方法来解决这个问题。目前我已经找到了四种可能的解决方案,我将在这里发布,以防有人会遇到我同样的问题: 比较全名-归功于Tim Williams 如果全名不同,“特殊代码”将无法运行: 比较伊萨丁地产-信贷与大卫·泽门斯 如果此工作簿当前不是外接程序,则无法运行“特殊代码”: 比较两个对象 如果活动工作簿是外接程序工作簿,则“特殊代码”无法运行: 正在检查“xlam”扩展名 如果文件扩展名为xlam,则不会运行“特殊”代码:
上述四种解决方案在这方面效果很好,但问题仍然存在:为什么同一个文件的
FileFormat
属性会根据ThisWorkbook发生变化。IsAddIn
是False
而不是True
?谢谢你的回答,你在强调我真正的目标时说得对了。我已经编辑了我的问题的主体,我希望它现在更清晰。我认为蒂姆在上面评论中的建议可能是正确的。似乎您可以比较工作簿的.Name
属性,您可能还需要根据特定的限制/需要检查.IsAddIn
属性,但这应该会解决问题,不是吗?您是对的,也没有想过!从我上面的回答可以看出,目前我已经找到了几种解决方案,但真正的问题仍然存在:如果文件仍然相同,为什么FileFormat
属性会发生变化?我在文档中没有找到任何东西。不,这不是“真正的问题”,这只是为了满足您的好奇心,因为您的实际实现问题已经解决:)可能是一个bug,也可能是设计造成的,也就是说,可能有一些文件的后台副本以其他格式保存,暂时…MS缺少很多方面的文档:-)如果要阻止的代码正在外接程序中运行,则测试ThisWorkbook.Name=ActiveWorkbook.Name
是不够的?@TimWilliams,可能是Name属性太弱(用户可能将该文件命名为外接程序)但是你给了我一个很好的使用.FullName
的输入,谢谢!
If ActiveWorkbook.FullName = ThisWorkbook.FullName Then
Exit Sub
End If
'"special code"
If ThisWorkbook.IsAddIn = False Then
Exit Sub
End If
'"special code"
If ActiveWorkbook Is ThisWorkbook Then
Exit Sub
End If
'"special code"
If Right(ActiveWorkbook.FullName,4) = "xlam" Then
Exit Sub
End If