Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打开新工作簿Excel 2016 VBA后功能区无响应_Vba_Excel_Excel 2016 - Fatal编程技术网

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

打开新工作簿Excel 2016 VBA后功能区无响应,vba,excel,excel-2016,Vba,Excel,Excel 2016,在编程方面,我是个新手,不过我已经能够在excel中构建一些有用的应用程序,这些应用程序可以自动化我的一些日常任务 目前,我在尝试使用Excel 2016中的workbooks.open()打开新工作簿时遇到了一个恼人的问题 我制作了一个带有按钮的工作簿,该按钮调用userform。表单启动后,用户可以选择下载并打开几种类型的.xls文件。当用户单击表单的OK按钮时,将调用所有适当的函数,打开所选工作簿,并卸载和隐藏表单 但是,上次打开的工作簿(顺便说一句,当前处于活动状态)的功能区没有响应,解

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

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

我制作了一个带有按钮的工作簿,该按钮调用userform。表单启动后,用户可以选择下载并打开几种类型的.xls文件。当用户单击表单的OK按钮时,将调用所有适当的函数,打开所选工作簿,并卸载和隐藏表单

但是,上次打开的工作簿(顺便说一句,当前处于活动状态)的功能区没有响应,解决此问题的唯一方法是在打开的窗口之间按住ALT+TAB键

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

在做了一些实验之后,我能够通过禁用
应用程序来解决这个问题。当调用我的函数时,屏幕更新
,然后在卸载表单之前重新启用它

但是,这仅在同时打开多个工作簿时有效。如果用户选择只打开一个工作簿,则问题仍然存在。 我遇到了一个将userform设置为非模态的建议,这确实解决了这个问题,但却产生了其他不需要的行为

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

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
以前有人处理过这个问题吗


你有什么建议

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

当我仅打开一个工作簿时,在库存excel上遇到同样的问题。在工作簿之后添加此项时,功能区将再次启用。打开:

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

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

我正在使用Excel宏创建新工作簿并用数据填充它们(Office 365)

我也遇到了这样一个问题:宏完成后,新工作簿将部分处于活动状态。我可以在工作簿单元格中工作,但功能区处于非活动状态。切换到新工作簿会激活功能区,但这很麻烦。我注意到在工作簿中单击鼠标右键就足以激活功能区。奇怪,是的。因此,我跟踪了代码,以便在宏完成后强制执行鼠标右键和左键单击事件(如下所示)。这是一个真正的混乱,但它发生得如此之快以至于不可见,并使功能区处于活动状态

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

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

我也面临着这个问题。我在某个地方找到了答案,这个问题可以通过隐藏userform-before-open工作表来解决

所以,只需像这样重新排列命令

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 2016裸机安装。您不需要Load语句。卸载后也不需要使用
。隐藏
。谢谢,知道这一点很有用!然而,这并不能解决我所描述的问题。谢谢你的回答!就我而言,这个问题是随机停止的。但是,如果它再次出现,我将确保尝试您的解决方案!
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