Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.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 启动时工作簿未打开(启动屏幕冻结)_Vba_Excel_Excel 2016 - Fatal编程技术网

Vba 启动时工作簿未打开(启动屏幕冻结)

Vba 启动时工作簿未打开(启动屏幕冻结),vba,excel,excel-2016,Vba,Excel,Excel 2016,我使用Excel 2016。我使用的文件在工作簿打开事件处理程序中运行一些代码 根据代码的不同,工作簿可能永远无法打开(可见) 在工作簿\u Open中,事件处理程序建立与数据库的连接,并加载一些数据,例如,如果发生错误,最终警告用户 建立与数据库的连接并加载一些数据在大多数情况下都是有效的。有时它不会,Excel初始屏幕将永远保留在屏幕上。关闭启动屏幕后,单击关闭十字,Excel进程继续在后台运行 如果发生错误,我看不到弹出表单,只要工作簿不可见,就会打开该表单警告用户 当我停止重新打开Exc

我使用Excel 2016。我使用的文件在工作簿打开事件处理程序中运行一些代码

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

工作簿\u Open中,事件处理程序建立与数据库的连接,并加载一些数据,例如,如果发生错误,最终警告用户

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

如果发生错误,我看不到弹出表单,只要工作簿不可见,就会打开该表单警告用户

当我停止重新打开Excel(而不是工作簿)的过程时,Excel建议检索先前打开的文件,以证明它确实已打开

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

如果Excel关闭,我打开工作簿,它将不工作(启动屏幕冻结)

如果需要管理某些化妆品任务(显示某些工作表、隐藏某些工作表)并运行到数据库的连接,启动VBA应用程序的正确方法是什么

下面是代码的简化版本(无法提供全部内容-太复杂-太长) 在这段代码中,函数b连接到数据库被强制返回False,这使得bLogin函数无效(因此不提供代码)

Private-mloginfo-As-frmLgn'登录应用程序的表单(见图)
专用MCUSTOMSGSBOX作为frmMsgBox'一种显示自定义消息的表单(见图)
Public Const gsPFU_VBA_PWD as String=“我的秘密密码”
Public Const gsBLANK_WKS_NAME为String=“Blank”
私有子工作簿_Open()
'
调用HidShowSomeSheets()
'启动应用程序
调用登录到应用程序()中
端接头
'隐藏所有工作表,但名为gsBLANK\u WKS\u NAME的工作表除外
'保护/取消保护到技术可见性
子图纸(图纸)
使用Application.Workbooks(ThisWorkbook.Name())
.Unprotect(gsPFU_VBA_PWD)
.Sheets(gsBLANK_WKS_NAME).Visible=xlSheetVisible
对于每个工作表中的工作
有工作
.Unprotect(gsPFU_VBA_PWD)
以
接下来的工作
对于每个工作表中的工作
有工作
如果(StrComp(gsBLANK_WKS_NAME.NAME)0),则
.Unprotect(gsPFU_VBA_PWD)
出错时继续下一步
.Visible=xlSheetVeryHidden
其他的
.保护(gsPFU_VBA_PWD)
.激活
如果结束
以
接下来的工作
.保护(gsPFU_VBA_PWD)
以
端接头
子登录到应用程序()
如果(b连接到数据库()),则
打电话给bLogin
其他的
'创建自定义表单(它有自己的偶数处理程序-阻止执行流)
'设置mCustomMsgBox=new frmsgbox
“mCustomMsgBox.Show vbModeless”这不起作用
MsgBox“出了点问题”这很有效
如果结束
端接头
函数bLogin()为布尔函数
'登录到应用程序
端函数
函数bConnectToTheDatabase()为布尔值
“连接吗
“获取数据
“等等。。。。
b连接到数据库=False“出于解释目的,将其改为False”
端函数
登录表单

自定义消息框


指定数据库操作的超时时间。请记住,如果工作簿的“打开”正在运行,则工作簿已打开。此时它还不可见。请显示您的代码好吗?@Mark code addedHold Shift键向下,同时打开工作簿以停止事件宏的运行。在错误时注释掉
“下一步继续”
,然后使用F8单步执行
工作簿\u打开
代码`
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