excel vba-有没有办法防止宏按钮垃圾邮件?

时间:2018-06-19 12:26:10

标签: excel vba excel-vba error-handling runtime-error

我有一个带有几个宏按钮的工作表,它们的功能都稍有不同,而且一切正常,除非用户垃圾邮件迅速地单击了不同的按钮。

我没有足够的经验来知道这是常见问题还是代码工作方式的问题,但是如果单击宏按钮并在单击另一个按钮之前正确执行,似乎一切正常。即使垃圾邮件单击相同的宏按钮似乎也可以正常工作,但是一旦连续两次单击两个或多个,代码将无法正确执行。

代码本身只是查找具有特定值的单元格,并添加或删除行,有时还可以从工作表的其他区域进行复制和粘贴。例如,如果您要单击按钮X以找到工作表的X部分并在其下方添加一行,而垃圾邮件则单击按钮Y以找到工作表的Y部分并删除其上方的一行,则按钮Y将无法找到它需要找到(即使它存在)它的单元格,并触发一个错误消息框,告诉用户Y部分似乎丢失了,与此同时,按钮X本身也会遇到一些奇怪的问题,例如删除错误的行,就像它预期/补偿了什么一样它期望Y做。

我尝试在宏的开头为每个命令按钮使用CommandButton1.Enabled = False,并在每个宏的末尾再次启用按钮,但是无论宏执行期间如何,我仍然可以通过垃圾邮件单击按钮。

是否有一种简单的方法可以防止在当前宏代码运行之前单击其他宏按钮?我尝试禁用和启用按钮,尝试添加等待时间。如果无法解决此问题,我可能会选择保存一个重复的隐藏工作表,该工作表会在出错时被取消隐藏,而问题工作表已删除,则将在用户一直创建并隐藏另一个重复的“备份”副本通知您不要向宏按钮发送垃圾邮件。

3 个答案:

答案 0 :(得分:1)

我建议使用UserForm来托管您的activeX控件,或者如果您只有一个或两个按钮,请将其替换为工作表上的超链接,并在worksheet.followhyperlink事件中使用以下代码来检查单击了哪个超链接:< / p>

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
    If Target.Range.Address(False, False) = "A1" Then MsgBox ("Woah I clicked cell A1!")
End Sub

如果您有一个启用了按钮的userForm,则可以使每个按钮单击隐藏表单,直到宏自动完成:

Private Sub CommandButton1_Click()
UserForm1.Hide
    ' Do the macro stuff
UserForm1.Show
End Sub

答案 1 :(得分:1)

这是基于以下观察结果:

看不见的内容,无法单击。

所有按钮(无论是表单按钮,ActiveX按钮还是自选图形)均为Shapes。所有Shapes要么是Visible,要么不是Visible

如果Shape不是Visible,则无法单击它。因此,每个按钮子的开头都包含对以下内容的调用:

Sub HideAllButtons()
    Dim s As Shape
    For Each s In ActiveSheet.Shapes
        s.Visible = False
    Next s
End Sub

并在按钮代码的末尾包含对以下内容的调用:

Sub ShowAllButtons()
    Dim s As Shape
    For Each s In ActiveSheet.Shapes
        s.Visible = True
    Next s
End Sub

因此,在运行任何按钮时,用户都无法单击任何其他按钮。

答案 2 :(得分:1)

在每个按钮的开头添加一个对全局变量的检查。仅当没有其他按钮同时运行时,才运行按钮的代码。

万一Chronocidal建议,如果代码需要更长的时间运行,我添加了图标更改,以表明代码正在运行时程序正忙。

Public Running As Boolean

Private Sub CommandButton1_Click()
If Running = False Then
    Running = True
    Application.Cursor = xlWait        

    ' Your Buttons Code

    Running = False
    Application.Cursor = xlDefault
Else ' (Optional)
    MsgBox ("I'm busy, try again later!")
End If

End Sub