Excel 2013 - 如果隐藏了一个工作簿,则在关闭多个工作簿时出现问题

时间:2015-07-16 09:21:50

标签: excel vba excel-vba

我在Excel VBA中编写了一个程序,它使用UserForm来输入用户的数据。具体来说,它是一个Telemarketing Tracker工具:用户在UserForm的文本框中填写呼叫的详细信息,然后单击相关按钮以指示它是好还是坏,然后可以继续下一个呼叫。

此数据存储在工作表中,我们的用户通常更喜欢隐藏工作簿并只查看UserForm。我开发了几种隐藏工作簿的方法。如果只打开一个工作簿,则隐藏Excel应用程序。如果打开了多个工作簿,我只是隐藏窗口。这是我用于此的代码:

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
    [PHAssetChangeRequest deleteAssets:formatWithOrientation];
} completionHandler:^(BOOL success, NSError *error) {
    NSLog(@"Finished deleting asset. %@", (success ? @"Success." : error));
}];

这很有效,但显然当用户隐藏工作簿然后打开另一个Excel工作簿时会出现某些问题。我已解决了大部分问题,但有一件事似乎无法解决:如果电话营销工作簿被隐藏,另一个工作簿打开,如果我点击关闭按钮,两本工作簿都试图关闭。

我尝试使用应用程序级别事件跟踪器创建一个类模块,以便所有工作簿都可以使用。密切事件受到监控。但我的问题是,当我单击关闭按钮时,尝试关闭的第一个工作簿是隐藏工作簿。因此,我可以捕获close事件并阻止隐藏的工作簿关闭,但如果我将Private Sub HideUnhideButton_Click() 'User clicks Hide/Unhide button If Workbooks.Count > 1 Then Windows(ThisWorkbook.Name).Visible = Not Windows(ThisWorkbook.Name).Visible HideUnhideButton.Tag = Windows(ThisWorkbook.Name).Visible Else ThisWorkbook.Application.Visible = Not ThisWorkbook.Application.Visible HideUnhideButton.Tag = ThisWorkbook.Application.Visible End If ThisWorkbook.Activate End Sub 设置为Cancel,则会阻止所有工作簿关闭!

我能想到的唯一解决方法是当用户尝试关闭工作簿时,我取消关闭事件并取消隐藏隐藏的工作簿。但我不知道如何识别用户试图关闭的工作簿 - 因此我无法确定如何自动关闭正确的工作簿。

我目前正在设置True事件,如下所示:

WorkbookBeforeClose

如果我单步执行此代码,我会发现Wb.Name是电话销售工作簿的名称(即使它已被隐藏)以及用户实际的工作簿名称试图关闭根本没有出现 - 据我可以解决。

有人可以提出任何进一步的建议吗?

我应该提到的另一件事是它需要在Excel 2013和Excel 2010上工作。

1 个答案:

答案 0 :(得分:0)

我很抱歉这么快就回答我自己的问题。这有点表明我事先没有做足够的研究。但是,对于有类似问题的人来说,这是我的解决方案。这个代码需要在类模块中发布,当然,在它工作之前需要创建类的实例。

注意:在下面的示例中,“TT”与电话营销跟踪器相关

Public WithEvents A As Excel.Application

Private Sub A_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)

Dim VIS As Boolean, myAW As Workbook

If Workbooks.Count > 1 Then 'if there is more than one workbook open...
    If Windows(ThisWorkbook.Name).Visible = False Then 'and if TT is invisible...
        If ActiveWorkbook.Name = ThisWorkbook.Name Then 'and if the workbook being closed is the TT.
            Windows(ThisWorkbook.Name).Visible = True
        Else 'more than one wb open, TT is invisible, and the workbook being closed is NOT the TT.
            Set myAW = ActiveWorkbook
            Cancel = True
            Windows(ThisWorkbook.Name).Visible = True
            Application.EnableEvents = False
            myAW.Close
            Application.EnableEvents = True
            If TelesalesForm.HideUnhideButton.Tag = "False" Then 'NB: I use a tag on the Hide/Unhide button on the UserForm to store whether the workbook should be hidden or not. 
                If Workbooks.Count > 1 Then
                    Windows(ThisWorkbook.Name).Visible = False
                Else
                    ThisWorkbook.Application.Visible = False
                End If
            End If
            Exit Sub
        End If

    ElseIf ActiveWorkbook.Name <> ThisWorkbook.Name Then
        'more than one workbook open and the TT is visible and the workbook being closed is NOT the TT
        Exit Sub
    End If
End If

'code gets to this point ONLY under the following circumstances:
    'There is only one workbook open (i.e. the TT) OR
    'There is more than one WB open and the WB being closed is the TT.

'The rest of the code goes here for managing the closing of the TT. 

End Sub

如果有人想到代码的任何其他修饰或改进,那么我会很高兴听到它们!