分享

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

 wdmexcel 2015-09-23

134 使用TreeView控件显示层次

TreeView控件是一个树形结构的控件,该控件用于显示分层数据,如目录或文件目录,使程序的表现更为灵活,用户的操作更加方便,示例代码如下:

Private Sub UserForm_Initialize()

Dimc As Integer

Dimr As Integer

Dimrng As Variant

rng= Sheet1.UsedRange

WithMe.TreeView1

.Style = tvwTreelinesPlusMinusPictureText

.LineStyle = tvwRootLines

.CheckBoxes = False

With .Nodes

.Clear

.Add Key:='科目'Text:='科目名称'

For c = 1 To Sheet1.UsedRange.Columns.Count

For r = 2 To Sheet1.UsedRange.Rows.Count

If Not IsEmpty(rng(rc)) Then

If c = 1 Then

.Add relative:='科目'relationship:=tvwChildKey:=rng(rc)Text:=rng(rc)

ElseIf Not IsEmpty(rng(rc - 1)) Then

.Add relative:=rng(rc - 1)relationship:=tvwChildKey:=rng(rc)Text:=rng(rc)

Else

.Add relative:=CStr(Sheet1.Cells(rc - 1).End(xlUp))relationship:=tvwChildKey:=rng(rc)Text:=rng(rc)

End If

End If

Next

Next

End With

EndWith

End Sub

代码解析:

在窗体初始化时将工作表中的科目名称填充TreeView控件。

7行代码,设置TreeView控件每个列表的组成方式。Style属性设置值如表格所示。

8行代码,设置TreeView控件显示根节点连线。TreeView控件的LineStyle属性设置为tvwRootLines显示根节点连线,设置为tvwTreeLines则隐藏根节点连线。

9行代码,设置TreeView控件不显示复选框。

10行代码使用Nodes属性返回对TreeView控件的Node对象的集合的引用。

11行代码,清除TreeView控件所有的节点。

12行代码,使用Add方法在Treeview控件的Nodes集合中添加一个Node对象。,Add方法语法如下:

object.Add(relativerelationshipkeytextimageselectedimage)

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

参数Relative是可选的,代表已存在的Node对象的索引号或键值。

参数relationship是可选的,代表新节点与已存在的节点间的关系,指定的Node对象的相对位置。relationship的设置值如表格所示。

参数key是可选的,唯一的字符串,可用于用Item方法检索Node

参数text 是必需的,在Node中出现的字符串。

参数image是可选的,代表一个图像或在ImageList控件中图象的索引。

参数selectedimage是可选的,代表一个图像或在ImageList控件中图象的索引,在 Node被选中时显示。

13行到第25行代码代,在根节点下添加子节点。添加子节点仍然使用Add方法,需要一个唯一的Key值,必须提供根节点的Key(参数relative)和参数relationship(tvwChild)。要将子节点链接到根节点的下面,参数relative必须与根节点的Key值一致,参数relationship必须设置为tvwchild。要使子节点有效,子节点必须也有自已唯一的Key值。

获得双击TreeView控件后的返回值的代码如下:

Private Sub TreeView1_DblClick()

If TreeView1.SelectedItem.Children= 0 Then

Sheet1.Range('A65536').End(xlUp).Offset(1)= TreeView1.SelectedItem.Text

Else

MsgBox '所选择的不是末级科目,请重新选择科目!'

EndIf

End SubTreeView1_ DblClick过程是TreeView控件的双击事件,将所选的科目名称写入到工作表中。

2行代码判断所选节点是否是末级科目。TreeView控件的SelectedItem属性返回当前所选择的节点,而Children属性检查所选节点是否还有子节点,如没有子节点则返回0

135 用户窗体添加图标

用户窗体在显示时标题栏上是没有图标的,如果希望在窗体上添加图标,可以借助API函数在窗体显示时添加自定义的图标。

VBE窗口中单击菜单“插入”→“用户窗体”,插入一个窗体,在窗体中添加一个Image控件,设置Image控件Picture属性为自定义图标的位图,并将Image控件的Visible属性设置为False,使窗体运行时隐藏Image控件。

VBE中双击窗体,写入下面的代码。

Private Declare Function SendMessage Lib'user32' Alias 'SendMessageA' (ByVal hWnd As LongByVal wMsg As LongByVal wParamAs LonglParam As Any) As Long

Private Declare Function DrawMenuBar Lib'user32' (ByVal hWnd As Long) As Long

Private Declare Function FindWindow Lib'user32' Alias 'FindWindowA' (ByVal lpClassName As StringByVal lpWindowName As String) As Long

Private Const WM_SETICON = &H80

Private Const ICON_SMALL = 0&

Private Const ICON_BIG = 1&

Sub ChangeIcon(ByVal hWnd As LongOptional ByVal hicon As Long = 0&)

SendMessagehWndWM_SETICONICON_SMALLByVal hicon

SendMessagehWndWM_SETICONICON_BIGByVal hicon

DrawMenuBarhWnd

End Sub

Private Sub UserForm_Initialize()

DimhWnd As Long

hWnd= FindWindow(vbNullStringMe.Caption)

CallChangeIcon(hWndImage1.Picture.Handle)

End Sub

代码解析:

窗体的初始化事件,窗体在显示时运行ChangeIcon函数,在标题栏中添加图标。

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

7行到第11行代码,ChangeIcon过程,用于转换图标。

14行代码,获得窗口句柄。

15行代码,运行ChangeIcon过程,将Image控件中的位图显示在窗体的标题栏上。

运行窗体后,在窗体标题栏上添加图标。

136 用户窗体添加最大最小化按纽

VBA中的窗体标题栏上只有关闭按纽,没有最大最小化按纽的,可以使用API函数在窗体的标题栏上添加最大最小化按纽,如下面的代码所示。

Private Declare Function FindWindow Lib'user32' Alias 'FindWindowA' (ByVal lpClassName As StringByVal lpWindowName As String) As Long

Private Declare Function GetWindowLong Lib'user32' Alias 'GetWindowLongA' (ByVal hWnd As LongByVal nIndex As Long) As Long

Private Declare Function SetWindowLong Lib'user32' Alias 'SetWindowLongA' (ByVal hWnd As LongByVal nIndex As LongByVal dwNewLongAs Long) As Long

Private Const WS_MAXIMIZEBOX = &H10000

Private Const WS_MINIMIZEBOX = &H20000

Private Const GWL_STYLE = (-16)

Private Sub UserForm_Initialize()

DimhWndForm As Long

DimiStyle As Long

hWndForm= FindWindow('ThunderDFrame'Me.Caption)

iStyle= GetWindowLong(hWndFormGWL_STYLE)

iStyle= iStyle Or WS_MINIMIZEBOX

iStyle= iStyle Or WS_MAXIMIZEBOX

SetWindowLonghWndFormGWL_STYLEiStyle

End Sub

代码解析:

窗体初始化时使用API函数在标题栏上添加最大最小化按纽。

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

10行代码,获取窗口句柄。

11行到第14行代码,在标题栏上添加最大最小化按纽。

运行窗体后效果。

137 禁用窗体标题栏的关闭按钮

如果不希望用户通过窗体标题栏的关闭命令来关闭窗体,可以禁用窗体标题栏上的关闭按钮,如下面的代码所示。

Private Sub UserForm_QueryClose(Cancel As IntegerCloseMode As Integer)

If CloseMode<> 1 Then

Cancel = True

MsgBox '请点击按钮关闭窗体!'

EndIf

End Sub

代码解析:

窗体的QueryClose事件,禁用窗体标题栏上的关闭按钮。

窗体的QueryClose事件发生在窗体关闭之前,语法如下:

Private Sub UserForm_QueryClose(cancelAs Integerclosemode As Integer)

参数Cance是可选的,整数。将此参数设置成 0 以外的任意值,在所有加载的用户窗体中停止QueryClose事件,并防止关闭窗体与应用程序。

参数closemode是可选的,一个值或常数,用来指示引起QueryClose事件的原因。

closemode参数的设置值如表格所示。

23行代码,如果窗体不是由代码调用Unload语句关闭,则停止关闭过程,从而禁用窗体标题栏的关闭按钮。

需要注意的是,一定要在窗体上设置关闭窗体的途径,否则会使窗体无法关闭。

窗体运行后,禁用窗体上的关闭按钮关闭窗体,只能使用按钮关闭窗体。


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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多