在编程方面,我是一个新手,但是我已经能够在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
之前有没有人处理过此事?
你会建议什么?
答案 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