WPS Office2007下载
首页 >> 技术文章 >> Office2007综合 >> Excel2003


树形目录控件——TreeView控件介绍

[示例二] TreeView控件常用方法、属性和事件示例(2)
在VBE编辑器中插入一个用户窗体,并在该窗体上添加一个TreeView控件、一个ImageList控件、两个标签控件、二个文字框、六个命令按钮,如下图13所示。

图13:设计界面
在该窗体的代码窗口中,输入下面的代码:
Option Explicit
'定义变量
Dim i As Integer
Dim j As Integer
Dim nodx As Node
Dim b As Boolean

Private Sub UserForm_Initialize()
  Dim img As New ImageList
 
  img.ListImages.Add 1, "book1", LoadPicture(ThisWorkbook.Path & "\book1.jpg")
  img.ListImages.Add 2, "book2", LoadPicture(ThisWorkbook.Path & "\book2.jpg")
  img.ListImages.Add 3, "book3", LoadPicture(ThisWorkbook.Path & "\book3.jpg")
 
  Set TreeView1.ImageList = img '链接图像列
 
  TreeView1.LineStyle = tvwTreeLines '在兄弟节点和根节点之间显示线
 
  '树状外观包含全部元素
  TreeView1.Style = tvwTreelinesPlusMinusPictureText
  '建立名称为"VBA控件"的父节点,选择索引为1的图像
  Set nodx = TreeView1.Nodes.Add(, , "VBA控件", "VBA控件", 1)
  '在"VBA控件"根节点下建立"第一章"子节点,选择索引为3的图像
  Set nodx = TreeView1.Nodes.Add("VBA控件", tvwChild, "child01", "第一章", 3)
  '在"VBA控件"根节点下建立"第二章"子节点,选择索引为3的图像
  Set nodx = TreeView1.Nodes.Add("VBA控件", tvwChild, "child02", "第二章", 3)
  b = False
End Sub

Private Sub CommandButton1_Click()
  If TextBox1.Text <> "" And TextBox2.Text <> "" Then
'不允许建立零字节的根节点和子节点
    b = False
    j = TreeView1.Nodes.Count
    For i = 1 To TreeView1.Nodes.Count '检查新输入的根节点名称是否存在
      If TreeView1.SelectedItem.Children > 0 Then
        If TextBox1.Text = TreeView1.Nodes(i).Text Then b = True
        End If
    Next i
    If b = True Then '若存在, 则在根节点下建立子节点
      Set nodx = TreeView1.Nodes.Add(TextBox1.Text, tvwChild, "child" & j, TextBox2.Text, 3)
    Else '若不存在,则建立根节点和子节点
      Set nodx = TreeView1.Nodes.Add(, , TextBox1.Text, TextBox1.Text, 1)
      Set nodx = TreeView1.Nodes.Add(TextBox1.Text, tvwChild, "child" & j, TextBox2.Text, 3)
    End If
    TreeView1.Refresh
  ElseIf TextBox1.Text = "" Then MsgBox "请输入根节点名称!", vbInformation, "警告!"
   '系统提示
  ElseIf TextBox2.Text = "" Then MsgBox "请输入子节点名称!", vbInformation, "警告!"
  End If
End Sub

Private Sub CommandButton2_Click()
  For i = 1 To TreeView1.Nodes.Count
    TreeView1.Nodes(i).Expanded = True '展开所有节点
  Next i
End Sub

Private Sub CommandButton3_Click()
  For i = 1 To TreeView1.Nodes.Count
    TreeView1.Nodes(i).Expanded = False'折叠所有节点
  Next i
End Sub

Private Sub CommandButton4_Click()
  TreeView1.Sorted = True '排列顺序
End Sub

Private Sub CommandButton5_Click()
  If TreeView1.SelectedItem.Index <> 1 Then
    TreeView1.Nodes.Remove TreeView1.SelectedItem.Index '删除选定的节点
  End If
End Sub

Private Sub CommandButton6_Click()
  End '退出程序
End Sub

Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node)
  Node.ExpandedImage = 2 '节点被展开时,选择索引为2的图像
End Sub

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
  Dim str As String
  If TreeView1.SelectedItem.Children = 0 Then '检查是否有子节点,0为无
    For i = 1 To TreeView1.Nodes.Count
      If TreeView1.Nodes(i).Selected Then
        str = TreeView1.Nodes(i).FullPath
        '系统提示
  MsgBox "您选择的是:[" & str & "]子节点!"
      End If
    Next i
  End If
End Sub
运行后,初始化用户窗体,见UserForm_Initialize()事件代码。首先在ImageList控件中添加三个图片,索引值分别为1、2、3;然后语句Set TreeView1.ImageList = img将图片链接到TreeView控件中。下面的两条语句使用LineStyle属性和Style属性来设置TreeView控件外观,再使用Nodes对象的Add方法来添加节点,其语法为:
Nodes.Add([relative][,relationship][,key][,text][,image][,selectedimage])
其中,参数relationship是通过关系节点参数与新节点连接的另一个节点;参数可能是以下情况:
1-tvwlast  该节点置于所有其他的在relative中被命名的同一级别的节点的后面
2-tvwNext 该节点置于在relative中被命名节点的后面
3-tvwPrevius 该节点置于在relative中被命名的节点的前面
4-tvwChild 该节点成为在relative中被命名的节点的的子节点
本例中,第一个Add语句添加名为“VBA控件”的根节点,其它两个Add语句添加该根节点的子节点。运行后的结果如图14所示。

图14:窗体初步运行后的结果。
界面中的两个文字框用来添加节点,当单击“添加”按钮后,如果文字框中没有任何输入,则会提示输入根节点和子节点。在文字框中输入根节点和子节点后,单击“添加”按钮,如果根节点已存在,则在该根节点下建立子节点,若不存在,则建立新的根节点和字节点。
“展开”和“折叠”按钮根据Expanded属性的值来确定是否展开和折叠节点。
将Sorted属性设置为True,对当前节点进行排序,使用Remove方法来删除当前所选中的节点。
本例还运用了两个事件:Expand事件和NodeClick事件。当节点展开时,发生Expand事件,更换所展开的节点图片。当单击节点时,发生NodeClick事件,该事件代码显示所单击节点的路径。
本示例运行后的结果如图15所示。

图15:运行后的结果
[示例三] TreeView控件的基本使用(By Ken Puls)
本示例中,将使用工作表名和工作表中含有公式的单元地址填充TreeView控件。
先创建一个新工作,在工作表Sheet1和Sheet2中添加一些公式。打开VBE编辑器,添加一个用户窗体。在该窗体中添加一个TreeView控件、一个标签控件和一个命令按钮控件。
在该窗体的代码模块中输入下面的代码:
Private Sub UserForm_Initialize()
  '使用缺省的设置装载用户窗体
  '设置控件的缺省值

  With Me
    .CommandButton1.Caption = "关闭"
    .Label1 = vbNullString
    .TreeView1.LineStyle = tvwRootLines
  End With
  '填充Treeview
  Call TreeView_Populate
End Sub
Private Sub TreeView_Populate()
  '填充TreeView控件
  Dim ws As Worksheet
  Dim rngFormula As Range
  Dim rngFormulas As Range
  With Me.TreeView1.Nodes
    .Clear
    For Each ws In ActiveWorkbook.Worksheets
      '在节点中添加工作表名
      .Add Key:=ws.Name, Text:=ws.Name
      '检查工作表中是否有公式
      On Error Resume Next
      Set rngFormulas = ws.Cells.SpecialCells(xlCellTypeFormulas)
      On Error GoTo 0
      '添加公式单元格
      If Not rngFormulas Is Nothing Then
        For Each rngFormula In rngFormulas
          .Add relative:=ws.Name, _
          relationship:=tvwChild, _
          Key:=ws.Name & "," & rngFormula.Address, _
          Text:="Range " & rngFormula.Address
        Next rngFormula
      End If
 
      Set rngFormulas = Nothing
    Next ws
  End With
End Sub
Private Sub Treeview1_NodeClick(ByVal Node As MSComctlLib.Node)
  '将所选中的节点关键字写到标签中
  Me.Label1.Caption = Node.Key
End Sub
Private Sub CommandButton1_Click()
  '关闭用户窗体
  Unload Me
End Sub
下面对代码进行说明:
(1) Private Sub UserForm_Initialize()
这段代码的功能是在装载用户窗体时,进行所需要的缺省设置,然后调用Treeview_Populate过程来填充TreeView控件。在代码中,将Treeview控件的LineStyle属性设置为'tvwRootLines',显示根节点连线。
(2) Private Sub TreeView_Populate()
这段代码使用工作簿中的所有工作表名和包含公式的单元格区域来填充所有节点。
在添加节点到TreeView控件中时,需要创建父/子节点的关系。在本例中,每个工作表是父节点,单元格地址是其子节点。要添加根节点,需要赋给其参数Key值和参数Text。参数Key必须是唯一的,参数Text所代表的文本将显示在节点中。示例中,使用下面的代码将工作表名称添加到节点中:
.Add Key:=ws.Name, Text:=ws.Name
即Me.TreeView1.Nodes.Add Key:="Sheet1", Text:="Sheet1"
要添加根节点,就使用上面的代码结构。
添加子节点的代码稍有不同,仍然使用Add方法且也需要一个唯一的Key值,也必须提供父节点的Key值(参数relative)和参数relationship值(tvwChild)。在本例中,添加子节点的代码如下:
.Add relative:=ws.Name, relationship:=tvwChild, _
Key:=ws.Name & "," & rngFormula.Address, Text:="Range " & rngFormula.Address
即Me.TreeView1.Nodes.Add relative:= "Sheet1", _
 relationship:=tvwChild Key:="Sheet1,$C$8", Text:="Rage $C$8"
要将子节点链接到父节点的下面,参数relative必须与父节点的Key值一致,参数relationship必须设置为tvwchild。要使子节点有效,它必须也有自已唯一的Key值。
(3) Private Sub Treeview1_NodeClick(ByVal Node As MSComctlLib.Node)
这段代码捕获节点的Click事件,并将该节点的Key值显示在标签控件中。当窗体加载时,设置标签label1控件为vbNullstring以确保当没有选择控件时标签为空。
(4) Private Sub CommandButton1_Click()
该命令按钮卸载用户窗体。
下面的代码进一步扩展了示例的功能:
Private Sub CommandButton2_Click()
  '定位所选节点
  Dim sNodes() As String
  '检查是否选择了节点
  If Me.Label1.Caption = vbNullString Then
    MsgBox "您没有选择任何节点!" & vbNewLine & _
     "请选择后再试.", vbCritical + vbOKOnly, _
     "没有选择"
    Exit Sub
  End If
  '将标签分解
  sNodes = Split(Me.Label1, ",")
  With Worksheets(sNodes(0))
    '激活工作表
    .Activate
    '激活合适的范围
    If UBound(sNodes) + 1 > 1 Then
    '激活所选区域范围

      .Range(sNodes(1)).Activate
    Else
    '选择工作表并激活单元格A1
      .Range("A1").Activate
    End If
  End With
  '卸载窗体
  Unload Me
End Sub
在窗体中再放置一个命令按钮,并输入上面的代码。该代码的功能是,激活所选节点对应的工作表中的单元格区域。

声明:欢迎各大网站转载本站文章,还请保留一条能直接指向本站的超级链接,谢谢!

第1页 | 第2页 | 第3页 | 第4页 | 第5页 | 第6页 | 第7页

时间:2007-9-26 21:11:51,点击:0打印】【关闭

上一篇:在office Excel页眉页脚中插入图片
下一篇:利用VBA创建Excel新菜单

OfficeBa论坛】:阅读本文时遇到了什么问题,可以到论坛进行交流!Excel专家邮件:342327115@qq.com(大家在Excel使用中遇到什么问题,可以咨询此邮箱)。

【声明】:以上文章或资料除注明为Office吧自创或编辑整理外,均为各方收集或网友推荐所得。其中摘录的内容以共享、研究为目的,不存在任何商业考虑。如有任何异议,请与本站联系,联系邮箱:thinkou@126.com,本站确认后将立即撤下。谢谢您的支持与理解!


相关评论

我要评论

查看所有评论内容

评论内容