各位大侠,小弟用VB编了一个程序用来统计EXCEL上的数据,由于EXCEL数据量大,所以得运行一段时间。我把文件都放在LISTBOX里面,有时候等待时间长了想停止运行,于是做了一个command按钮想删除listobx里其余的文件,但是程序运行时,该按钮不能操作(VB编的程序运行时界面上的所有按钮都不能操作,要等运行结束才能操作,包括关闭、最小化等)。请问如何解决这个问题,能够在程序运行时在界面上操作,改变listbox里的内容,谢谢!VB运行时不能操作界面按钮

解决方案 »

  1.   

    在执行长时间作业的过程,在其循环体中加人doevent
      

  2.   

    我用的是for循环,怎么加呢?
      

  3.   

    里面很多for循环,每个都加?只加doevents?do while不要的?
      

  4.   

    代码来了,帮忙看看,这个是Command1,另外我想弄个Command2,在执行这个循环的同时删除list上的尚未处理其余excel,这样就停止执行了
    Private Sub Command1_Click()
    Do While flag = False
    DoEventsIf List1.List(0) <> "" Then
        Set ExcelAPP = GetObject("", "Excel.Application")
        Set wbk = ExcelAPP.Workbooks.Open(List1.List(0))
        For i = 6 To 100000
            If wbk.Application.Cells(i, 1) = "" Then
                MaxLine = i - 1
                Exit For
            End If
        Next i
        XP_ProgressBar1.Value = XP_ProgressBar1.Value + 2    For i = 6 To MaxLine
            wbk.Application.Cells(i, 10) = wbk.Application.Cells(i, 2) * wbk.Application.Cells(i, 3)
        Next i
        
        For i = 0 To 300
            If a(i) = wbk.Application.Cells(6, 1).Text Then
                c = i
                Exit For
            End If
        Next i
        XP_ProgressBar1.Value = XP_ProgressBar1.Value + 2
        
    b=2
        For n = 0 To 300
        Count = 0
            For i = B To MaxLine
                If wbk.Application.Cells(i, 1).Text = a(n) Then
                    Count = Count + 1
                    B = B + 1
                    If wbk.Application.Cells(i + 1, 1).Text <> a(n) Then
                        wbk.Application.Cells(n + 6, 9) = wbk.Application.Cells(i, 2)
                        wbk.Application.Cells(n + 6, 14) = wbk.Application.Cells(i, 13)
                        Exit For
                    End If
                End If
            Next i
            If Count = 0 Then
                wbk.Application.Cells(n + 6, 9) = wbk.Application.Cells(n + 5, 9)
                wbk.Application.Cells(n + 6, 14) = wbk.Application.Cells(n + 5, 14)
            End If
        Next nIf List1.List(0) = "" Then
        Exit Do
    End If
    Loop
    MsgBox "处理完毕!", vbExclamation, "提示"
    End Sub
      

  5.   

    不知道有没有错误,你自己参考一下吧Private Sub Command1_Click()
        Dim ExcelApp As Excel.Application
        Dim wbk As Excel.Workbook
        Dim sht As Excel.Worksheet
        Dim MaxLine As Long
        
        '建议不用Application对象访问cell
        
        If List1.List(0) <> "" Then
            Set ExcelApp = GetObject("", "Excel.Application") '词句不用放在循环里面,应用对象不要一直创建
            Set wbk = ExcelApp.Workbooks.Open(List1.List(0))
            Set sht = wbk.Worksheets("sheet1")
            
            Do While flag = False '不明白这个循环做什么?
            
            DoEvents
        
    '        Set ExcelAPP = GetObject("", "Excel.Application") '词句不用放在循环里面,应用对象不要一直创建
    '        Set wbk = ExcelAPP.Workbooks.Open(List1.List(0))
            With sht
                
                'For i = 6 To 100000'改成while会比较柔性
                    MaxLine = 6
                    While .Cells(MaxLine, 1) <> ""
                        MaxLine = MaxLine + 1
                        DoEvents
                    End If
                    
                'Next i
                XP_ProgressBar1.Value = XP_ProgressBar1.Value + 2
        
                For i = 6 To MaxLine
                    wbk.Application.Cells(i, 10) = wbk.Application.Cells(i, 2) * wbk.Application.Cells(i, 3)
                Next i
                '此for最好在excel里面设置公式
            
            For i = 0 To 300
                If a(i) = .Cells(6, 1) Then
                    c = i
                    Exit For
                End If
                DoEvents
            Next i
            XP_ProgressBar1.Value = XP_ProgressBar1.Value + 2
            
        B = 2
            For n = 0 To 300
            Count = 0
                For i = B To MaxLine
                    If .Cells(i, 1) = a(n) Then
                        Count = Count + 1
                        B = B + 1
                        If .Cells(i + 1, 1).Text <> a(n) Then
                            .Cells(n + 6, 9) = .Cells(i, 2)
                            .Cells(n + 6, 14) = .Cells(i, 13)
                            Exit For
                        End If
                    End If
                    DoEvents
                Next i
                
                If Count = 0 Then
                    .Cells(n + 6, 9) = .Cells(n + 5, 9)
                    .Cells(n + 6, 14) = .Cells(n + 5, 14)
                End If
            Next n
        
            If List1.List(0) = "" Then
                Exit Do
            End If
            Loop
        
        End With
        MsgBox "处理完毕!", vbExclamation, "提示"
    End Sub
      

  6.   

    数据多, 运算量大的处理还是放在里面, 直接用宏来处理比较好, 计算代码基本和VB一样, 还省却了来回倒腾数据的消耗.至于你想用VB来做个控制界面的话, 可以在vb中调用excel中的宏来处理, 这样就是异步处理的. 效率也高
    http://www.google.com.hk/search?q=vb%E8%B0%83%E7%94%A8excel%E5%AE%8F&client=aff-cs-360chromium&ie=UTF-8