gpt4 book ai didi

excel - 关闭不同的工作簿结束当前工作簿的代码执行

转载 作者:行者123 更新时间:2023-12-04 20:09:35 25 4
gpt4 key购买 nike

我正在尝试运行 fooBook1.xlsm运行另一个子,bar , 在 Book2.xlsm .以下是两者的代码:

在书 1 中:

Sub foo()
Dim oldBook As Workbook: Set oldBook = ActiveWorkbook
Dim newBook As Workbook: Set newBook = Workbooks("Book2.xlsm")

Application.Run "'Book2.xlsm'!Module1.bar", oldBook
End Sub

在书 2 中:
Sub bar(book As Workbook)
book.Close False
Debug.Print "Closed Workbook!"
MsgBox "Closed workbook!"
End Sub
foo的执行运行良好,控制权传递给 barBook2.xlsm .行 book.Close false运行得非常好(关闭 Book1.xlsm ),但代码执行立即停止而没有任何警告(控制台或弹出窗口中没有消息)。不应该在 Book2.xlsm 中执行这两行吗?由于控制权已传递给 bar ?

我通过调用 bar workbooks(1) 进行了尝试( workbooks(1) = Book1.xlsm ) 并且整个代码运行得非常好,正如预期的那样。不应该发生同样的事情吗

如何在第一种情况下保留代码执行,即 foo运行 bar ,更改工作簿,关闭 Book1.xlsm并继续执行 bar ?

最佳答案

重新考虑谁负责什么。工作簿随机给出 Workbook 是不正常的。反对并前往Close它。

当然,您可以绕过这样一个事实,即您实际上是在关闭调用堆栈的所有者,但问题的根源是,当您拥有 WorkbookA 时负责做某事,而那件事涉及打开或创建WorkbookB ,则为 WorkbookA的责任关闭WorkbookB完成后。
Book2没有业务关闭任何东西。假设真正的宏实际上做的不仅仅是关闭它,那么它应该做它的事情,然后让调用者决定是关闭工作簿还是让它保持打开状态; Book2!Bar被赋予了它不拥有的资源:关闭该资源超出了它的责任。

也许这可以作为一个简单的说明:

Public Sub DoSomething()
Set t = New Thing
UseTheThing t
t.SomeMethod ' error 91: object reference is gone!
End Sub

Private Sub UseTheThing(ByRef t As Thing)
t.Foobar 42
Set t = Nothing ' not your job!
End Sub

围绕事物的自然顺序(调用者 -> 被调用者 -> 返回调用者)既不推荐也不有用。从大局来看,有些东西出了问题——退后一步,修复更高的层次,而不是与整个范式作斗争。

关于excel - 关闭不同的工作簿结束当前工作簿的代码执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57171674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com