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(r,c)) Then If c = 1 Then .Add relative:='科目',relationship:=tvwChild,Key:=rng(r,c),Text:=rng(r,c) ElseIf Not IsEmpty(rng(r,c - 1)) Then .Add relative:=rng(r,c - 1),relationship:=tvwChild,Key:=rng(r,c),Text:=rng(r,c) Else .Add relative:=CStr(Sheet1.Cells(r,c - 1).End(xlUp)),relationship:=tvwChild,Key:=rng(r,c),Text:=rng(r,c) 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(relative,relationship,key,text,image,selectedimage) 参数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 Long,ByVal wMsg As Long,ByVal wParamAs Long,lParam 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 String,ByVal 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 Long,Optional ByVal hicon As Long = 0&) SendMessagehWnd,WM_SETICON,ICON_SMALL,ByVal hicon SendMessagehWnd,WM_SETICON,ICON_BIG,ByVal hicon DrawMenuBarhWnd End Sub Private Sub UserForm_Initialize() DimhWnd As Long hWnd= FindWindow(vbNullString,Me.Caption) CallChangeIcon(hWnd,Image1.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 String,ByVal lpWindowName As String) As Long Private Declare Function GetWindowLong Lib'user32' Alias 'GetWindowLongA' (ByVal hWnd As Long,ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib'user32' Alias 'SetWindowLongA' (ByVal hWnd As Long,ByVal nIndex As Long,ByVal 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(hWndForm,GWL_STYLE) iStyle= iStyle Or WS_MINIMIZEBOX iStyle= iStyle Or WS_MAXIMIZEBOX SetWindowLonghWndForm,GWL_STYLE,iStyle End Sub 代码解析: 窗体初始化时使用API函数在标题栏上添加最大最小化按纽。 第1行到第6行代码,API函数声明。 第10行代码,获取窗口句柄。 第11行到第14行代码,在标题栏上添加最大最小化按纽。 运行窗体后效果。
▲137 禁用窗体标题栏的关闭按钮 如果不希望用户通过窗体标题栏的关闭命令来关闭窗体,可以禁用窗体标题栏上的关闭按钮,如下面的代码所示。 Private Sub UserForm_QueryClose(Cancel As Integer,CloseMode As Integer) If CloseMode<> 1 Then Cancel = True MsgBox '请点击按钮关闭窗体!' EndIf End Sub 代码解析: 窗体的QueryClose事件,禁用窗体标题栏上的关闭按钮。 窗体的QueryClose事件发生在窗体关闭之前,语法如下: Private Sub UserForm_QueryClose(cancelAs Integer,closemode As Integer) 参数Cance是可选的,整数。将此参数设置成 0 以外的任意值,在所有加载的用户窗体中停止QueryClose事件,并防止关闭窗体与应用程序。 参数closemode是可选的,一个值或常数,用来指示引起QueryClose事件的原因。 closemode参数的设置值如表格所示。 第2、3行代码,如果窗体不是由代码调用Unload语句关闭,则停止关闭过程,从而禁用窗体标题栏的关闭按钮。 需要注意的是,一定要在窗体上设置关闭窗体的途径,否则会使窗体无法关闭。 窗体运行后,禁用窗体上的关闭按钮关闭窗体,只能使用按钮关闭窗体。 |
|