|
楼主 |
发表于 2009-5-8 10:09
|
显示全部楼层
第8部分 控件与用户窗体
技巧146 在窗体中显示图表
工作表中的图表是不能直接显示在窗体中的,如果需要在窗体上显示图表,除了使用技巧61 介绍的使用ShowWindow属性将工作表中嵌入的图表显示在独立的窗口中,还可以使用以下的方法。
146-1 使用Export方法
可以把图表以图形格式从工作表中导出,再用窗体上的Image控件把图表显示出来,如下面的代码所示。- #001 Private Sub UserForm_Initialize()
- #002 Dim Charts As Chart
- #003 Dim cName As String
- #004 Set Charts = Sheets("Sheet2").ChartObjects(1).Chart
- #005 cName = ThisWorkbook.Path & "\Temp.gif"
- #006 Charts.Export Filename:=cName, FilterName:="GIF"
- #007 Image1.Picture = LoadPicture(cName)
- #008 End Sub
复制代码 代码解析:
窗体的初始化事件过程,窗体加载时将工作表中的图表显示在窗体中。
第4行到第6行代码,使用Export方法把Sheet2表中的第一个图表导出到工作簿的同一目录下。
Export方法以图形格式导出图表,语法如下:
expression.Export(Filename, FilterName, Interactive)
参数expression是必需的,一个有效的对象。
参数Filename是必需的,导出的文件的名称。
本例中设置Filename参数时加上了导出路径,将图形导出到同一文件夹下。
参数FilterName是可选的,导出文件的格式。
第7行代码,设置窗体中Image控件的Picture属性为导出文件的完整路径。
Picture 属性指定显示在对象上的位图,语法如下:
object.Picture = LoadPicture( pathname )
参数expression是必需的,一个有效的对象。
参数pathname是必需的,一个图片文件的完整路径。
为了使窗体关闭时删除导出的图片文件,在窗体的QueryClose事件中写入下面的代码。- #001 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
- #002 Kill ThisWorkbook.Path & "\Temp.gif"
- #003 End Sub
复制代码 代码解析:
窗体关闭时使用Kill方法删除导出的图片文件。Kill方法的语法如下:
Kill pathname
参数Pathname是必需的,用来指定一个文件名的字符串表达式。Pathname参数可以包含目录或文件夹、以及驱动器。
运行窗体,将工作表的图表显示在窗体中,如图所示。
146-2 使用API函数
可以使用API函数把图表从工作表中导出,再用窗体上的Image控件把图表显示出来,如下面的代码所示。- #001 Private Declare Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As Long, ppstm As Any) As Long
- #002 Private Declare Function OleLoadPicture Lib "olepro32" (pStream As Any, ByVal lSize As Long, ByVal fRunmode As Long, riid As Any, ppvObj As Any) As Long
- ………代码略详见附件
- #012 Private Declare Function GetClipboardFormatName Lib "user32" Alias "GetClipboardFormatNameA" (ByVal wFormat As Long, ByVal lpString As String, ByVal nMaxCount As Long) As Long
- #013 Public Function LoadShapePicture(shp As Object) As IPictureDisp
- #014 Dim nClipsize As Long
- #015 Dim hMem As Long
- #016 Dim lpData As Long
- #017 Dim sdata() As Byte
- #018 Dim fmt As Long
- #019 Dim fmtName As String
- #020 Dim iClipBoardFormatNumber As Long
- #021 Dim IID_IPicture(15)
- ……代码略详见附件
- #058 EmptyClipboard
- #059 CloseClipboard
- #060 End Function
- #061 Private Sub UserForm_Initialize()
- #062 Image1.Picture = LoadShapePicture(Sheet1.ChartObjects(1))
- #063 End Sub
复制代码 代码解析:
第1行到第12行代码API函数声明。
第13行到第60行代码LoadShapePicture函数,导出工作表中的图表。
第61行到第63行代码窗体的初始化事件过程,窗体加载时将工作表中的图表显示在窗体中,如图所示。关于Image 控件的Picture属性请参阅技巧146-1。
|
|