我有一个宏打开用户表单来捕获开始和结束日期。在用户窗体上单击“确定”后,将打开一个文件对话框以选择要打开的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中并从那里运行它时,我也成功地关闭了打开的工作簿。
为什么控制表单命令按钮会导致此问题?
答案 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.Hide
和Load fileOpenerForm
也可能有用