Vba 无法关闭打开的excel工作簿
我正在用命令按钮、用户表单等构建一个excel文件,其中包含指向其他工作簿的链接 对于我的工作表上的commandbuttons,我使用与我的userforms中commandbuttons相同的代码:Vba 无法关闭打开的excel工作簿,vba,excel,Vba,Excel,我正在用命令按钮、用户表单等构建一个excel文件,其中包含指向其他工作簿的链接 对于我的工作表上的commandbuttons,我使用与我的userforms中commandbuttons相同的代码: workbooks.open "path" 通过userform命令按钮,添加了以下内容 unload me 当我通过userform打开工作簿时,我无法随后关闭它。我必须先激活工作簿,然后激活打开的工作簿,然后才能将其关闭 我曾尝试在“工作簿.打开”前后放置“卸载我”,但这并没有改变任何事
workbooks.open "path"
通过userform命令按钮,添加了以下内容
unload me
当我通过userform打开工作簿时,我无法随后关闭它。我必须先激活工作簿,然后激活打开的工作簿,然后才能将其关闭
我曾尝试在“工作簿.打开”前后放置“卸载我”,但这并没有改变任何事情
我也尝试了以下方法,但也不起作用:
unload me
dim wb as workbook
set wb = workbooks.open"pathname"
wb.activate
有人有什么想法吗
现在的情况示例:
需要有人计算一下价格。他们在我的文件中打开价格用户表单。他们点击按钮“calculationfile”。此时将打开calculationfile。他们在那里进行了计算,现在他们在计算文件中完成了。所以他们想通过点击十字架来关闭它。但是他们不能点击十字架。然后他们切换到任务栏上的“我的文件”,然后切换回计算文件。现在他们可以点击十字架了
我不明白为什么他们不能第一次单击它,但他们可以在我的工作簿和打开的工作簿之间切换后单击它。
卸载
只影响用户表单
尝试向打开的工作簿添加引用,然后按如下方式关闭它:
dim wb as Workbook
set wb = Workbooks.Open "pathname"
wb.activate
' do whatever with it while it's open
wb.Close
如果您正在执行的任何操作都不是自动执行的,则表单上需要一个按钮,该按钮将设置对工作簿的引用,并在用户完成编辑后将其关闭。如果将打开的工作簿定义为变量,则可以轻松关闭它们。请记住,这不会保存工作簿
Dim DataBook As Workbook
Set DataBook = Workbooks.open ("pathname")
' Do something useful with the file
DataBook.Close
现在还不完全清楚你想问什么,但我会尽我所能给你一个完整的答案。如果在关闭用户窗体时,
Unload Me
语句没有成功,请尝试在VBA中指定完整的窗体名称。即:
Unload UserFormName
如果试图关闭(通过用户窗体)打开的工作簿,可以使用工作簿。关闭方法:
Dim wb as Workbook
Set wb = Workbooks.Open(Filename:="C:\example.xls")
wb.Activate
'Close workbook
wb.Close
'Unload form
Unload ExampleForm
有关Unload语句使用的更多信息,请参见:
还有更多关于工作簿使用的信息。可以在此处找到Close语句:-我怀疑这是由于表单处理不当以及卸载后“默认实例”会重新生成。如果在显示窗体之前不创建自己的窗体实例,则在卸载窗体后使用它时,VBA将执行各种松鼠式的操作
如果只需打开工作簿并卸载表单,*在卸载表单之前,不要增加工作簿的引用计数。另外,在从表单中调用Unload Me
后,不要尝试运行任何其他代码。您发布的代码应该是:
Workbooks.Open "pathname"
Unload Me
当然,表单的调用代码不在问题中,但也可能在那里得到解决。我不确定是什么导致了您描述的行为(无法单击活动Excel窗口中的“关闭”X按钮)。但是,您当前的工作流程是:
用户与表单交互以查看/访问文件
用户单击表单上的按钮以卸载表单
然后,用户需要手动关闭在(1)中打开的文件
更好的解决方案是删除第三步,并从表单的事件处理程序之一(UserForm\u QueryClose
或UserForm\u Terminate
)关闭工作簿。或者,您可以将其添加到命令按钮
的单击
事件中,但这与要求用户手动关闭文件没有太大区别
这可以简单到:
Private Sub UserForm_Terminate()
' should be called when form Unloads
On Error Resume Next
Workbooks.Close "filename.xlsx"
End Sub
通过这种方式,当用户关闭或卸载userform时,文件将被关闭。好的,我想我找到了解决方法
假设我有一个workbook1,它有一个名为ControlPage的表单,带有打开workbook2的命令按钮
私有子命令按钮1_单击()
所以基本上是因为当我试图直接激活工作簿2时,“激活”位似乎不能正常工作,所以我只激活第一个,然后再激活第二个。扭曲,但为我做到了。我没有看到任何代码尝试关闭工作簿……我说的是通过单击十字来关闭。我正在打开包含信息的工作簿,当有人看到他们需要的信息后,他们希望再次关闭工作簿。但是,对于我的代码,您需要在工作簿之间切换,然后才能单击交叉点。我不知道这是什么原因,但您知道工作簿.Open
方法会设置一个新的活动工作簿,因此您的wb.Activate
语句不会做任何额外的操作。插入此工作簿。在wb前激活
。激活,看看这是否会破坏解决方案。也不起作用。我还发现奇怪的是,当我通过点击工作表上的按钮直接打开文件时,我没有这个问题。当我点击userformbutton打开一个文件时,我发现了这个故障。我认为Unload
语句应该在其他语句之后,尽管这可能会解决问题,但最好是这样做。您是否能够通过VBA代码执行工作簿关闭(“文件”)
?或者,这是否表示有任何错误或失败?如果是的话,这可能会为你的问题的根本原因提供线索。谢谢你的帮助,但我认为我的问题还不够清楚。我不想更改我打开的工作簿中的任何内容。我们处理许多不同的excel文件,这些文件都位于不同的位置。我正在创建一个excel文件,您可以用它打开实际需要的文件。将其视为“链接”文件。如果我通过工作簿打开工作簿,我需要在我的工作簿和打开的工作簿之间切换,然后才能通过cl关闭打开的工作簿
Dim workbook2 As Workbook
Dim workbook1name As String
workbook1name = ThisWorkbook.name
Set workbook2 = Workbooks.Open("workbook2.xlsx")
ControlPage.Hide
Workbooks(workbook1name).Activate
Workbooks("workbook2.xlsx").Activate
End Sub