在vba运行时冻结excel编辑

问题描述:

我有一个我想通过vba脚本编辑的excel表,但我需要用户无法编辑任何单元或在脚本运行时单击任何按钮。由于在excel按钮单击后我弹出的程序,在此VBA子运行期间启用了编辑。我需要的是通过编程锁定所有单元格以进行编辑,除了VBA。我怎样才能做到这一点?在vba运行时冻结excel编辑

Psuedo_Code:

Shell _ "PROGRAM1" 
Shell _ "PROGRAM2" 
Dim shellobject As PROGRAM2 
shellobject.Connect "PROGRAM1" 
shellobject.dothings 
if(shellobject.success) then 
Cells(1,1).Value = "HUZZAH!" 
Else 
Cells(1,1).Value = "OH NO MR BILL!" 
End If 
shellobject.dootherthings 

etc..... 
+2

不确定脚本究竟是从哪里运行的,但通常在运行VBA时无法编辑电子表格。停止脚本的唯一方法是Ctrl + Break。 – 2013-02-15 21:52:47

+0

我可以在运行时进行编辑。它按钮点击运行,轰击两个程序,然后根据从两个带壳程序收到的响应进行编辑。 – steventnorris 2013-02-15 22:02:59

+1

您描述的行为听起来很不寻常 - 在正常情况下,您不能在执行宏期间编辑Excel。你能发布相关的代码吗? – 2013-02-15 22:41:17

当你使用一个用户窗体,将其设置为模式形式的属性对话框(按F4的情况下,它是不可见):

enter image description here

这样,除非关闭,否则用户不能在表单外单击Excel。

此外,您可以尝试在执行过程中禁用按钮。此代码应该这样做:

Private Sub CommandButton1_Click() 
    SetButtonsEnabled False 
    Application.EnableEvents = False 

    'Your code here 

    SetButtonsEnabled 
    Application.EnableEvents = True 

End Sub 

Private Sub SetButtonsEnabled(Optional blnEnable As Boolean = True) 
    Dim btn As Control 
    For Each btn In Me.Controls 
     If TypeOf btn Is CommandButton Then btn.Enabled = blnEnable 
    Next 
End Sub 
+0

我的属性窗口中没有UserForm,只有“Sheet1 Worksheet”。这些按钮直接插入Excel表格。我不相信他们有一个用户表单容器,但用作单独的实体。 – steventnorris 2013-02-19 13:43:19

+1

好的,所以我创建了一个小模式窗体,当Excel工作表中的按钮被点击时(简单的去和取消按钮,没什么奇特的)。这成功地锁定了一切,并设置了按钮的启用属性,使它们不被按下。感谢你在这一个坚持我。 – steventnorris 2013-02-19 14:56:49

你有没有考虑从键盘输入无效。这可能是一种完成你所需要的蛮力方式,但这是一个想法。

您可以使用

Application.DataEntryMode = 

从键盘禁止输入。在脚本启动后将其设置为关闭状态,并在脚本结束之前将其关闭。

再一次,这可以被认为是蛮力,但只是一个想法。

希望有所帮助。

+4

在我们蛮横强制事物的同时,还会添加Application.EnableEvents = False和Application.ScreenUpdating = False。 – 2013-02-15 23:00:12

+0

这不起作用。我已经将Application.DataEntryMode = xlOff添加到开头,并将Application.DataEntryMode = xlOn添加到最后,并且在我的vba子版运行期间仍然启用了编辑。 – steventnorris 2013-02-18 21:34:15

+0

嗯......从上面阅读您的意见,我假定你的子过程类似于这样的东西... '子ExecuteShell 壳牌() 结束Sub' 如果这是在这种情况下,Application.DataEntryMode可能无法正常工作。我们可能需要找到一种不同的方法来停止输入,因为VBA将在shell命令之前完成。你能否确认上面的代码是你的shell执行的方式。你能显示一些shell命令吗? – 2013-02-19 00:40:19

我试图Steventnorris和偶数史蒂芬发表评论,但我不能,所以只是把答案在这里。

Application.DataEntryMode= xlOff in the beginning should be set to 
Application.DataEntryMode= xlOn 
and then at the end of the code 
put in 
Application.DataEntryMode= xlOff 

我只是尝试这样做,它已经阻止了我编辑表这样万一别人正在努力。

继为我工作:

使用Application.Interactive = False在开始和结束时重新启用它。这将禁止用户点击/输入尝试,直到宏/用户表/任何代码部分完成其操作。