Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 捕获.XLAM的FileFormat属性而不与.XLSM混淆 上下文_Vba - Fatal编程技术网

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