Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 无法关闭打开的excel工作簿_Vba_Excel - Fatal编程技术网

Vba 无法关闭打开的excel工作簿

Vba 无法关闭打开的excel工作簿,vba,excel,Vba,Excel,我正在用命令按钮、用户表单等构建一个excel文件,其中包含指向其他工作簿的链接 对于我的工作表上的commandbuttons,我使用与我的userforms中commandbuttons相同的代码: workbooks.open "path" 通过userform命令按钮,添加了以下内容 unload me 当我通过userform打开工作簿时,我无法随后关闭它。我必须先激活工作簿,然后激活打开的工作簿,然后才能将其关闭 我曾尝试在“工作簿.打开”前后放置“卸载我”,但这并没有改变任何事

我正在用命令按钮、用户表单等构建一个excel文件,其中包含指向其他工作簿的链接

对于我的工作表上的commandbuttons,我使用与我的userforms中commandbuttons相同的代码:

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