首页 文章

使用userform运行sub后无法关闭工作簿

提问于
浏览
0

我有一个宏打开用户窗体来捕获开始和结束日期 . 在用户窗体上单击“确定”后,将打开一个文件对话框以选择要打开的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 回答

  • 0

    该问题的根源是在2013年更改为使用多个excel接口.Microsoft在pageSolutions for SDI Issues 部分中解决了该问题 .

    当通过模式用户表单以编程方式打开该工作簿时,单击红色的“X”关闭按钮无法关闭工作簿 . 若要解决此问题,建议您将以下代码添加到用户窗体布局事件过程,然后将用户窗体打开为无模式Private Sub UserForm_Layout()
    静态fSetModal为布尔值
    如果fSetModal = False那么
    fSetModal = True
    Me.Hide
    我 . 展示1
    万一
    结束子
    另一个选项是打开工作簿窗口,激活任何其他窗口,然后重新激活工作簿窗口 . 您现在应该可以使用“关闭”按钮关闭工作簿 .

    所以这些是他们提出的两个选项,也是我提出的两个选项 .

    选项1)您可以使用代码将对话框切换为无模式,或者在用户窗体中将ShowModel属性设置为false .

    选项2)正如您所发现的,在通过模态用户表单打开后手动切换工作簿会重新同步所有内容 . 对我的代码用户来说不是一个好的解决方案,我不建议依赖它 .

    选项3)值得一提的是,如果您不通过用户表单打开文件,则没有问题 . 因此,如果userform需要做的最后一件事是打开文件,您可以轻松地将文件路径保存在字符串中,卸载麻烦的用户窗体并在关闭后移动workbooks.open调用 . 这是我的意思的一个例子

    Public EDIT_FILE_DIRECTORY As String
    
    Public Sub Main()
    
        fileOpenerForm.Show 
    
        If EDIT_FILE_DIRECTORY <> "" Then
            Call Workbooks.Open(EDIT_FILE_DIRECTORY)
        End If
    
    End Sub
    

    并且在userform中沿着这些行创建文件名,其中文件名是基于userform参数和列表框选择创建的:

    Private Sub OpenSelectedWorkbooks_Button_Click()
    
        Dim workbookName As String
    
        workbookName = selectionList.Item(Me.FileSelection_ListBox.ListIndex + 1)
    
        EDIT_FILE_DIRECTORY = ROOT_DIR & GetSelectedSubfolder & "\" & workbookName
    
        Unload Me
    
    End Sub
    
  • 0

    尝试 fileOpenerForm Show 0 以Modal = False打开它(在Userform可见的情况下运行宏)

    不要忘记稍后添加 fileOpenerForm.Hide .

    此外 Load fileOpenerFormUnload fileOpenerForm 可能有用

相关问题