ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 229656|回复: 272

[分享]树形目录控件——TreeView控件介绍

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2007-4-27 21:42 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:控件

树形目录控件——TreeView控件介绍
分类:ExcelVBA>>控件的使用>>TreeView控件

1 添加TreeView控件
在“控件工具箱”中单击鼠标右键,从弹出的快捷菜单中选择“附加控件”(如图1所示),出现“附加控件”对话框。在该对话框中,找到“Microsoft TreeView Control,version 6.0”并选中前面的复选框,如图2所示,单击“确定”按钮。
  图1:在工具箱中单击右键,选择“附加控件”。
 
图2:在“附加控件”对话框选中“TreeView控件”。
注:下面的示例中可能要用到ImageList控件和ImageCombo控件,因此,将这两个控件也添加到“控件工具箱”中。最后的控件工具箱如图3所示。
  图3:添加控件后的工具箱。

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

评分

6

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-4-27 21:44 | 显示全部楼层
2 TreeView控件概述
TreeView控件显示Node对象的分层列表,每个Node对象均由一个标签和一个可选的位图组成。TreeView 一般用于显示文档标题、索引入口、磁盘上的文件和目录、或能被有效地分层显示的其它种类信息。
创建了TreeView控件之后,可以通过设置属性与调用方法对各Node对象进行操作,这些操作包括添加、删除、对齐和其它操作。可以编程展开与折叠Node对象来显示或隐藏所有子节点。Collapse、Expand和NodeClick三个事件也提供了编程功能。
2.1 常用属性
(1) Nodes属性返回对TreeView控件的Node对象的集合的引用。
  [语法] object.Nodes
   object代表一个对象表达式。可以使用标准的集合方法(例如:Add和Remove方法)操作Node对象,可以按其索引或存储在Key属性中的唯一键来访问集合中的每个元素。
(2) Style属性返回或设置图形类型(图象、文本、+/-号、直线)以及出现在TreeView控件中每一Node对象上的文本的类型。
  [语法] object.Style [ = number]
Object代表一个对象表达式,number指定图形类型的整数,number 的设置值是:0仅为文本;1为图象和文本,2为+/-号和文本;3为+/- 号、图象和文本;4为直线和文本;5为直线、图象和文本;6为直线、+/-号和文本;7(缺省)为直线、+/- 号、图象和文本。若Style属性设置为包含直线的值,则LineStyle属性就确定了直线的外观;如果Style属性设置为不含直线的值,则LineStyle属性将被忽略。
(3)Sorted属性返回或设置值,此值确定Node对象的根节点或子节点是否按字母顺序排列。
  [语法] object.Sorted [ = boolean]
  Object代表一个对象表达式。boolean的设置值是:True——Node对象根据它们的 Text 属性按字母顺序排列。其Text属性由数字开始的Node对象也作为字符串排序,第一个数字确定在排序中的初始位置,后面的数字确定以后的排序。False——Node对象不排序。Sorted属性有两种用法,第一,在TreeView控件的根(顶)层排列Node对象;第二,对任何单个Node对象的子节点排序。
设置 Sorted 属性为True仅对当前Nodes集合排序。在TreeView控件中添加新的Node对象时,必须再次设置Sorted属性为 True,以便对添加的Node对象排列。
(4) appearance属性:设置控件是否以3D效果显示。
(5) checkboxes属性:决定在节点的每一项的旁边是否显示一个复选框,类似checkbox控件的作用。
(6) hottracking属性:当鼠标指针经过某个条目时,这些条目是否突出显示,类似网页的超链接效果。
(7) labeledit属性:决定用户是否能编辑控件中列出的项目,此项如果不想被改变,可将属性值设置为1
(8) linestyle属性:设置列出的每项之间的行样式,即,如果为1,则当前项下还有子项的时候,它的前面会显示“+”号,如果值为2,则不显示“+”
(9) singlesel属性:设置在树中选择新的条目时,是否展开此条目并收拢前一个条目,即设置为True时,并且当前选中的条目有子项的时候,会把子项展开,并将原来选中的条目收拢。
(10) style属性:设置Treeview控件的每个列表的组成方式,比如“图片”+“文本”方式,等等,这样可以把Treeview设置得更美观一些。
2.2 常用方法
(1) Add方法
在Treeview控件的Nodes集合中添加一个Node对象。
  [语法] object.Add(relative, relationship, key, text, image, selectedimage)
  [说明]
参数Object是必需的,为对象表达式。
参数Relative是可选的,代表已存在的Node对象的索引号或键值。
参数relationship是可选的,代表新节点与已存在的节点间的关系,指定的Node对象的相对位置。relationship的设置值是:
0——tvwFirst首节点,该Node和在relative中被命名的节点位于同一层,并位于所有同层节点之前。
1——tvwLast最后的节点,该Node和在relative中被命名的节点位于同一层,并位于所有同层节点之后。任何连续地添加的节点可能位于最后添加的节点之后。
2——tvwNext(缺省),下一个节点,该Node位于在relative中被命名的节点之后。
3——tvwPrevious,前一个节点,该Node位于在relative中被命名的节点之前。
4——tvwChild(缺省),子节点。该Node 为在relative中被命名的节点的子节点。
参数key是可选的,唯一的字符串,可用于用Item方法检索Node。
参数text 是必需的,在Node中出现的字符串。
参数image是可选的,代表一个图像或在ImageList控件中图象的索引。
参数selectedimage是可选的,代表一个图像或在ImageList控件中图象的索引,在 Node被选中时显示。
  注意:如果在relative中没有被命名的Node对象,则新节点被放在节点顶层的最后位置。
(2) GetVisibleCount方法
返回固定在TreeView控件的内部区域的Node对象的个数。
  [语法] object.GetVisibleCount
  object代表一个对象表达式,Node对象的个数取决于在一个窗口中能固定多少行。总的行数取决于控件的高度和Font对象的Size属性。可以使用GetVisibleCount属性确保可视的最小行数,这样可以精确地访问一个层。如果最小行数是不可视的,可以用Height属性重新设置TreeView的大小。
2.3 常用事件
NodeClick事件在一个Node对象被单击时发生。
  [语法] Private Sub object_NodeClick(ByVal node As Node)
  Object代表一个对象表达式,参数node是对被点取的Node对象的引用。
  说明:在单击节点对象之外的TreeView控件的任何部位,标准的Click事件发生。当单击某个特定的Node对象时,NodeClick事件发生;NodeClick事件也返回对特定的Node对象的引用,在下一步操作之前,该引用可用来使这个Node对象可用。NodeClick事件发生在标准的Click事件之前。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-4-27 21:44 | 显示全部楼层
3 TreeView控件的使用
下面通过示例来介绍TreeView控件的常用方法、属性和事件。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-4-27 21:48 | 显示全部楼层

[示例一] TreeView控件常用方法、属性和事件示例(1)
在VBE编辑器中插入一个用户窗体,并在该窗体上添加一些控件,即一个TreeView控件、一个ImageList控件、一些命令按钮控件、一些选项按钮控件和一些标签控件,如图4所示。
 
图4:用户窗体界面
在用户窗体代码窗口,输入下面的代码:
Private Sub UserForm_Initialize()
  '初始化ImageList控件,添加图片
  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.PathSeparator = "\"
End Sub

Private Sub CommandButton1_Click()
  '添加节点
  Dim NodeX As Node
 
  TreeView1.Nodes.Clear
 
  Set NodeX = TreeView1.Nodes.Add(, , "课程科目", "课程科目", "book3")
  Set NodeX = TreeView1.Nodes.Add("课程科目", tvwChild, "语文", "语文", "book1")
  Set NodeX = TreeView1.Nodes.Add("课程科目", tvwChild, "数学", "数学", "book1")
  Set NodeX = TreeView1.Nodes.Add("课程科目", tvwChild, "外语", "外语", "book1")
  Set NodeX = TreeView1.Nodes.Add("课程科目", tvwChild, "政治", "政治", "book1")
  Set NodeX = TreeView1.Nodes.Add("课程科目", tvwChild, "物理", "物理", "book1")
  Set NodeX = TreeView1.Nodes.Add("课程科目", tvwChild, "化学", "化学", "book1")
  Set NodeX = TreeView1.Nodes.Add("课程科目", tvwChild, "生物", "生物", "book1")
End Sub

Private Sub CommandButton2_Click()
  '设置为复选框显示
  TreeView1.CheckBoxes = True
End Sub

Private Sub CommandButton3_Click()
  '清除节点
  TreeView1.Nodes.Clear
End Sub

Private Sub CommandButton4_Click()
  '去掉复选框显示
  TreeView1.CheckBoxes = False
End Sub

Private Sub CommandButton5_Click()
  '开启热跟踪功能
  TreeView1.HotTracking = True
End Sub

Private Sub CommandButton6_Click()
  '编辑节点
  TreeView1.StartLabelEdit
End Sub

Private Sub CommandButton7_Click()
  '显示根节点连线
  TreeView1.LineStyle = tvwRootLines
End Sub

Private Sub CommandButton8_Click()
  '隐藏根节点连线
  TreeView1.LineStyle = tvwTreeLines
End Sub

Private Sub CommandButton9_Click()
  '移除所选节点
  '若为根节点,则将其子节点一并移除
  TreeView1.Nodes.Remove TreeView1.SelectedItem.Index
End Sub

Private Sub CommandButton10_Click()
  '统计节点个数
  Label1.Caption = "TreeView控件中节点对象的个数为:" & TreeView1.Nodes.Count & "个."
End Sub

Private Sub CommandButton11_Click()
  '将所选节点变为粗体
  TreeView1.SelectedItem.Bold = True
End Sub

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

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

Private Sub OptionButton1_Click()
  '节点仅为文本
  TreeView1.Style = tvwTextOnly
End Sub

Private Sub OptionButton2_Click()
  '节点为图像文本
  TreeView1.Style = tvwPictureText
End Sub

Private Sub OptionButton3_Click()
  '节点为符号文本
  TreeView1.Style = tvwPlusMinusText
End Sub

Private Sub OptionButton4_Click()
  '节点为直线文本
  TreeView1.Style = tvwTreelinesText
End Sub

Private Sub OptionButton5_Click()
  '节点显示恢复正常
  TreeView1.Style = tvwTreelinesPlusMinusPictureText
End Sub

Private Sub Treeview1_Nodeclick(ByVal Node As MSComctlLib.Node)
  '返回对象路径
  Label3.Caption = Node.FullPath
End Sub

Private Sub Treeview1_NodeCheck(ByVal Node As MSComctlLib.Node)
  '复选框事件
  Label5.Caption = "当前选择的节点是:" & TreeView1.SelectedItem.Text
End Sub
下面是该用户窗体的一些运行结果截图。
 
图5:添加节点并展开节点。
 
图6:为节点加上复选框。
 
图7:选中复选框后,下面显示相应的信息。
 
图8:选中某节点后显示相应的节点位置信息。
 
图9:编辑某节点
 
图10:显示根节点连线
 
图11:将节点变为粗体

图12:选择节点仅为文本后(其它选项按钮的效果用户可以自已体验)

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-4-27 21:51 | 显示全部楼层

[示例二] 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控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-4-27 21:52 | 显示全部楼层
[示例三] 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
在窗体中再放置一个命令按钮,并输入上面的代码。该代码的功能是,激活所选节点对应的工作表中的单元格区域。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-4-27 21:53 | 显示全部楼层

[示例四] 自动创建树状图形(Add方法示例)
在VBE编辑器中插入一个用户窗体,并放置一个TreeView控件。然后在该窗体代码窗口中输入下面的代码:
Private Sub UserForm_Initialize()
  Dim i As Long
  Dim j As Long
  Dim k As Long
  Dim Title As String
  Dim xNode As Node
  Dim NodeKey As String
  Dim NodeKey2 As String

  With Me.TreeView1
    For i = 1 To 5
      Set xNode = .Nodes.Add
      NodeKey = "Node - " & i
      With xNode
        .Key = NodeKey
        .Text = "Node - " & i
        .Expanded = False
      End With
      For j = 1 To 7
        Set xNode = .Nodes.Add(NodeKey, tvwChild)
        NodeKey2 = "Node - Child - " & i & j
        With xNode
          .Key = NodeKey2
          .Text = "Child - " & j
        End With
        For k = 1 To 10
          Set xNode = .Nodes.Add(NodeKey2, tvwChild)
          With xNode
            .Text = "Child2 - " & k
          End With
        Next k
      Next j
    Next i
  End With

  Set xNode = Nothing
End Sub

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
  Me.Caption = Node.Text
End Sub
本示例很好地演示了添加节点的方法。代码中,通过循环添加了5个根节点,在每个根节点下又添加了7个子节点,在每个子节点下又添加了10个子节点。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-4-27 21:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
[示例五] TreeView控件和复合框组合使用
在VBE编辑器中插入一个用户窗体,并放置一个TreeView控件和一个复合框控件,然后在该窗体的代码窗口中输入下面的代码:
Private Sub UserForm_Initialize()
    Dim i As Long
    Dim j As Long
    Dim k As Long
    Dim Title As String
    Dim xNode As Node
    Dim NodeKey As String
    Dim NodeKey2 As String
    With Me.TreeView1
        For i = 1 To 5
            Set xNode = .Nodes.Add
            NodeKey = "Node - " & i
            With xNode
                .Key = NodeKey
                .Text = "Node - " & i
                .Expanded = False
            End With
            Me.ComboBox1.AddItem ("Node - " & i)
            For j = 1 To 7
                Set xNode = .Nodes.Add(NodeKey, tvwChild)
                NodeKey2 = "Node - Child - " & i & j
                With xNode
                    .Key = NodeKey2
                    .Text = "Child - " & j
                End With
                Me.ComboBox1.AddItem ("Child - " & j)
                For k = 1 To 10
                    Set xNode = .Nodes.Add(NodeKey2, tvwChild)
                    With xNode
                        .Text = "Child2 - " & k
                    End With
                    Me.ComboBox1.AddItem ("Child2 - " & k)
                Next k
            Next j
        Next i
    End With
    Set xNode = Nothing
End Sub
Private Sub ComboBox1_Click()
    On Error Resume Next
    Me.TreeView1.Nodes(Me.ComboBox1.ListIndex + 1).Parent.Parent.Expanded = True
    Me.TreeView1.Nodes(Me.ComboBox1.ListIndex + 1).Parent.Expanded = True
    Me.TreeView1.Nodes(Me.ComboBox1.ListIndex + 1).Expanded = True
    On Error GoTo 0
End Sub
上面的代码先建立一个树形图,并将节点全部添加到复合框中。然后,可以单击复合框中的相应节点来展开树形图中的根节点。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-4-27 21:57 | 显示全部楼层

[示例六] 控件综合使用示例(1)
本例根据puremis.net中的代码整理。
在工作表中选择菜单“视图”——“工具栏”——“控件工具箱”,使用“图像”控件添加10个图像控件,分别命名为Image1至Image9,还有一个为None。在这些控件中单击右键,选择“属性”并从picture属性中选择合适的图像。然后,将对象名称放置在C1至C11单元格中。在B2至B11单元格,放置名字和相应的父亲的名字,在D列,放置个人简介。此时,工作表Sheet1如图16所示。
 
图16:工作表中的数据
在VBE编辑器中插入一个用户窗体,在其上放置一个TreeView控件和两个文字框控件,并进行相应的设置,如图17所示。
 
图17:设计界面。
TreeView包含TreeNodes的集合,每个TreeNode对象都是TreeNode集合的一个成员,其编号按显示顺序从0到Nodes.Count-1。本例中,没有使用索引号,而是关键字,如:
TreeView1.Nodes.Add(Relative:="The key of Parent", Relationship:=tvwChild, Text:="Your Text")。
在VBE编辑器中插入一个模块,并输入下面的代码:
Option Explicit

Sub MakeFamilyTree()
    Dim arrName As Variant
    Dim arrParent As Variant
    Dim arrMatrix() As Variant
    Dim arrTemp As Variant
    Dim elm As Variant
    Dim i As Long, j As Long
    Dim ret As Variant
    Dim node As node
    Dim bExists As Boolean

    '重置TreeView控件
    UserForm1.TreeView1.Nodes.Clear
   
    '从工作表中获取数据作为一个数组
    With Sheets("Sheet1").Range(Sheets("Sheet1").[A2], Sheets("Sheet1").[A65536].End(xlUp))
        arrName = .Value
        arrParent = .Offset(, 1).Value
    End With
   
    '排序
    ReDim arrMatrix(1 To UBound(arrName), 1 To 1)
    For Each elm In arrParent
        i = i + 1
        ret = Application.Match(elm, arrName, 0)
        If IsError(ret) Then
            arrMatrix(i, 1) = arrName(i, 1)
        Else
            j = 3
            ReDim Preserve arrMatrix(1 To UBound(arrMatrix), 1 To j)
            arrMatrix(i, 1) = arrName(i, 1)
            arrMatrix(i, 2) = elm
            arrMatrix(i, 3) = arrParent(ret, 1)
            Do
                ret = Application.Match(arrParent(ret, 1), arrName, 0)
                If IsError(ret) Then Exit Do
                If arrParent(ret, 1) = "" Then Exit Do
                j = j + 1
                ReDim Preserve arrMatrix(1 To UBound(arrMatrix), 1 To j)
                arrMatrix(i, j) = arrParent(ret, 1)
            Loop
        End If
    Next
    arrTemp = CustomTranspose(arrMatrix)
   
    '添加数据到节点中
    For i = 1 To UBound(arrTemp)
        For j = 1 To UBound(arrTemp, 2)
            If Not IsEmpty(arrTemp(i, j)) Then
                With UserForm1.TreeView1
                    bExists = False
                    For Each elm In .Nodes
                        If elm = arrTemp(i, j) Then bExists = True
                    Next
                    If Not bExists Then
                        If j = 1 Then
                            Set node = .Nodes.Add(, , arrTemp(i, j), arrTemp(i, j), _
                            Image:=GetInfo(arrTemp(i, j), True))
                        Else
                            Set node = .Nodes.Add(arrTemp(i, j - 1), tvwChild, arrTemp(i, j), arrTemp(i, j), _
                            Image:=GetInfo(arrTemp(i, j), True))
                        End If
                        node.Expanded = True
                    End If
                End With
            End If
        Next
    Next
End Sub

Function CustomTranspose(ByVal buf As Variant) As Variant
'转换数组顺序从父节点到子节点
    Dim arrTemp() As Variant
    Dim i As Long, j As Long, k As Long
    ReDim arrTemp(LBound(buf) To UBound(buf), LBound(buf, 2) To UBound(buf, 2))
    For i = 1 To UBound(buf)
        k = 0
        For j = UBound(buf, 2) To 1 Step -1
            If Not IsEmpty(buf(i, j)) Then
                k = k + 1
                arrTemp(i, k) = buf(i, j)
            End If
        Next
    Next
    CustomTranspose = arrTemp
End Function

Function GetInfo(sName, bAorD) As String
'返回合适的图像
    Dim rFound As Range
    Set rFound = Sheet1.Columns(1).Find(sName, lookat:=xlWhole)
    If rFound Is Nothing Then
        GetInfo = "none"
    Else
        GetInfo = IIf(bAorD, rFound.Offset(, 2).Value, rFound.Offset(, 3).Value)
    End If
End Function
在用户窗体代码模块中,输入下面的代码:
Private Sub UserForm_Activate()
    SettingImageList
    MakeFamilyTree
End Sub

Private Sub SettingImageList()
    Dim myImgList As New ImageList
    Dim bt
    With myImgList.ListImages
        .Add Key:="Image1", Picture:=Sheet1.Image1.Picture
        .Add Key:="Image2", Picture:=Sheet1.Image2.Picture
        .Add Key:="Image3", Picture:=Sheet1.Image3.Picture
        .Add Key:="Image4", Picture:=Sheet1.Image4.Picture
        .Add Key:="Image5", Picture:=Sheet1.Image5.Picture
        .Add Key:="Image6", Picture:=Sheet1.Image6.Picture
        .Add Key:="Image7", Picture:=Sheet1.Image7.Picture
        .Add Key:="Image8", Picture:=Sheet1.Image8.Picture
        .Add Key:="Image9", Picture:=Sheet1.Image9.Picture
        .Add Key:="none", Picture:=Sheet1.none.Picture
    End With
    With TreeView1
        Set .ImageList = myImgList
        .Indentation = 14
        .LabelEdit = tvwManual
        .HideSelection = False
    End With
End Sub

Private Sub TreeView1_NodeClick(ByVal node As MSComctlLib.node)
    Me.TextBox1.Text = node.Text
    Me.TextBox2.Text = GetInfo(node.Text, False)
End Sub
运行后的结果如图18所示。

图18:运行后的结果

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-4-27 22:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

[示例八] 改变背景色
在VBE编辑器中插入一个用户窗体,并在上面放置一个TreeView控件和一个命令按钮,如图21所示。
  图21
在用户窗体代码模块中,输入下面的代码:
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) 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 dwNewLong As Long) As Long
Private Const GWL_STYLE = -16&
Private Const TVM_SETBKCOLOR = 4381&
Private Const TVM_GETBKCOLOR = 4383&
Private Const TVS_HASLINES = 2&

Private Sub UserForm_Initialize()
  Dim nodeX As Node
  Dim i As Long
  With TreeView1.Nodes
    Set nodeX = .Add(, , "R", "Root")
    nodeX.BackColor = RGB(255, 0, 0)
    For i = 1 To 10
      Set nodeX = .Add("R", tvwChild, "C" & i, "Child " & i)
      nodeX.BackColor = RGB(255, 0, 0)
      nodeX.EnsureVisible
    Next
  End With
End Sub

Private Sub Command1_Click()
  Dim lngStyle As Long
  Dim nodeX As Node
  Dim i As Long
  Call SendMessage(TreeView1.hWnd, TVM_SETBKCOLOR, 0, ByVal RGB(255, 0, 0))
  '改变背景到红色
  lngStyle = GetWindowLong(TreeView1.hWnd, GWL_STYLE)
  Call SetWindowLong(TreeView1.hWnd, GWL_STYLE, lngStyle - TVS_HASLINES)
  Call SetWindowLong(TreeView1.hWnd, GWL_STYLE, lngStyle)
End Sub

[分享]树形目录控件——TreeView控件介绍

[分享]树形目录控件——TreeView控件介绍
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-22 23:07 , Processed in 0.051089 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表