我有一个宏打开用户窗体来捕获开始和结束日期 . 在用户窗体上单击“确定”后,将打开一个文件对话框以选择要打开的Excel工作簿 .
在我运行下面的sub之后,我无法通过使用右上角的“X”关闭打开的工作簿 . 我也无法通过单击保存图标来保存工作簿 .
但是,如果我单击另一个工作簿或切换到打开的工作簿中的另一个工作表,然后单击返回由子工作簿打开的工作簿,一切都按预期工作 .
此外,我用两个输入框替换userform,以捕获两个日期中的每一个,我能够关闭打开的工作簿没有问题 .
也许用户形式代码有一些有趣的东西?
这就是userform中的全部内容 .
Private Sub Ok_button_Click()
call module1.forecast
unload userform1
end Sub
而这是主要的子 .
Sub forecast()
dim start_SFY as long
dim end_SFY as long
dim filesToOpen as object
dim wb as workbook
Application.ScreenUpdating= False
start_SFY = userform1.textbox1.value
end_SFY = userform1.textbox2.value
set filesToOpen = application.fileDialog(msoFileDialogOpen)
filesToOpen.show
set wb = application.workbooks.open(filesToOpen.selecteditems(1),false)
Application.ScreenUpdating= True
End Sub
这是显示userform1的子
Sub run_userform()
userform1.show
End Sub
另外,这是Excel版本:
Excel 2013 64位(15.04753.1003)Microsoft Office 365 ProPlus的一部分
有人可能会尝试复制我所拥有的问题吗?我想知道这是否是与我雇主的Excel版本有关的问题?
从来没有发生过这种事情 .
另外,我可以用VBA关闭程序 . 只是在尝试点击它不会关闭的'X'时 .
Update:
我能够在没有任何变化的情况下获得代码,以便在Excel 2016上在家中正常工作 . 我今天要让同事在他们的系统上进行测试 .
当我在家时,我没有按一个按钮来调用工作表上的子 . 我从VBA编辑器中调用它 . 经过今天早上的一些测试后,似乎按钮就是问题所在 . 如果我从VBA编辑器调用sub,我可以关闭打开的工作簿 . 但是,如果我使用命令按钮(窗体控件,而不是ActiveX,因为我得到一个错误说“无法绘制对象”,每当我尝试将任何类型的ActiveX对象添加到工作表时)打开的工作簿将不会关闭 .
I think I have found the problem
这个问题似乎与'表单控制命令按钮'有关 . 在信任中心禁用了ActiveX . 当我启用它并创建一个命令按钮时,我能够关闭打开的工作簿 . 然后我再次尝试了命令表单按钮,无法关闭打开的工作簿 . 当我从开发人员选项卡中的子列表框中运行sub时,我也成功地关闭了打开的工作簿,当我将sub放在Excel Ribbon中并从那里运行它时 .
任何关于为什么控制表单命令按钮会导致此问题的想法?
2 回答
该问题的根源是在2013年更改为使用多个excel接口.Microsoft在page的 Solutions for SDI Issues 部分中解决了该问题 .
所以这些是他们提出的两个选项,也是我提出的两个选项 .
选项1)您可以使用代码将对话框切换为无模式,或者在用户窗体中将ShowModel属性设置为false .
选项2)正如您所发现的,在通过模态用户表单打开后手动切换工作簿会重新同步所有内容 . 对我的代码用户来说不是一个好的解决方案,我不建议依赖它 .
选项3)值得一提的是,如果您不通过用户表单打开文件,则没有问题 . 因此,如果userform需要做的最后一件事是打开文件,您可以轻松地将文件路径保存在字符串中,卸载麻烦的用户窗体并在关闭后移动workbooks.open调用 . 这是我的意思的一个例子
并且在userform中沿着这些行创建文件名,其中文件名是基于userform参数和列表框选择创建的:
尝试
fileOpenerForm Show 0
以Modal = False打开它(在Userform可见的情况下运行宏)不要忘记稍后添加
fileOpenerForm.Hide
.此外
Load fileOpenerForm
和Unload fileOpenerForm
可能有用