分享

VBA常用代码解析(第四十讲)

 wdmexcel 2015-10-27

 

144 用户窗体的打印

在使用如图 144 1所示的窗体录入数据时,如果需要把窗体打印出来,可以使用PrintForm方法,如下面的代码所示。

Private Sub CommandButton7_Click()

Dim myHeight As Integer

Application.ScreenUpdating = False

With UserForm1

myHeight = .Height

.DTPicker1.Visible = False

.Frame1.Visible = False

.Height = myHeight - 30

.PrintForm

.Height = myHeight

.DTPicker1.Visible = True

.Frame1.Visible = True

End With

Application.ScreenUpdating = True

End Sub

代码解析:

录入窗体中的“打印”按钮的单击代码,使用PrintForm方法打印窗体。

5行代码使用变量myHeight记录窗体的Height属性值,以便在第10行代码中恢复窗体原有的高度。

67行代码将窗体中的DTP日历控件和功能按钮的Visible属性设置为False,使之隐藏,这样在打印时就不会被打印出来。

9行代码使用PrintForm方法打印窗体,PrintForm方法将UserForm对象的图象逐位发送到打印机,语法如下:

object.PrintForm

参数object代表对象表达式,其值为“应用于”列表中的对象。如果省略该参数,则把焦点所在的窗体当做object

1112行代码重新显示窗体中的DTP日历控件和功能按钮。

145 使用自定义颜色设置窗体颜色

在用VBA进行设计时,会发现控件与颜色相关的属性中系统提供可选择的颜色太少。比如窗体的BackColor属性,如果需要把窗体的背景颜色设置为淡蓝色RGB(52150203),可以在窗体初始化过程中对之进行设置,可以实现想要的效果,但是在设计时却不能看到最终效果。

其实窗体的BackColor属性(包括ForeColor以及BorderColor等等这些设置颜色的属性)允许输入一个以十六进制表示的长整型数值,这样在设计时就看到效果。

首先获取所需要的颜色值并以十六进制表示。还以上面的颜色为例,在立即窗口输入“? Hex(RGB(52150203))”可得到一个十六进制数据CB9634,然后把光标定位在窗体属性窗口的BackColor属性值中,删除原来的数值后,输入“&HCB9634&”后按<Enter>键,窗体颜色效果立即就出现了。

146 在窗体中显示图表

工作表中的图表是不能直接显示在窗体中的,如果需要在窗体上显示图表,除了使用▲61 介绍的使用ShowWindow属性将工作表中嵌入的图表显示在独立的窗口中,还可以使用以下的方法。

146-1 使用Export方法

可以把图表以图形格式从工作表中导出,再用窗体上的Image控件把图表显示出来,如下面的代码所示。

Private Sub UserForm_Initialize()

Dim Charts As Chart

Dim cName As String

Set Charts = Sheets('Sheet2').ChartObjects(1).Chart

cName = ThisWorkbook.Path & '\Temp.gif'

Charts.Export Filename:=cNameFilterName:='GIF'

Image1.Picture = LoadPicture(cName)

End Sub

代码解析:

窗体的初始化事件过程,窗体加载时将工作表中的图表显示在窗体中。

4行到第6行代码,使用Export方法把Sheet2表中的第一个图表导出到工作簿的同一目录下。

Export方法以图形格式导出图表,语法如下:

expression.Export(FilenameFilterNameInteractive)

参数expression是必需的,一个有效的对象。

参数Filename是必需的,导出的文件的名称。

本例中设置Filename参数时加上了导出路径,将图形导出到同一文件夹下。

参数FilterName是可选的,导出文件的格式。

7行代码,设置窗体中Image控件的Picture属性为导出文件的完整路径。

Picture 属性指定显示在对象上的位图,语法如下:

object.Picture = LoadPicture( pathname )

参数expression是必需的,一个有效的对象。

参数pathname是必需的,一个图片文件的完整路径。

为了使窗体关闭时删除导出的图片文件,在窗体的QueryClose事件中写入下面的代码。

Private Sub UserForm_QueryClose(Cancel As IntegerCloseMode As Integer)

Kill ThisWorkbook.Path & '\Temp.gif'

End Sub

代码解析:

窗体关闭时使用Kill方法删除导出的图片文件。Kill方法的语法如下:

Kill pathname

参数Pathname是必需的,用来指定一个文件名的字符串表达式。Pathname参数可以包含目录或文件夹、以及驱动器。运行窗体,将工作表的图表显示在窗体中。

146-2 使用API函数

可以使用API函数把图表从工作表中导出,再用窗体上的Image控件把图表显示出来,如下面的代码所示。

Private Declare Function CreateStreamOnHGlobal Lib 'ole32' (ByVal hGlobal As LongByVal fDeleteOnRelease As Longppstm As Any) As Long

Private Declare Function OleLoadPicture Lib 'olepro32' (pStream As AnyByVal lSize As LongByVal fRunmode As Longriid As AnyppvObj As Any) As Long

………代码略详见附件

Private Declare Function GetClipboardFormatName Lib 'user32' Alias 'GetClipboardFormatNameA' (ByVal wFormat As LongByVal lpString As StringByVal nMaxCount As Long) As Long

Public Function LoadShapePicture(shp As Object) As IPictureDisp

Dim nClipsize As Long

Dim hMem As Long

Dim lpData As Long

Dim sdata() As Byte

Dim fmt As Long

Dim fmtName As String

Dim iClipBoardFormatNumber As Long

Dim IID_IPicture(15)

……代码略详见附件

EmptyClipboard

CloseClipboard

End Function

Private Sub UserForm_Initialize()

Image1.Picture = LoadShapePicture(Sheet1.ChartObjects(1))

End Sub

代码解析:

1行到第12行代码API函数声明。

13行到第60行代码LoadShapePicture函数,导出工作表中的图表。

61行到第63行代码窗体的初始化事件过程,窗体加载时将工作表中的图表显示在窗体中。关于Image 控件的Picture属性请参阅▲146-1

147 窗体运行时调整控件大小

用户窗体中的控件在运行时是不能调整大小的,而在某些情况下需要在窗体运行时调整控件的大小,此时可以利用控件的MouseMove事件。

步骤1,在VBE窗口中单击菜单“插入”→“用户窗体”,在窗体中添加两个框架控件,在框架控件中间添加一个Image控件。

步骤2Image控件是用来在窗体运行时拖动调整框架控件大小的,所以需要在Image控件的属性窗口将BackStyle属性设置为fmBackStyleTransparent,使控件的背景为透明;将BorderStyle属性设置为fmBorderStyleNone,使控件无可见的边框线;MousePointer属性设置为fmMousePointerSizeWE,当用户把鼠标放到Image控件上时,鼠标指针的类型为东西向的双箭头。关于控件的MousePointer属性请参阅▲141

步骤3,在窗体中调整好控件的位置后双击Image控件写入下面的代码:

Dim Abscissa As Single

Private Sub Image1_MouseDown(ByVal Button As IntegerByVal Shift As IntegerByVal x As SingleByVal y As Single)

Abscissa = x

End Sub

Private Sub Image1_MouseMove(ByVal Button As IntegerByVal Shift As IntegerByVal x As SingleByVal y As Single)

If Button = 1 Then

If Abscissa - x > Frame1.Width Or x > Frame2.Width Then Exit Sub

Frame1.Width = Frame1.Width - Abscissa + x

Image1.Left = Image1.Left - Abscissa + x

Frame2.Left = Frame2.Left - Abscissa + x

Frame2.Width = Frame2.Width + Abscissa - x

End If

End Sub

代码解析:

2行到第4行代码,Image控件的MouseDown事件过程,用户按下鼠标按键时发生,语法如下:

Private Sub object_MouseDown( ByVal Button As fmButtonByVal Shift As fmShiftStateByVal X As SingleByVal Y As Single)

其中参数x是可选的,控件位置的横坐标,以磅为单位,从左边开始测量。

3行代码将控件的横坐标赋给变量Abscissa

5行到第12行代码,Image控件的MouseMove事件过程,用户移动鼠标时该事件发生,语法如下:

Private Sub object_MouseMove( ByVal Button As fmButtonByVal Shift As fmShiftStateByVal X As SingleByVal Y As Single)

其中参数Button是必需的,标识鼠标按键状态的整数值,其设置值如表格所示。

参数x是可选的,控件位置的水平坐标,以磅为单位,从左边开始测量。

MouseMove事件过程中,当用户在窗体上按下左键移动鼠标时,调整两个框架控件的Width属性和框架2Left属性,使其达到窗体运行时可以进行拖动调整大小的效果。

当鼠标指针在对象上移动时,MouseMove事件是连续发生的,只要鼠标位于对象的边界之内,对象就会不断的识别MouseMove事件,所以框架控件可以连续的进行拖动调整大小。

运行窗体的,选择两个框架控件的中间位置,当鼠标指针变成东西向的双箭头时按下鼠标左键拖动可以进行拖动调整框架控件的大小。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多