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



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

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

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

但是,最后一个打开的工作簿的功能区(顺便说一句,是当前处于活动状态的工作簿(无响应,解决此问题的唯一方法是在打开的窗口之间进行 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

以前有人处理过这个问题吗?

你有什么建议?

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

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

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

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

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

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

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

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

我正在使用 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

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

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

最新更新