问题是:
按下下面的代码,能够从Access数据库文件中获取所有的表及数据,写入 Excel文件中.(Excel的Sheet 将按表来重新命名,而 每张表保存对应的 表数据),现在问题是:执行代码后 Excel文件是正常退出(如果设置 visible=true,可以看到它正常的退出),但坚持进程 发现 Excel还是没有退出,这就导致我再次执行该代码的时候出错(创建出来的 Excel文件中 Sheet没有增加);For i = 0 To UBound(Arr_Select_DB())
'获取 数据路中表个个数
    If Arr_Select_DB(i) = True Then
    Int_Table_Count = 0
    str_Select_Count = str_Select_Count + 1 '选择项个数
    
    Set temCon = New ADODB.Connection
    temCon.Open "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Arr_DB_File_Address(i) & ";Persist Security Info=false"
    Set temSet = temCon.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, Empty))    Do Until temSet.EOF '检查 数据中的表
        If Left(temSet!table_name, 4) <> "MSys" Then
            If temSet!table_name <> "DBInfoHistory" Then
                Arr_Tem_TableName(Int_Total_Tab_Count) = temSet!table_name
            Else
                Arr_Tem_TableName(Int_Total_Tab_Count) = i & "@" & temSet!table_name
            End If
            'Arr_Tem_TableName_Count(K) = temSet.RecordCount
            
            Int_Total_Tab_Count = Int_Total_Tab_Count + 1
            Int_Table_Count = Int_Table_Count + 1
            DoEvents
        End If
            temSet.MoveNext
    Loop
             Arr_Table_Count(i) = Int_Table_Count
    Else
        Arr_Table_Count(i) = 0
    End If
Next
Arr_Tem_TableName(Int_Total_Tab_Count) = "Summary"'创建 Excel文件
'Call Load_Operate_Excel(Arr_DB_BackUp_File_Address, Arr_Tem_TableName(), i)
'打开 Excel文件
Set xlApp = CreateObject("Excel.application")
'Set xlApp = New Excel.ApplicationxlApp.Visible = True  '操作不可见
Set xlBook = xlApp.Workbooks.Add()     '打开创建号的备份文件
'Set xlBook = xlApp.Workbooks.Open(Arr_DB_BackUp_File_Address)    '打开创建号的备份文件For i = 0 To Int_Total_Tab_Count   '创建所有 Sheet
    If Len(Arr_Tem_TableName(i)) <> 0 Then
        Set xlSheet = ActiveWorkbook.Worksheets.Add         '添加新sheet
        'MsgBox str_Table_Name(i)
        xlSheet.Name = Arr_Tem_TableName(i)                     '重命名新sheet
    Else
        Exit For
    End If
Next
DoEvents'写入数据到 Excel中
str_Select_Count_Progress = 0
For i = 0 To UBound(Arr_Select_DB())
    If Arr_Select_DB(i) = True Then
    str_Select_Count_Progress = str_Select_Count_Progress + 1
    DoEvents
    
    txt_Show.Text = txt_Show.Text & Flag_Tab & " " & Arr_DB_File(i) & Flag_Tab & vbCrLf  '显示此次操作的
    ReDim Arr_Table_Name(Arr_Table_Count(i) - 1)
    
    Main_P.Value = str_Select_Count
    lab_Main_P.Caption = Int((str_Select_Count_Progress) / Int_Select_DB * 100) & "%"
    lab_Main_P_Count.Caption = (str_Select_Count_Progress) & "/" & Int_Select_DB
    
    Sub_P.Max = Arr_Table_Count(i)  '定义该数据库表的数量
    
    For k = 0 To Arr_Table_Count(i) - 1 '获取 数据库中包含有的所有 表 list
        
        Sub_P.Value = k + 1
        lab_Sub_P.Caption = Int((k + 1) / Arr_Table_Count(i) * 100) & "%"
        
        If i = 0 Then
            Arr_Table_Name(k) = Arr_Tem_TableName(k)
        ElseIf i = 1 Then
            Arr_Table_Name(k) = Arr_Tem_TableName(k + Arr_Table_Count(0))
        ElseIf i = 2 Then
            Arr_Table_Name(k) = Arr_Tem_TableName(k + Arr_Table_Count(1) + Arr_Table_Count(0))
        End If
        
        
        ReDim Arr_Tem_TableName_Field_Size(Arr_Table_Count(i) - 1)
        ReDim Arr_Tem_TableName_DataCount(Arr_Table_Count(i) - 1)
        ReDim Arr_Tem_TableName_DataCount_Info(Arr_Table_Count(i) - 1)
        ReDim Arr_Table_Name_DataCount(Arr_Table_Count(i) - 1)
        
        Call Load_Table_Info(Arr_DB_File_Address(i), Arr_Table_Name(k), Arr_Tem_TableName_Field_Size(k), Arr_Tem_TableName_DataCount_Info(k), Arr_Tem_TableName_DataCount(k))   '得到对应的每个表的 字段大小 以及数据量
                Set xlSheet = xlBook.Worksheets("Summary")  '开始操作 选定的 Sheet-》对应表名
        xlSheet.Activate
        DoEvents
        
        'str_Save_Tem = str_Save_Tem & Arr_DB_Name(i) & ","
        xlSheet.cells(1, 1) = "WYZ@" & str_Code   '第 1 行为验证码:@ 文件名 Arr_DB_BackUp_File_Name
        xlSheet.cells(2, 1) = "WYZ@" & Arr_DB_BackUp_File_Name  '第 2 行为文件名
        xlSheet.cells(3, 1) = "Back Up User:" & LogOn_User_IDName   '第 3 行为 备份者
        xlSheet.cells(4, 1) = "Restore Time:" & ""  '第 4 行为 本次恢复时间
        xlSheet.cells(5, 1) = "Restore User:" & ""   '第 5 行为 本次恢复者        
        '第 6 行为 空
        '第 7+i 行为 数据库 表 字段信息
        '第 8+i 行为 数据库 表 数据量信息
        
        txt_Show.Text = txt_Show.Text & Format(k, "00") & ">>Count: <<" & Arr_Tem_TableName_DataCount(k) & " (" & Arr_Table_Name(k) & " Info)" & vbCrLf
        lab_Count.Caption = Arr_Tem_TableName_DataCount(k)
        
        If i = 0 Then
            xlSheet.cells(7 + k * 3, 1) = Arr_Tem_TableName_Field_Size(k)
            xlSheet.cells(8 + k * 3, 1) = Arr_Tem_TableName_DataCount_Info(k)
        Else
            xlSheet.cells(7 + k * 3 + Arr_Table_Count(i - 1), 1) = Arr_Tem_TableName_Field_Size(k)
            xlSheet.cells(8 + k * 3 + Arr_Table_Count(i - 1), 1) = Arr_Tem_TableName_DataCount_Info(k)
        End If
        
        
    
        Set xlSheet = xlBook.Worksheets(Arr_Table_Name(k))  '开始操作 选定的 Sheet-》对应表名
        xlSheet.Activate
        DoEvents
        '载入数据库 搜索表
        WIS_SelectDB_Dest_DataBaseConnectName = Arr_DB_File_Address(i)
        If InStr(Arr_Table_Name(k), "@") = 0 Then
            WIS_Search_MDB_Str = "Select * from " & Arr_Table_Name(k)     '& " where 1=2"
        Else
            'MsgBox Mid(Arr_Table_Name(K), 3)
            WIS_Search_MDB_Str = "Select * from " & Mid(Arr_Table_Name(k), 3)   '& " where 1=2"
        End If
        Set WIS_SelectDB_Dest_Rs = WIS_Select_DB_Connect(WIS_Search_MDB_Str)
        
        DoEvents
        xlSheet.cells.CopyFromRecordset WIS_SelectDB_Dest_Rs
        DoEvents
    Next k
    
    DoEvents    WIS_SelectDB_Dest_Rs.Close
    Set WIS_SelectDB_Dest_Rs = Nothing
    
    DoEvents
    
    End If
    
    DoEvents
Nextlab_Count.Caption = "Done"
xlApp.ActiveWorkbook.SaveAs Arr_DB_BackUp_File_Address, , , "1234"    '创建有密码的Excel
xlApp.QuitSet xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing

解决方案 »

  1.   

    在QUIT前,先手工关闭一下所有工作表试试:xlApp.Quit前添加:xlApp.Workbooks.Close
      

  2.   

    还是不行..郁闷..我这样尝试,发现 Excel进程仍然没有退出:
    Set xlApp = CreateObject("Excel.application")
    'Set xlApp = New Excel.ApplicationxlApp.Visible = False  '操作不可见
    Set xlBook = xlApp.Workbooks.Add()     '打开创建号的备份文件Set xlSheet = ActiveWorkbook.Worksheets.Add         '添加新sheet
    xlSheet.Name = "tem"                   '重命名新sheet
            
    xlApp.ActiveWorkbook.SaveAs "C:\1.xls", , , "1234"
    xlApp.ActiveWorkbook.Close
    'xlApp.Workbooks.Close
    xlApp.QuitSet xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
      

  3.   

        xlBook.Close False
        Set xlBook = Nothing
        xlApp.Quit
        Set xlApp = Nothing
      

  4.   


    Private Sub Command1_Click()
    Set xlApp = CreateObject("Excel.application")xlApp.Visible = False  '操作不可见
    Set xlBook = xlApp.Workbooks.Add()     '打开创建号的备份文件Set xlSheet = xlApp.ActiveWorkbook.Worksheets.Add         '添加新sheet
    xlSheet.Name = "tem"                   '重命名新sheet
    xlApp.ActiveWorkbook.SaveAs "C:\1.xls", , , "1234"
    xlApp.ActiveWorkbook.Close
    xlApp.QuitSet xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    End Sub
      

  5.   

    第一次正常退出excel,再次存会出错,然后excel会不能正常退出,可以做错误判断处理。
      

  6.   


    Public   Sub   subKillProcess(ByVal   strProcess   As   String)         Dim   strComputer   As   String 
            Dim   objWMIService   As   Object 
            Dim   colProcessList 
            Dim   objProcess   As   Object 
            
            On   Error   Resume   Next 
            
            strComputer   =   ". " 
            Set   objWMIService   =   GetObject( "winmgmts: "   _ 
                    &   "{impersonationLevel=impersonate}!\\ "   &   strComputer   &   "\root\cimv2 ") 
            Set   colProcessList   =   objWMIService.ExecQuery   _ 
                    ( "Select   *   from   Win32_Process   Where   Name   =   ' "   &   strProcess   &   " ' ") 
            For   Each   objProcess   In   colProcessList 
                    objProcess.Terminate 
            Next 
            
    End   Sub 以前也碰到过实在不行就杀死
    传过来‘Excel.exe’ 
    杀死进程中的Excel
    不过可能误杀其他的excle
      

  7.   


    尝试过,进程里头还是有 Excel.exe。Excel我所说的退出是指文件的正常消失不见,但看进程里还是存在 Excel.exe,如果再次这个代码就得不到想要的结果,在创建多Sheet的地方直接跳到下一部分,最终得到的是只有 Sheet1,Sheet2没有数据的文件.Call subKillProcess("EXCEL.EXE")   '无法删除 Excel.exe 进程另外补充一个信息:所说的 Excel.exe进程是在  svchost.exe进程下,一般直接打开 excel文件,显示的 excel.exe进程是在 explorer.exe下...
      

  8.   

    我说是以下代码,excel进程可以正常退出,你换个机试试,看看你的系统是否有问题。Private Sub Command1_Click()
    Set xlApp = CreateObject("Excel.application")xlApp.Visible = False  '操作不可见
    Set xlBook = xlApp.Workbooks.Add()     '打开创建号的备份文件Set xlSheet = xlApp.ActiveWorkbook.Worksheets.Add         '添加新sheet
    xlSheet.Name = "tem"                   '重命名新sheet
    xlApp.ActiveWorkbook.SaveAs "C:\1.xls", , , "1234"
    xlApp.ActiveWorkbook.Close
    xlApp.QuitSet xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    End Sub
      

  9.   

    你把application.visible设为true,然后就可以调试代码了, 万一关不掉也可以手动点叉叉.一般来说,先关闭对象再销毁肯定是没问题的.
      

  10.   

    Set xlApp = CreateObject("Excel.application") '新建了一个 Excel A
    Set xlBook = xlApp.Workbooks.Add() '在 Excel A 中创建了一个工作簿
    Set xlSheet = ActiveWorkbook.Worksheets.Add '在当前 Excel B 的当前工作簿中添加页
    xlApp.ActiveWorkbook.SaveAs Arr_DB_BackUp_File_Address, , , "1234" 'Excel A 的当前工作簿保存文件很明显,你在工程中引用了 Excel。第一次运行:
    CreateObject("Excel.application") 创建了 Excel A。
    调用 ActiveWorkbook 时,当前 Excel 会对应到前面创建的 Excel 中,即 Excel B = Excel A。
    调用 Set xlApp = Nothing 后,用于当前的 Excel B 引用,所以 Excel A/B 进程继续保留。第二次运行(以后类同):
    CreateObject("Excel.application") 创建了 Excel A2。
    调用 ActiveWorkbook 时,当前 Excel B 已存在,这时 Excel B <> Excel A2。
    结果就是向 Excel B 中添加页面,用 Excel A2 保存文件。既然用了 CreateObject("Excel.application"),工程就没必要引用 Excel 了。引用了反而导致你这种双实例的混淆。
      

  11.   

    更正:第一次运行:
    调用 Set xlApp = Nothing 后,用于由于当前的 Excel B 引用,所以 Excel A/B 进程继续保留。
      

  12.   

    Set xlSheet = xlBook.Worksheets.Add         '添加新sheet这样用
      

  13.   

    xlBook.SaveAs Arr_DB_BackUp_File_Address, , , "1234"    '创建有密码的Excel
      

  14.   

    To jhone99:
    “画一条线,1美元;知道在哪儿画线,9999美元。”
      

  15.   

        
        xlBook.Close (True)        
        
        xlApp.Quit              
    试试加个参数