从工作簿B关闭工作簿A中的用户窗体

时间:2014-11-20 14:35:38

标签: excel vba excel-vba userform

我是VBA的新手,所以对这个问题可能有一个简单的答案,但如果有,我肯定没有找到它。我正在做的是将数据从几个工作簿复制到一个主工作簿。我已经写了这个代码,它工作正常。唯一的问题是工作簿中我重新获取数据的用户表单会在工作簿加入时自动启动。这意味着当我运行我的代码来复制数据时,它会挂起每个用户表单并且不会继续,直到我已经关闭每个用户表单。所以我的问题是:有没有办法从我的主工作簿VBA代码远程关闭原始数据工作簿中的用户表单?提前致谢。

3 个答案:

答案 0 :(得分:0)

假设您的意思是在打开工作簿时弹出窗体,请在执行此操作之前禁用事件:

Application.Enableevents = False
Workbooks.Open ...
Application.Enableevents = True

例如。

答案 1 :(得分:0)

我建议尝试

Application.EnableEvents = False

Further reading.

简短说明:将忽略通常在打开或关闭工作簿时触发的所有事件(Workbook_Open,Workbook_BeforeSave等)。

我编写了以下函数来使所有宏更简单(更快)。只需将这些功能放在常规模块中即可。

Public Function CalcOff()
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    Application.EnableEvents = False
End Function
Public Function CalcOn()
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Function

以:

开始你的宏
CalcOff

然后用:

结束你的宏
CalcOn

请记住,您需要在退出正在运行的宏的所有位置放置“CalcOn”。

禁用ScreenUpdating 会使代码“在后台运行”(不会显示任何内容)。

将计算设置为手动可提高代码的速度,因为更改数据时不会进行任何计算。但使用“CalcOn”退出所有宏非常重要,否则您的工作表将无法计算(并且搞笑),看起来Excel已冻结(因为ScreenUpdating仍然会被关闭)。

但是,如果你碰巧打破正在运行的代码而没有以正确的方式退出(运行“CalcOn”),只需关闭Excel应用程序并重新打开它。或者运行以“CalcOn”代码结尾的宏。或者用这个简单的行创建一个新的宏。

答案 2 :(得分:0)

关闭所有用户表单,(如果您需要特定的用户表单,请更改我的代码)

sub Close_Userforms()
Dim Form as VBA.Userform 'if not work change to Object
For each Form in VBA.Userform
    'can add a condition, like :  if Form.name ="Whatever" then
    unload Form 'if you don't want to lose the data from the userforms, Form.Hide, and later re-loop and Form.Show
next Form

编辑:还可以if Typename (Form)="Whatever" then,条件