打开新工作簿Excel 2016 VBA后无响应功能区

时间:2018-06-13 13:00:39

标签: excel vba excel-vba excel-2016

在编程方面,我是一个新手,但是我已经能够在excel中构建一些有用的应用程序,这可以自动完成我的一些日常任务。

目前,在Excel 2016中尝试使用workbooks.open()打开新工作簿时,我遇到了一个恼人的问题。

我用一个调用userform的按钮创建了一个工作簿。启动表单后,用户可以选择下载并打开几种类型的.xls文件。当用户单击表单的“确定”按钮时,将调用所有相应的函数,打开所选的工作簿并卸载并隐藏表单。

但是,打开的最后一个工作簿的功能区,即btw是当前活动的功能区,没有响应,唯一可以解决此问题的方法是打开窗口之间的ALT + TAB。

似乎“焦点”仍然在按钮的初始工作簿上,因为如果我在卸载表单后调用Msgbox,那就是它出现的位置。值得一提的是,尽管初始工作簿不是活跃的工作簿,但仍会发生这种情况!

在做了一些实验之后,我能够通过在调用我的函数时禁用Application.ScreenUpdating来解决问题,然后在卸载表单之前重新启用它。

但这仅适用于同时打开多个工作簿的情况。如果用户选择仅打开一个工作簿,则问题仍然存在。 我遇到了一个建议,使用户形态无模式,这确实解决了问题,但创造了其他类型的不需要的行为。

复制问题的代码的简化版本如下:

Private Sub CommandButton1_Click()
Application.ScreenUpdating = False 'solves the issue but only for multiple files - comment out to replicate the problem
If OptionButton1 Then
    Workbooks.Open ("http://www.admie.gr/fileadmin/user_upload/reports/DayAheadSchedulingUnitAvailabilities/20180602_DayAheadSchedulingUnitAvailabilities_01.xls")
Else
    Workbooks.Open ("http://www.admie.gr/fileadmin/user_upload/reports/DayAheadSchedulingUnitAvailabilities/20180603_DayAheadSchedulingUnitAvailabilities_01.xls")
    Workbooks.Open ("http://www.admie.gr/fileadmin/user_upload/reports/DayAheadSchedulingUnitAvailabilities/20180604_DayAheadSchedulingUnitAvailabilities_01.xls")
End If
Application.ScreenUpdating = True 'solves the issue but only for multiple files - comment out to replicate the problem
Unload UserForm1
UserForm1.Hide
MsgBox ActiveWorkbook.Name 'for debugging purposes - comment out to replicate the problem - the msgbox will be displayed on the workbook which called the userform, although it's not the active one
End Sub

Sub Button1_Click() 'calls the userform
UserForm1.OptionButton1.Value = True
Load UserForm1
UserForm1.Show vbModeless 'comment out to replicate the problem - solves the issue but creates unwanted behavior
End Sub

之前有没有人处理过此事?

你会建议什么?

4 个答案:

答案 0 :(得分:1)

当我只打开一张工作簿时,我在股票Excel上也遇到了同样的问题。在Workbooks.open之后添加此功能区时,将再次启用功能区:

    ThisWorkbook.Activate
    Workbooks("*openedWorkbookName*").Activate

顺便说一句,在工作表中选择当前未激活的单元格时,一些较旧的代码会导致运行时错误。这也有助于解决该问题。

答案 1 :(得分:1)

我知道已经过去了几年,但是我认为这可以帮助某人。

我也面临这个问题。我在某个地方找到了答案,该问题可以通过在打开工作表之前隐藏用户表单来解决。

因此,只需重新排列这样的命令即可。

Private Sub CommandButton1_Click()
UserForm1.Hide 'or Me.Hide
If OptionButton1 Then
    Workbooks.Open ("filename.xls")
Else
    Workbooks.Open ("filename1.xls")
    Workbooks.Open ("filename2.xls")
End If
Unload UserForm1 'if you still want it
End Sub

答案 2 :(得分:0)

您是否在标准之外的Excel上启用了任何加载项。例如,我使用名为ASAP的Utility产品,当我启动excel时,触发事件的可执行文件会相互覆盖。它会在我第一次打开excel时锁定功能区,所以每次打开我的第一个excel后我都会创建一个新的excel

答案 3 :(得分:0)

我正在使用Excel宏来创建新工作簿并向其中填充数据(Office 365)。

Public New_Wb As Workbook
Public New_Book_Name as String

Workbooks.Add
New_Book_Name = ActiveWorkbook.Name
Set New_Wb = ActiveWorkbook

我也遇到了一个问题,即宏完成后,新工作簿将部分处于活动状态。我可以在工作簿单元中工作,但是功能区未激活。跳开并跳回到新工作簿激活了功能区,但这很烦人。我注意到在工作簿中右键单击足以激活功能区。很奇怪,是的。因此,我跟踪了代码,以在宏完成后强制执行鼠标右键单击事件,然后单击鼠标左键完成事件(如下)。这是一个真正的冲突,但是发生得如此之快以至于它不可见,并使功能区处于活动状态。

Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4
Public Const MOUSEEVENTF_RIGHTDOWN As Long = &H8
Public Const MOUSEEVENTF_RIGHTUP As Long = &H10

...在填充工作簿之后...

New_Wb.activate

mouse_event MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0
mouse_event MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0

mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0