Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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
Excel 在VBA中以编程方式锁定项目_Excel_Vba - Fatal编程技术网

Excel 在VBA中以编程方式锁定项目

Excel 在VBA中以编程方式锁定项目,excel,vba,Excel,Vba,在工作中,我们使用VBA,目前他们希望锁定我们用宏生成的报告 我一直在尝试自动锁定一个项目(给定密码和工作簿名),我已经部分成功地使用了以下代码块(我在那里找到的代码组合以及SO中的一些问题)。它以某种方式执行手动操作(转到vbaprojects属性,然后锁定) 这段代码的问题是,有时运行良好,有时不运行。我对这种“不确定”的行为有点困惑。有人能解释一下这个问题吗 谢谢 包括检查项目是否已被保护/锁定,如果项目已被锁定,则不要尝试锁定它 If Workbooks(nameWorkbookForM

在工作中,我们使用VBA,目前他们希望锁定我们用宏生成的报告

我一直在尝试自动锁定一个项目(给定密码和工作簿名),我已经部分成功地使用了以下代码块(我在那里找到的代码组合以及SO中的一些问题)。它以某种方式执行手动操作(转到vbaprojects属性,然后锁定)

这段代码的问题是,有时运行良好,有时不运行。我对这种“不确定”的行为有点困惑。有人能解释一下这个问题吗


谢谢

包括检查项目是否已被保护/锁定,如果项目已被锁定,则不要尝试锁定它

If Workbooks(nameWorkbookForMarket).VBProject.Protection = 1 Then Exit Sub
您还希望确保正确的项目处于活动状态,因此:

Set vbProj = Workbooks(nameWorkbookForMarket).VBProject

Set Application.VBE.ActiveVBProject = vbProj

If vbProj.Protection = 1 Then Exit Sub
' send keys


另一种方法是将报告的过程分为两部分,将代码保存在单独的工作簿中。在我看来,继续创建包含代码的新报告/工作簿是不寻常的。注释中的线索不是,如果它被锁定,这将解锁它吗?我建议不要使用
SendKeys
FindControl
/
Execute
。有一些方法可以直接调用。例如,@AndyG是的,它也会解锁,但这不是问题所在。问题是,当我生成一个以前从未被锁定过的新文件时,有时会失败。@我不愿意保护工作表,我愿意保护excel文件FWIW的代码。此外,纯文本、硬编码密码甚至更无用。这个锁是安全剧场,任何想要得到密码的人都会得到密码。如果您需要实际保护(我与该产品没有关联),请使用。好的,是的,您的检查是正确的,但无法解决问题。我遇到的问题是,不知何故,宏就像更改上下文一样,可能在另一个位置执行CTRL+TAB键,而不是在VBA项目属性选项卡中,因此它会扰乱整个工作流。我可以在这个过程中强制VBA是原子的吗?同样感谢您的选择,但我们正在寻找创建的文件上有一些宏,因此,我仍然有关于前提的问题,虽然,“他们想锁定报告,我们生成的宏”。如果您使用宏创建报表,为什么这些报表(例如工作簿)中包含代码?我有一个excel工作表,上面有许多选项卡(我们称之为excel)。这个文件有一个按钮,生成一个新的Excel文件(b),其中有一些标签来自A。我们想要保存从一个标签中获取的宏,这样我们就可以拥有一个与A相同的宏文件,而不是一个与我们的客户不相关的其他标签。MMM我会考虑创建和锁定。一个启用宏的模板(.xltm),然后基于此模板创建报告。您可以完全控制模板,然后在基于模板创建新报告时,项目文件将被锁定。
Set vbProj = Workbooks(nameWorkbookForMarket).VBProject

Set Application.VBE.ActiveVBProject = vbProj

If vbProj.Protection = 1 Then Exit Sub
' send keys