使用userform

时间:2017-01-25 21:01:51

标签: excel vba excel-vba

我有一个宏打开用户表单来捕获开始和结束日期。在用户窗体上单击“确定”后,将打开一个文件对话框以选择要打开的Excel工作簿。

在运行下面的sub之后,我无法通过使用右上角的“X”关闭打开的工作簿。我也无法通过单击保存图标来保存工作簿。

但是,如果我单击另一个工作簿或切换到打开的工作簿中的另一个工作表,然后单击返回到该工作簿打开的工作簿,则一切都按预期工作。

另外,我用两个输入框替换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”时它才会关闭。

更新

我能够获得代码,无需更改,可以在Excel 2016上在家中正常工作。我今天将让同事在他们的系统上进行测试。

当我在家时,我没有按下按钮来调用工作表上的sub。我从VBA编辑器中调用它。经过今天早上的一些测试后,似乎按钮就是问题所在。如果我从VBA编辑器调用sub,我可以关闭打开的工作簿。但是,如果我使用命令按钮(窗体控件,而不是ActiveX,因为我得到一个错误说“无法绘制对象”,每当我尝试将任何类型的ActiveX对象添加到工作表时)打开的工作簿将不会关闭。

我认为我发现了问题

这个问题似乎与'表单控制命令按钮'有关。在信任中心禁用了ActiveX。当我启用它并创建一个命令按钮时,我能够关闭打开的工作簿。然后我再次尝试了命令表单按钮,无法关闭打开的工作簿。当我从开发人员选项卡中的子列表框中运行sub时,以及当我将sub放在Excel Ribbon中并从那里运行它时,我也成功地关闭了打开的工作簿。

为什么控制表单命令按钮会导致此问题?

2 个答案:

答案 0 :(得分:0)

问题的根源是2013年使用多个excel接口的更改.Microsoft解决了此page SDI问题解决方案部分中的问题。

  

单击红色" X"无法关闭工作簿。关闭按钮时   该工作簿通过模态用户表单以编程方式打开。至   解决此问题,建议您添加以下内容   代码到用户表单布局事件过程然后打开用户   形式无模式

Private Sub UserForm_Layout()
    Static fSetModal As Boolean
    If fSetModal = False Then
        fSetModal = True
        Me.Hide
        Me.Show 1
    End If
End Sub
     

另一种选择是打开工作簿窗口,激活任何其他窗口   窗口,然后重新激活工作簿窗口。你现在应该   能够使用“关闭”按钮关闭工作簿。

所以这些是他们提出的两个选项,我想出了一个。

选项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

答案 1 :(得分:0)

尝试// Aggregation Pipeline Stages [ // Stage 1 { $match: { "_id" : "1" } }, // Stage 2 { $unwind: { path : "$items_viewed", } }, // Stage 3 { $project: { "item" : "$items_viewed", "buyed" : { $cond: { if: { $in: [ "$items_viewed" , "$items_buyed" ] }, then: 1, else: 0 } } } }, ] 以Modal = False打开(在用户窗体可见时运行宏)打开它

别忘了以后再添加fileOpenerForm Show 0

fileOpenerForm.HideLoad fileOpenerForm也可能有用