gpt4 book ai didi

vba - 在 Excel 中对用户隐藏宏但仍通过按钮调用?

转载 作者:行者123 更新时间:2023-12-03 00:20:49 26 4
gpt4 key购买 nike

我有一个电子表格,将分发给同事;我想让它尽可能地用户友好,所以为了运行宏,我有一个简单的按钮,可以为它们自动执行所有操作。但我不希望他们有权自行运行任何宏。

我已经设法使用

做到了这一点
Option Private Module
Public Sub Run_Batch_Report()
'The actual script that works is here, cutting it to skip to the portion that won't work'
Call Misc_Doc
MsgBox ("Report finished.")
End Sub

Public Sub Misc_Doc() 所做的只是从另一个电子表格导入数据并对其进行格式化。

然后让命令按钮通过 application.run 调用模块

Private Sub CommandButton1_Click()
Application.Run "Batching_Module.Run_Batch_Report"
End Sub

做这种类型的工作;就像它似乎运行 Run_Batch_Report 子程序一样好,但该子程序还调用同一模块内的其他子程序来完成工作。除非我在开​​发人员选项中解锁 VB 以进行查看和编辑,否则这些子程序将不会运行。是否可以让子程序完整运行(包括调用同一模块中的其他子程序),或者我是否必须重组我的子程序以仅包含它调用的所有其他子程序?

抱歉,如果我的措辞随意 - 我实际上正在开会,一边听老板们的讲话,一边处理这个问题。

编辑:澄清一下,我已锁定 VB 使其不被查看。当我在脚本仍处于锁定状态时运行脚本时,它将不允许子程序调用模块的其他部分。输入密码解锁 VB 以便查看后,它就可以工作了。

最佳答案

假设“但我不希望他们有权自行运行任何宏”代表“我不希望宏在“宏”窗口中列出”,那么您已经拥有了.

我无法重现您的“除非项目解锁,否则宏不会运行”问题,无论是否涉及 Application.Run ,都不知道这是怎么回事。无论如何,您似乎有一种错误的印象,即使用密码保护您的项目可以为其提供某种安全性。事实并非如此。

VBA code is not secure. VBA project password protection is literally a joke, it only annoys the dev (you!) and prevents clueless users that wouldn't know what to do with the VBE anyway, from viewing source code that they wouldn't understand anyway - and if someone wants to see the code, trust me, they will - in a matter of seconds.

If someone can open the host document, they can get to the VBA code.

用户要么可以运行宏,要么不能。如果用户可以单击按钮来调用某些 VBA 代码,那么他们就有权从任何地方调用该 VBA 代码。

将“隐藏”宏放在标准模块 (.bas) 中,并指定 Option Private Module:

Option Private Module
Option Explicit

Public Sub SomeHiddenMacro()
MsgBox "Hi"
End Sub

然后您仍然可以通过键入宏的名称(不会列出它,因为选项私有(private)模块)来将该宏分配给某些形状:

Excel's "Assign Macro" dialog

点击按钮,看看它是否工作:

Message box shows up

形状的格式可以比任何 ActiveX 按钮看起来更漂亮:

"Run batch report" button with gradient shading and 3D bevel

不需要比这更复杂。

<小时/>

优雅的解决方案

您是从 VBA 开始的,所以我认为您还没有太多地玩弄类模块。类模块的好处之一是它们的公共(public)成员不能作为宏调用,因为类模块在运行时不存在 - 它们是类型,而不是模块。为了使类型具有任何意义,它需要实例化 - 而宏运行器不会这样做。

因此,将“worker”代码放入类模块中,例如 BatchReport:

Option Explicit

Public Sub Run()
'TODO: do your thing
End Sub

现在,在附加到按钮的宏中(或在 ActiveX 按钮的 Click 处理程序中),您要做的就是使用 New 关键字创建该对象的实例,并调用其 Run 方法:

Option Private Module
Option Explicit

Public Sub RunBatchReport()
With New BatchReport
.Run
End With
End Sub

这里我有一个 With block 来保存对象引用。或者,您可以声明一个对象变量,并将其Set引用指向BatchReport类的New实例:

Option Private Module
Option Explicit

Public Sub RunBatchReport()
Dim report As BatchReport
Set report = New BatchReport
report.Run
End Sub

关于vba - 在 Excel 中对用户隐藏宏但仍通过按钮调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45818942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com