我们后天要给用户安装系统,并且在Excel表做好的初始化的数据导入系统,我引用Mricrosoft Excel Object 9.0,读取Excel数据。我在导入结束以后,执行了对Excel执行了Quit命令。 
   但是在Win98的时候,我把几千行的Excel表数据导入完毕后提示导入完毕以后,整个程序变得不稳定,主要表现在:如果想要再次导入Excel文件,程序无响应。导入完毕以后,作其他操作,可能无响应。退出程序以后,再进入程序的时候,程序完全无响应。并且有一个共同的特征是:按下Ctrl+Alt+Del,发现有一个或者多个Excel在运行,把Excel强行关闭以后,我的程序也就完全正常了。
   在Win2000中导入完毕后Excel一般都能退出,有时导入后看到Excel线程还在运行,但不会导致整个系统无法运作。
不是所有的excel表都是这样,其他行数少很多的excel表完全正常。也没有Excel驻留。
不知道有没有解决的办法?有没有例子把Excel进程杀死。
我那几台电脑做到如测试。除上面的情况外。1台导入完毕以后干脆程序无响应。1台本身没有装office2000,安装以后。导入提示:变量使用了 Visual Basic 不支持的 Automation 类型。但我,有很多Dll文件都无法注册。,大致提示是:系统数据库无法为XXXXX.DLL注册。有好几个DLL文件,包括ADO15.DLL OleDb的Dll都无法注册。定义和打开Excel对象
'Excel对象
Dim xlApp           As Excel.Application
Dim xlBook          As Excel.Workbook
Dim xlSheet         As Excel.Worksheet
Dim sv_rng          As Range                 '获得excel对象的范围,返回退出Excel对象
    xlApp.Quit
    If Not xlSheet Is Nothing Then
        Set xlSheet = Nothing
    End If
    If Not xlBook Is Nothing Then
        Set xlBook = Nothing
    End If
    If Not xlApp Is Nothing Then
    '    xlApp.Close
        Set xlApp = Nothing
    End If
   

解决方案 »

  1.   

    不装office想用Excel,你以为excel就只用那一个 tlb啊,怎么可能,注册那个需要大把的dll支持,主要是相关的动态链接库,没有那些dll,注册就会失败
      

  2.   

    关闭一个excel进程
    Dim MyXL As Excel.Application
    Set MyXL = Getobject(, "Excel.Application")
    if not MyXL is nothing then MyXL.Quit
    set myxl=nothing关闭所有正在打开的Excel就用一个循环
      

  3.   

    把xlApp.Quit放到最后就出错了,因为对象已释放呢你可不可以把导入的代码贴出来?
      

  4.   

    导出的代码:
    Public Sub ExcelImPort(Flex As MSHFlexGrid, fv_FileName As String, Optional fv_fixRow As Integer = 1,  Optional fv_Fixcol As Integer = 0, Optional fv_beginCol As Long = 0)
    On Error GoTo Err:
    'Excel对象
    Dim xlApp           As Excel.Application
    Dim xlBook          As Excel.Workbook
    Dim xlSheet         As Excel.Worksheet
    Dim sv_rng          As Range                 '获得excel对象的范围,返回Excel的行数和列数
    '进度条对象
    Dim frm_Prog        As New Frm_OthProgressBar'Excel的行数和列数
    Dim Ex_rows         As Long
    Dim Ex_Cols         As Long
    Dim sv_ExBeginRow   As Integer     '从excel表的哪一个列开始读取数据
    '设置Flex表的导入的行数和列数
    Dim FlexRows        As Long
    Dim flexcols        As Long
    'Flex表总共有的列数,注意:Flex表总共有的列数<>要导出的列数
    Dim EndCols         As Long
    '循环变量
    Dim i_row           As Long          'Excel行的循环变量
    Dim j_col           As Long
    Dim sv_ContiI_Row   As Boolean        '执行下一个循环变量的I_Row
    Dim sv_ContiJ_Col   As Boolean        '执行下一个循环变量的J_Col
    Dim i_flexRow      As Long           'Grid行的循环变量On Error GoTo OpenErr:
        '初始化对象
        Set xlApp = CreateObject("Excel.Application")
        'Set xlApp = New Excel.Application
        Set xlBook = xlApp.Workbooks.Open(fv_FileName)
        Set xlSheet = xlBook.Worksheets(fv_Sheet)
        '设置鼠标和Flex的刷新
    On Error GoTo Err:
        Screen.MousePointer = vbHourglass
        Flex.Redraw = False    '显示进度条
        frm_Prog.Show
        frm_Prog.ProgrValue = 0
        '返回Excel的行数和列数
        Set sv_rng = xlSheet.UsedRange
        Ex_rows = sv_rng.Rows.Count     '从1-Excel的最末行的名称
        Ex_Cols = sv_rng.Columns.Count    '当Excel表中有596行时,返回595行
        
        Flex.Rows = Ex_rows + fv_fixRow
        FlexRows = Flex.Rows - 1
        '如果限定导出的列数,取限定的列数和总列数之间的最小值
          flexcols = Flex.Cols - 1
         
        '限定的列数和Excel表具有的列数进行比较,取最小值
        flexcols = min(flexcols + 1, Ex_Cols)     '因为Excel表中所在的列比Flex表中大1,在循环的时候,Flex的列数是flexcols-1
        'flex表总的列数
        EndCols = Flex.Cols - 1
        
        'flexGrid开始导入的行
        i_flexRow = fv_fixRow
        '开始导入
        For i_row = 1 To FlexRows             'flex的第0行作为固定行
            For j_col = 1 To flexcols
                    Flex.TextMatrix(i_flexRow, j_col - 1) = xlSheet.Cells(i_row, j_col)   'excel是从1开始算的,
                                                                                                    'flexgrid从0开始算,循环变量是从0开始算,所以flexGrid的Col要减1
                Next
                For j_col = flexcols + 1 To EndCols + 1                Flex.TextMatrix(i_row, j_col - 1) = "" 
                Next
                '提示窗口的进度条
                frm_Prog.ProgrValue = i_flexRow / FlexRows * 100
                'FlexGrid的列的变量
                i_flexRow = i_flexRow + 1
           Next
        Unload frm_Prog
        
        'xlApp.Quit
        xlApp.ActiveWorkbook.Save
        If Not xlSheet Is Nothing Then
            Set xlSheet = Nothing
        End If
        
        If Not xlBook Is Nothing Then
            xlBook.Close
            Set xlBook = Nothing
        End If
        If Not xlApp Is Nothing Then
            xlApp.Quit   
            Set xlApp = Nothing
        End If
        
        Screen.MousePointer = vbDefault
        Flex.Redraw = TrueExit Sub
    OpenErr:
        MsgBox err.Description 
        Screen.MousePointer = vbDefault
        Exit Sub
    Err:
        MsgBox err.Description 
        Resume Next
        Flex.Redraw = True
        Screen.MousePointer = vbDefault
    End Sub在98下,程序结束以后,Excel没有正常退出
      

  5.   

    我把 xlApp.Quit的位置改了一下,单步的时候执行了,xlApp.Quit被执行了。但还是98下Excel没有退出,导致程序像没相应一样。
      

  6.   

    程序也没什么太多操作呢,不会呀,fv_Sheet这个是在哪里定义?在过程的开始部分加一句:
    Doevents在结束的部分你不用再判断
    Not xlSheet Is Nothing    直接释放
    If Not xlBook Is Nothing Then 直接释放,去掉.close
    还有就是在发现有错误的时候 Err:
    里面最有加入
    Set xlSheet = Nothing 
    Set xlBook = Nothing
    Set xlApp = Nothing
      

  7.   

    今天加班弄了一天,累死了
    用Excel测试的结果,不是所有的Excel文档都会无法退出的,五个Excel文档只有两个上千条记录的Excel文档在Win98导入以后,Excel无法正常退出。肯能没响应。
    我单步调试的结果,XlApp.Quit被执行了,但是按下Ctrl+Alt+Del看到Excel仍在运行.如果Excel不能正常退出,导入函数结束以后,整个系统都接近于死机。VB调试环境下我的程序的时候,执行End返回VB,VB完全没反应。不单我的程序。运行其他程序,像IE,Work,都一点反应都没有。但是结束了Excel进程以后,整个系统的程序运行都没问题了。
    我估计Excel执行了Quit,但是没响应。有没有什么办法把Excel暴力结束了它算了。 
      

  8.   

    你先用
    set xlApp.visible=true
    把EXCEL显示出来,然后让用户来关闭!
    记得给我分!!!
      

  9.   

    用andy2001p(火星工作室) 的方法更深入地发现一个问题了。
    我把Excel设置为可见,程序不关闭Excel,我手工关闭Excel程序,我关闭前按下Ctrl+Alt+Del,发现没有Excel的进程运行,但是把Excel关闭以后,再按下Ctrl+Alt+Del,看到有Excel进程,并且系统无响应。可能是这个Excel进程是关闭Excel过程中产生的。
      

  10.   

    应不会吧!
    你的系统会不会Problem?你在看看换个系统会不会有问题!
      

  11.   

    试试用enumwindow和sendmessage给excel发WM_quit消息,让其退出;
      

  12.   

    Transferring data cell by cell can be a perfectly acceptable approach if the amount of data is small. You have the flexibility to place data anywhere in the workbook and can format the cells conditionally at run time. However, this approach is not recommended if you have a large amount of data to transfer to an Excel workbook. Each Range object that you acquire at run time results in an interface request so that transferring data in this manner can be slow. Additionally, Microsoft Windows 95 and Windows 98 have a 64K limitation on interface requests. If you reach or exceed this 64k limit on interface requests, the Automation server (Excel) might stop responding or you might receive errors indicating low memory.
      

  13.   

    http://support.microsoft.com/default.aspx?scid=kb;EN-US;247412
      

  14.   

    不是excel的关闭问题。
    我做过相同的系统,
    在queryunload事件中
    Set TempExcel = Nothing
      

  15.   

    我还是不明白:为什么在Set TempExcel = Nothing要放在queryunload事件中呢?我的Excel对象是函数级变量,函数结束,对象也就要释放了