我们后天要给用户安装系统,并且在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
但是在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
Dim MyXL As Excel.Application
Set MyXL = Getobject(, "Excel.Application")
if not MyXL is nothing then MyXL.Quit
set myxl=nothing关闭所有正在打开的Excel就用一个循环
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没有正常退出
Doevents在结束的部分你不用再判断
Not xlSheet Is Nothing 直接释放
If Not xlBook Is Nothing Then 直接释放,去掉.close
还有就是在发现有错误的时候 Err:
里面最有加入
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
用Excel测试的结果,不是所有的Excel文档都会无法退出的,五个Excel文档只有两个上千条记录的Excel文档在Win98导入以后,Excel无法正常退出。肯能没响应。
我单步调试的结果,XlApp.Quit被执行了,但是按下Ctrl+Alt+Del看到Excel仍在运行.如果Excel不能正常退出,导入函数结束以后,整个系统都接近于死机。VB调试环境下我的程序的时候,执行End返回VB,VB完全没反应。不单我的程序。运行其他程序,像IE,Work,都一点反应都没有。但是结束了Excel进程以后,整个系统的程序运行都没问题了。
我估计Excel执行了Quit,但是没响应。有没有什么办法把Excel暴力结束了它算了。
set xlApp.visible=true
把EXCEL显示出来,然后让用户来关闭!
记得给我分!!!
我把Excel设置为可见,程序不关闭Excel,我手工关闭Excel程序,我关闭前按下Ctrl+Alt+Del,发现没有Excel的进程运行,但是把Excel关闭以后,再按下Ctrl+Alt+Del,看到有Excel进程,并且系统无响应。可能是这个Excel进程是关闭Excel过程中产生的。
你的系统会不会Problem?你在看看换个系统会不会有问题!
我做过相同的系统,
在queryunload事件中
Set TempExcel = Nothing