最近用到VB调用EXCEL创建图表,编写程序的过程中遇到一些问题,通过不断的总结终于解决问题。尤其是利用VB打开EXCEL后不能正常关闭有了一定的认识,现在和各位有需求的朋友分享一下自己小小的经验。
不能正常关闭EXCEL大致有两点,一是打开EXCEL文件后没有释放EXCEL所占用的资源;二是程序中调用EXCEL或读写EXCEL时程序有错;以上两点比较常见,其他的原因目前还没有遇见,也就不多发表意见了。
正常释放EXCEL资源的语句顺序见示例最后一段程序,我调试过可以正常退出EXCEL。
通常不能退出EXCEL的问题中,提示的错误信息大多为实时错误 "1004 " 对象'Sheets'的方法 '_global'
失败。
通常情况下,我们可以通过录制EXCEL宏来实现代码的翻译,但此时要相当小心,在将宏程序移植到自己的程序时一定要注意,那就是在录制的程序的语句前加上EXCEL的类声明,如ActiveChart.ChartType = xlColumnClustered为生成的语句,在调用时一定更新为xlApp.ActiveChart.ChartType = xlColumnClustered,这样可以保证每次成功退出EXCEL。
还有就是RANGE功能,使用不当也经常引起不能正常退出EXCEL,在利用其选取多个单元格时,其写法应足够小心。如 xlApp.ActiveChart.SetSourceData Source:=xlApp.Sheets("Sheet1").Range("A1:G1"), PlotBy:= _ xlRows,若不加xlApp,会导致第一次可以正常退出,第二次出现异常不能正常退出EXCEL。另外一种写法,如xlApp.Sheets("Sheet1").Range(cells(1,1),cells(20,20)),在这条语句运行后第一次正常,第二次就会引起异常,正确的写法应为xlApp.Sheets("Sheet1").Range(Sheets.cells(1,1),Sheets.cells(20,20)), 按照以上的说明基本上可以正常调用EXCEL文件。
Dim xlApp As Excel.Application '定义EXCEL类 Dim xlBook As Excel.Workbook '定义工件簿类 Dim xlsheet As Excel.Worksheet '定义工作表类
Private Sub Command1_Click() Dim xlBook As Object Dim xlsheet As Object Dim i, j As Integer Dim Filename As String CommonDialog.Filter = "All Files|*.*|(*.exe)|*.exe|(*.xls)|*.xls|(*.txt)|*.txt" CommonDialog.ShowSave
Filename = CommonDialog.Filename Set xlApp = CreateObject("Excel.Application") '创建EXCEL应用类 Set xlBook = xlApp.Workbooks.Add xlApp.Visible = True '设置EXCEL可见 Set xlsheet = xlBook.Sheets(1) xlApp.Range("A1").Value = "11" xlApp.Range("B1").Value = "22" xlApp.Range("C1").Value = "33" xlApp.Range("D1").Value = "33" xlApp.Range("E1").Value = "44" xlApp.Range("F1").Value = "55" xlApp.Range("G1").Value = "44"
xlApp.Charts.Add xlApp.ActiveChart.ChartType = xlColumnClustered xlApp.ActiveChart.SetSourceData Source:=xlApp.Sheets("Sheet1").Range("A1:G1"), PlotBy:= _ xlRows xlApp.ActiveChart.Location Where:=xlLocationAsNewSheet With xlApp.ActiveChart .HasTitle = True .ChartTitle.Characters.Text = "数据统计图表" .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "时间间隔" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "同步次数" End With With xlApp.ActiveChart.Axes(xlCategory) .HasMajorGridlines = True .HasMinorGridlines = False End With With xlApp.ActiveChart.Axes(xlValue) .HasMajorGridlines = True .HasMinorGridlines = False End With xlApp.ActiveChart.HasLegend = False xlApp.ActiveWindow.Visible = True xlApp.Charts.Add xlApp.ActiveChart.ChartType = xlColumnClustered xlApp.ActiveChart.SetSourceData Source:=xlApp.Sheets("Sheet1").Range("A1:J1"), PlotBy:= _ xlRows xlApp.ActiveChart.Location Where:=xlLocationAsNewSheet With xlApp.ActiveChart .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False End With xlApp.Charts.Add xlApp.ActiveChart.ChartType = xlColumnClustered xlApp.ActiveChart.SetSourceData Source:=xlApp.Sheets("Sheet1").Range("A1:K1"), PlotBy:= _ xlRows xlApp.ActiveChart.Location Where:=xlLocationAsNewSheet With xlApp.ActiveChart .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False End With xlApp.Charts.Add xlApp.ActiveChart.ChartType = xlColumnClustered xlApp.ActiveChart.SetSourceData Source:=xlApp.Sheets("Sheet1").Range("A1:M1"), PlotBy:= _ xlRows xlApp.ActiveChart.Location Where:=xlLocationAsNewSheet With xlApp.ActiveChart .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False End With xlBook.SaveAs Filename '保存工作薄 正确退出EXCEL Set xlshee = Nothing xlBook.Close '关闭EXCEL工作簿 Set xlBook = Nothing xlApp.Quit '关闭EXCEL Set xlApp = Nothing '释放EXCEL对象
End Sub
|