Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/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
Excel 检查未保存的工作簿是否已关闭_Excel_Vba - Fatal编程技术网

Excel 检查未保存的工作簿是否已关闭

Excel 检查未保存的工作簿是否已关闭,excel,vba,Excel,Vba,我有一个工作簿,打开时会创建另一个空白工作簿,其中可能会复制一些数据。我想在关闭工作簿时测试创建的工作簿是否仍处于打开状态 我在空白工作簿上测试了这个。对于“ThisWorkbook”代码,我有 Private Sub Workbook_BeforeClose(Cancel As Boolean) If Refreshwkbk Is Nothing Then MsgBox "other wkbk closed" Else MsgBox "other

我有一个工作簿,打开时会创建另一个空白工作簿,其中可能会复制一些数据。我想在关闭工作簿时测试创建的工作簿是否仍处于打开状态

我在空白工作簿上测试了这个。对于“ThisWorkbook”代码,我有

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Refreshwkbk Is Nothing Then
        MsgBox "other wkbk closed"
    Else
        MsgBox "other wkbk open"
        Refreshwkbk.Activate
    End If
End Sub

Private Sub Workbook_Open()
    Call myRefresh
End Sub
在一个模块中,我有

Public Refreshwkbk As Workbook

Sub myRefresh()
    Set Refreshwkbk = Workbooks.Add
End Sub
代码将在刷新时中断。激活时出现自动错误。
错误是
运行时错误'-2147221080(80040188)


如何测试新创建的工作簿是否仍处于打开状态?

也许有更好的方法来处理对象,但这里有一种方法可以遍历所有打开的工作簿

Dim wb As Workbook

'looping through currently opened workbooks
For Each wb In Workbooks
    If wb.Name = refreshwkbk.Name Then
        refreshwkbk.Activate
        MsgBox "other wkbk open"
    Else
        If refreshwkbk Is Nothing Then
            MsgBox "other wkbk closed"
        End If
    End If
Next wb

也许有更好的方法来处理对象,但这里有一种方法可以遍历所有打开的工作簿

Dim wb As Workbook

'looping through currently opened workbooks
For Each wb In Workbooks
    If wb.Name = refreshwkbk.Name Then
        refreshwkbk.Activate
        MsgBox "other wkbk open"
    Else
        If refreshwkbk Is Nothing Then
            MsgBox "other wkbk closed"
        End If
    End If
Next wb

最简单的方法是尝试
。激活它,如果它抛出错误,它已经关闭

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    On Error GoTo WKBK_CLOSED
    Refreshwkbk.Activate 'if that fails it jumps to WKBK_CLOSED
    MsgBox "other wkbk open"

    Exit Sub
WKBK_CLOSED:
    MsgBox "other wkbk closed"
End Sub

最简单的方法是尝试
。激活它,如果它抛出错误,它已经关闭

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    On Error GoTo WKBK_CLOSED
    Refreshwkbk.Activate 'if that fails it jumps to WKBK_CLOSED
    MsgBox "other wkbk open"

    Exit Sub
WKBK_CLOSED:
    MsgBox "other wkbk closed"
End Sub

我无法复制这个。它就像预期的那样工作:如果我打开工作簿,它会打开另一个新工作簿。如果我关闭它,它会说“其他wkbk打开”,激活它,关闭自己。没有错,谢谢你的尝试。请尝试打开测试工作簿,关闭创建的工作簿,然后关闭测试工作簿,好吗?我无法复制。它就像预期的那样工作:如果我打开工作簿,它会打开另一个新工作簿。如果我关闭它,它会说“其他wkbk打开”,激活它,关闭自己。没有错,谢谢你的尝试。请尝试打开测试工作簿,关闭创建的工作簿,然后关闭测试工作簿,好吗?谢谢,但当Refreshwkbk关闭时,我会收到相同的自动错误。哈哈-我读了你的评论大约4次。我在那里感到头晕。现在添加了一个空格。@Glib我也不能重现您的错误,和PeH一样,可能是您的表单控件造成的?我记得我有一个类似的错误,因为没有正确命名我的表单子。工作簿中没有涉及表单-我一直在一个完全空白的工作簿上测试这个问题,当新创建的工作簿首先关闭时,测试工作簿无法判断它是否已关闭。我将尝试在另一台计算机上重复。我认为这种方法的问题是,如果
refreshwkbk
已关闭,则
refreshwkbk.Name
将抛出错误,因为不再存在工作簿的
.Name
。这就是为什么这段代码不能工作的原因。谢谢,但是当Refreshwkbk关闭时,我得到了相同的自动化错误。哈哈,我读了你的评论大约4次。我在那里感到头晕。现在添加了一个空格。@Glib我也不能重现您的错误,和PeH一样,可能是您的表单控件造成的?我记得我有一个类似的错误,因为没有正确命名我的表单子。工作簿中没有涉及表单-我一直在一个完全空白的工作簿上测试这个问题,当新创建的工作簿首先关闭时,测试工作簿无法判断它是否已关闭。我将尝试在另一台计算机上重复。我认为这种方法的问题是,如果
refreshwkbk
已关闭,则
refreshwkbk.Name
将抛出错误,因为不再存在工作簿的
.Name
。这就是为什么这个代码不能工作。谢谢你。这让我抓狂。我想一定有办法知道工作簿是否已关闭,但这可能只适用于已保存的工作簿。谢谢。这让我抓狂。我想一定有办法判断工作簿是否已关闭,但这可能只适用于保存的工作簿。