启动时未打开工作簿(启动画面冻结)

时间:2018-07-10 09:45:25

标签: vba excel-vba excel-2016

我使用Excel2016。我正在使用的文件在工作簿Open事件处理程序中运行一些代码。

根据代码的不同,工作簿可能永远不会打开(可见)。

Workbook_Open 中,事件处理程序建立与数据库的连接并加载一些数据,最终例如在发生错误时警告用户。

在大多数情况下,与数据库建立连接并加载一些数据是可行的。有时它不会,并且Excel初始屏幕永远保留在屏幕上。关闭启动画面后,单击关闭叉号,Excel进程将继续在后台运行。

如果发生错误,只要工作簿不可见,我就不会看到打开的弹出窗口来警告用户。

当我终止该进程时,请重新打开Excel(而不是工作簿),Excel建议检索较早打开的文件,以某种方式证明它确实已经打开。

除非工作簿可见,否则第二步将无法进行。如果我运行Excel,然后打开工作簿就可以了(如果发生错误,则会打开警告弹出窗口)。

如果Excel已关闭并且我打开了工作簿,则它不起作用(初始屏幕冻结)。

在需要管理某些外观设计任务(显示一些工作表,隐藏其他工作)并运行与数据库的连接的情况下,启动VBA应用程序的正确方法是什么?

这是代码的简化版本(无法全部提供-太复杂-太长) 在此代码中,函数 bConnectToTheDatabase 被强制返回False,这使bLogin函数无用(因此未提供代码)。

Private mLoginForm As frmLgn ' a form to login the application (see image)
Private mCustomMsgBox As frmMsgBox ' a form to display custom messages (see image)

Public Const gsPFU_VBA_PWD as String = "my secret password"
Public Const gsBLANK_WKS_NAME As String = "Blank"
Private Sub Workbook_Open()
'
    Call HidShowSomeSheets()
    ' start the application up
    Call LoginIntoTheApplication()
End Sub
' hide all sheets but the one named gsBLANK_WKS_NAME
' protect/unprotect to chnage visibility
Sub HidShowSomeSheets()
    With Application.Workbooks(ThisWorkbook.Name())
        .Unprotect (gsPFU_VBA_PWD)
        .Sheets(gsBLANK_WKS_NAME).Visible = xlSheetVisible
        For Each wks In .Sheets
        With wks
            .Unprotect (gsPFU_VBA_PWD)
        End With
        Next wks
        For Each wks In .Sheets
        With wks
            If (StrComp(gsBLANK_WKS_NAME, .Name) <> 0) Then
                .Unprotect (gsPFU_VBA_PWD)
                On Error Resume Next
                .Visible = xlSheetVeryHidden
            Else
                .Protect (gsPFU_VBA_PWD)
                .Activate
            End If
        End With
        Next wks
        .Protect (gsPFU_VBA_PWD)
    End With
End Sub
Sub LoginIntoTheApplication()
    if( bConnectToTheDatabase() ) then 
        call bLogin
    else
        'create a custom form (it has it own even handler - block the execution flow)
        'set mCustomMsgBox= new frmMsgBox
        'mCustomMsgBox.Show vbModeless    'this does not work 
        MsgBox  "something went wrong" 'this works 
    end if      
end Sub 
Function bLogin() as Boolean 
'login into the application

End Function
Function bConnectToTheDatabase() as Boolean
    'do the connection
    'get the data 
    'etc ....
    bConnectToTheDatabase= False 'fore it to False for the purpose of the explanation
End Function

登录表单

enter image description here

自定义消息框

enter image description here

0 个答案:

没有答案