excel文件(.xlms)继续加载但未打开。加载时,如果单击另一个excel文件以将其打开,则会将其打开

时间:2018-11-04 12:30:41

标签: excel vba excel-vba

我刚刚学习了VBA,并且正在制定优化的计划程序。

我的编程过程如下。

  1. 我的程序首先打开打开窗口(用户窗体ufSplash)约2秒钟,然后进入登录窗口(用户窗体ufLogin)。并且可见的应用程序是错误的。 (下面的(1),(1-1)中的相关代码)

  2. 在用户正常登录后,将其卸载并打开项目设置窗口(用户窗体ufProjectSet)。 (下面的相关代码(2))

  3. 在项目设置窗口中用户输入值后,将其隐藏(不卸载),并显示算法设置窗口(用户格式ufOptAlgoSet)。 (下面的相关代码(3))

  4. 在算法设置窗口中单击命令按钮confirm时,将隐藏用户窗体并执行优化算法(模块main)。在模块Main中,进度窗口(用户窗体ufOptProg)显示为vbModeless,用于显示优化算法的进度(10%,20%等),其中百分比计算代码包含在过程geneticAlgorithm中。 (以下(4),(4-1)下面的相关代码)

我的问题如下。如果一次调试一行,则所有代码都是正常的。

  1. 我的Excel文件有时会正常打开(?),但大多数情况下它将继续加载但根本没有打开,或者直到process(1)的用户窗体ufSplash为止,或者直到process(1-1) )的用户表单ufLogin。但是,在加载过程中,如果单击另一个excel文件将其打开,则会将其打开。其他所有文件均正常打开,只有我的文件有问题。另外,如果我复制文件,则复制的文件几乎不会因上述问题而打开。我尝试更改Application.Visible = True,但这是相同的。另外,我尝试删除ufSplashufSplashufLogin,但这有时与问题相同。

  2. 在上述过程(4)中,显示了进度窗口,但窗口上没有任何内容。优化算法完成后,可以正常显示内容。

用户表单ufProjectSet有很多控件,大约600 EA。有问题吗?另一台计算机(Office 2015)的文件存在相同的问题。 (我的计算机是Office 2013)

我的代码如下。如果有人想要我的所有代码,我可以发送Excel文件。 请请专家解决我的问题。

(1)首先,当我的文件启动时,启动以下事件。

Private Sub Workbook_Open()    
    Application.Visible = false

    ThisWorkbook.Worksheets("Initial Setting").Visible = True
    ThisWorkbook.Worksheets("Cycle Schedule").Visible = True
    ThisWorkbook.Worksheets("Log").Visible = True
    ThisWorkbook.Worksheets("Report").Visible = True
    ThisWorkbook.Worksheets("DB").Visible = True
    ThisWorkbook.Worksheets("UserInfo").Visible = True

    Dim dtDelay As Date
    dtDelay = Now

    ufSplash.Show

    If Now < (dtDelay + TimeSerial(0, 0, 2)) Then
        Application.Wait dtDelay + TimeSerial(0, 0, 2)
    End If

    Unload ufSplash
    ufLogin.Show  
End Sub

(1-1)用户表单uflogin的代码如下。

Private Sub btnClose_Click()
    Application.Quit
End Sub


Private Sub btnConfirm_Click()
    Dim loginData As Range
    Dim pwd As String
    Dim name As String

    Set loginData = ThisWorkbook.Sheets("UserInfo").Range("A2:C3")

    On Error Resume Next

    pwd = Application.VLookup(Me.txtId, loginData, 2, 0)
    name = Application.VLookup(Me.txtId, loginData, 3, 0)

    If Err.number <> 0 Then
        MsgBox "The corresponding ID does not exist.\n Please check again.", vbCritical, "ID Failure"
        Exit Sub
    End If

    If pwd = Trim(Me.txtPwd) Then
        MsgBox "Login success.", vbInformation, "Login"
        Unload Me        
    Else
        MsgBox "Password incorrect.", vbCritical, "Login Failure"
    End If

    ufProjectSet.Show
End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFromControlMenu Then    
        MsgBox "x button does not work"        
        Cancel = True        
    End If
End Sub

(2)用户表单ufProjectSet的代码如下。

Private Sub btnCoreActNext_Click()
    Me.Hide  
    ufOptAlgoSet.Show
End Sub

(3)用户表单ufOptAlgoSet的代码如下。

Private Sub btnAlgoConfrim_Click()
    Me.Hide
    Call Main
End Sub

(4)模块main的代码如下。

Public Sub Main()
    Application.ScreenUpdating = False
    ufOptProg.Show vbModeless
    Call InitialScheduling    
    Call geneticAlgorithm     
    Unload ufOptProg 
    ufResult.Show         
End sub

(4-1)用户表单ufOptProg的代码如下。

Private Sub UserForm_Initialize()
    BarWidth = 0
    Me.lbProgressbar.Caption = "Preparing for optimization......"
    Me.progressBar.Width = BarWidth        
End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Unload Me
End Sub

1 个答案:

答案 0 :(得分:0)

-------最近发布--------

我猜想我已经解决了问题,但是文件重复出现相同的问题。 我发现了有关(1)的新解决方案。通过下面的URL,我解决了我的问题(1),但是有人不知道为什么会发生此问题。...

https://www.purplefrogsystems.com/blog/2015/06/excel-crashes-when-enabling-macros/


-------过去的帖子--------- 我是这个问题的提问者。 我发现了问题(1)发生的原因。 问题非常简单...这是在第一个事件“ Workbook_open()”中。 某些代码应作如下修改;

uflogin.show-> uflogin.show vbmodeless

这是因为事件“ workbook_open”应该在启动excel文件的最后一个代码“ end sub”之前完成。因此,该事件可以通过使用vbmodeless显示用户窗体“ uflogin”来结束“ end sub”的最后一行。

Private Sub Workbook_Open()    

Application.Visible = false

ThisWorkbook.Worksheets("Initial Setting").Visible = True
ThisWorkbook.Worksheets("Cycle Schedule").Visible = True
ThisWorkbook.Worksheets("Log").Visible = True
ThisWorkbook.Worksheets("Report").Visible = True
ThisWorkbook.Worksheets("DB").Visible = True
ThisWorkbook.Worksheets("UserInfo").Visible = True

Dim dtDelay As Date
dtDelay = Now

ufSplash.Show

If Now < (dtDelay + TimeSerial(0, 0, 2)) Then
    Application.Wait dtDelay + TimeSerial(0, 0, 2)
End If

Unload ufSplash
ufLogin.Show  

End Sub