分類:
ExcelVBA>>控件的使用>>TreeView控件1 添加TreeView控件
在“控件工具箱”中單擊鼠標(biāo)右鍵,從彈出的快捷菜單中選擇“附加控件”(如圖1所示),出現(xiàn)“附加控件”對話框。在該對話框中,找到“Microsoft TreeView Control,version 6.0”并選中前面的復(fù)選框,如圖2所示,單擊“確定”按鈕。
圖1:在工具箱中單擊右鍵,選擇“附加控件”。
圖2:在“附加控件”對話框選中“TreeView控件”。
注:下面的示例中可能要用到ImageList控件和ImageCombo控件,因此,將這兩個控件也添加到“控件工具箱”中。最后的控件工具箱如圖3所示。
圖3:添加控件后的工具箱。
控件,
this,
clientWidthUYHRXI5m.jpg (11.56 KB, 下載次數(shù): 273)
[分享]樹形目錄控件——TreeView控件介紹
P34Qhiht.jpg (34.65 KB, 下載次數(shù): 183)
[分享]樹形目錄控件——TreeView控件介紹
Tr1whO9o.jpg (10.62 KB, 下載次數(shù): 175)
[分享]樹形目錄控件——TreeView控件介紹
2 TreeView控件概述
TreeView控件顯示Node對象的分層列表,每個Node對象均由一個標(biāo)簽和一個可選的位圖組成。TreeView 一般用于顯示文檔標(biāo)題、索引入口、磁盤上的文件和目錄、或能被有效地分層顯示的其它種類信息。
創(chuàng)建了TreeView控件之后,可以通過設(shè)置屬性與調(diào)用方法對各Node對象進(jìn)行操作,這些操作包括添加、刪除、對齊和其它操作。可以編程展開與折疊Node對象來顯示或隱藏所有子節(jié)點。Collapse、Expand和NodeClick三個事件也提供了編程功能。
2.1 常用屬性
(1) Nodes屬性返回對TreeView控件的Node對象的集合的引用。
[語法] object.Nodes
object代表一個對象表達(dá)式??梢允褂脴?biāo)準(zhǔn)的集合方法(例如:Add和Remove方法)操作Node對象,可以按其索引或存儲在Key屬性中的唯一鍵來訪問集合中的每個元素。
(2) Style屬性返回或設(shè)置圖形類型(圖象、文本、+/-號、直線)以及出現(xiàn)在TreeView控件中每一Node對象上的文本的類型。
[語法] object.Style [ = number]
Object代表一個對象表達(dá)式,number指定圖形類型的整數(shù),number 的設(shè)置值是:0僅為文本;1為圖象和文本,2為+/-號和文本;3為+/- 號、圖象和文本;4為直線和文本;5為直線、圖象和文本;6為直線、+/-號和文本;7(缺省)為直線、+/- 號、圖象和文本。若Style屬性設(shè)置為包含直線的值,則LineStyle屬性就確定了直線的外觀;如果Style屬性設(shè)置為不含直線的值,則LineStyle屬性將被忽略。
(3)Sorted屬性返回或設(shè)置值,此值確定Node對象的根節(jié)點或子節(jié)點是否按字母順序排列。
[語法] object.Sorted [ = boolean]
Object代表一個對象表達(dá)式。boolean的設(shè)置值是:True——Node對象根據(jù)它們的 Text 屬性按字母順序排列。其Text屬性由數(shù)字開始的Node對象也作為字符串排序,第一個數(shù)字確定在排序中的初始位置,后面的數(shù)字確定以后的排序。False——Node對象不排序。Sorted屬性有兩種用法,第一,在TreeView控件的根(頂)層排列Node對象;第二,對任何單個Node對象的子節(jié)點排序。
設(shè)置 Sorted 屬性為True僅對當(dāng)前Nodes集合排序。在TreeView控件中添加新的Node對象時,必須再次設(shè)置Sorted屬性為 True,以便對添加的Node對象排列。
(4) appearance屬性:設(shè)置控件是否以3D效果顯示。
(5) checkboxes屬性:決定在節(jié)點的每一項的旁邊是否顯示一個復(fù)選框,類似checkbox控件的作用。
(6) hottracking屬性:當(dāng)鼠標(biāo)指針經(jīng)過某個條目時,這些條目是否突出顯示,類似網(wǎng)頁的超鏈接效果。
(7) labeledit屬性:決定用戶是否能編輯控件中列出的項目,此項如果不想被改變,可將屬性值設(shè)置為1
(8) linestyle屬性:設(shè)置列出的每項之間的行樣式,即,如果為1,則當(dāng)前項下還有子項的時候,它的前面會顯示“+”號,如果值為2,則不顯示“+”
(9) singlesel屬性:設(shè)置在樹中選擇新的條目時,是否展開此條目并收攏前一個條目,即設(shè)置為True時,并且當(dāng)前選中的條目有子項的時候,會把子項展開,并將原來選中的條目收攏。
(10) style屬性:設(shè)置Treeview控件的每個列表的組成方式,比如“圖片”+“文本”方式,等等,這樣可以把Treeview設(shè)置得更美觀一些。
2.2 常用方法
(1) Add方法
在Treeview控件的Nodes集合中添加一個Node對象。
[語法] object.Add(relative, relationship, key, text, image, selectedimage)
[說明]
參數(shù)Object是必需的,為對象表達(dá)式。
參數(shù)Relative是可選的,代表已存在的Node對象的索引號或鍵值。
參數(shù)relationship是可選的,代表新節(jié)點與已存在的節(jié)點間的關(guān)系,指定的Node對象的相對位置。relationship的設(shè)置值是:
0——tvwFirst首節(jié)點,該Node和在relative中被命名的節(jié)點位于同一層,并位于所有同層節(jié)點之前。
1——tvwLast最后的節(jié)點,該Node和在relative中被命名的節(jié)點位于同一層,并位于所有同層節(jié)點之后。任何連續(xù)地添加的節(jié)點可能位于最后添加的節(jié)點之后。
2——tvwNext(缺省),下一個節(jié)點,該Node位于在relative中被命名的節(jié)點之后。
3——tvwPrevious,前一個節(jié)點,該Node位于在relative中被命名的節(jié)點之前。
4——tvwChild(缺省),子節(jié)點。該Node 為在relative中被命名的節(jié)點的子節(jié)點。
參數(shù)key是可選的,唯一的字符串,可用于用Item方法檢索Node。
參數(shù)text 是必需的,在Node中出現(xiàn)的字符串。
參數(shù)image是可選的,代表一個圖像或在ImageList控件中圖象的索引。
參數(shù)selectedimage是可選的,代表一個圖像或在ImageList控件中圖象的索引,在 Node被選中時顯示。
注意:如果在relative中沒有被命名的Node對象,則新節(jié)點被放在節(jié)點頂層的最后位置。
(2) GetVisibleCount方法
返回固定在TreeView控件的內(nèi)部區(qū)域的Node對象的個數(shù)。
[語法] object.GetVisibleCount
object代表一個對象表達(dá)式,Node對象的個數(shù)取決于在一個窗口中能固定多少行??偟男袛?shù)取決于控件的高度和Font對象的Size屬性??梢允褂肎etVisibleCount屬性確保可視的最小行數(shù),這樣可以精確地訪問一個層。如果最小行數(shù)是不可視的,可以用Height屬性重新設(shè)置TreeView的大小。
2.3 常用事件
NodeClick事件在一個Node對象被單擊時發(fā)生。
[語法] Private Sub object_NodeClick(ByVal node As Node)
Object代表一個對象表達(dá)式,參數(shù)node是對被點取的Node對象的引用。
說明:在單擊節(jié)點對象之外的TreeView控件的任何部位,標(biāo)準(zhǔn)的Click事件發(fā)生。當(dāng)單擊某個特定的Node對象時,NodeClick事件發(fā)生;NodeClick事件也返回對特定的Node對象的引用,在下一步操作之前,該引用可用來使這個Node對象可用。NodeClick事件發(fā)生在標(biāo)準(zhǔn)的Click事件之前。
3 TreeView控件的使用
下面通過示例來介紹TreeView控件的常用方法、屬性和事件。
[示例一] TreeView控件常用方法、屬性和事件示例(1)
在VBE編輯器中插入一個用戶窗體,并在該窗體上添加一些控件,即一個TreeView控件、一個ImageList控件、一些命令按鈕控件、一些選項按鈕控件和一些標(biāo)簽控件,如圖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
'設(shè)置顯示節(jié)點路徑時的分隔符
TreeView1.PathSeparator = "\"
End Sub
Private Sub CommandButton1_Click()
'添加節(jié)點
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, "數(shù)學(xué)", "數(shù)學(xué)", "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, "化學(xué)", "化學(xué)", "book1")
Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "生物", "生物", "book1")
End Sub
Private Sub CommandButton2_Click()
'設(shè)置為復(fù)選框顯示
TreeView1.CheckBoxes = True
End Sub
Private Sub CommandButton3_Click()
'清除節(jié)點
TreeView1.Nodes.Clear
End Sub
Private Sub CommandButton4_Click()
'去掉復(fù)選框顯示
TreeView1.CheckBoxes = False
End Sub
Private Sub CommandButton5_Click()
'開啟熱跟蹤功能
TreeView1.HotTracking = True
End Sub
Private Sub CommandButton6_Click()
'編輯節(jié)點
TreeView1.StartLabelEdit
End Sub
Private Sub CommandButton7_Click()
'顯示根節(jié)點連線
TreeView1.LineStyle = tvwRootLines
End Sub
Private Sub CommandButton8_Click()
'隱藏根節(jié)點連線
TreeView1.LineStyle = tvwTreeLines
End Sub
Private Sub CommandButton9_Click()
'移除所選節(jié)點
'若為根節(jié)點,則將其子節(jié)點一并移除
TreeView1.Nodes.Remove TreeView1.SelectedItem.Index
End Sub
Private Sub CommandButton10_Click()
'統(tǒng)計節(jié)點個數(shù)
Label1.Caption = "TreeView控件中節(jié)點對象的個數(shù)為:" & TreeView1.Nodes.Count & "個."
End Sub
Private Sub CommandButton11_Click()
'將所選節(jié)點變?yōu)榇煮w
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 '展開所有節(jié)點
Next i
End Sub
Private Sub CommandButton13_Click()
Dim i As Long
For i = 1 To TreeView1.Nodes.Count
TreeView1.Nodes(i).Expanded = False '折疊所有節(jié)點
Next i
End Sub
Private Sub OptionButton1_Click()
'節(jié)點僅為文本
TreeView1.Style = tvwTextOnly
End Sub
Private Sub OptionButton2_Click()
'節(jié)點為圖像文本
TreeView1.Style = tvwPictureText
End Sub
Private Sub OptionButton3_Click()
'節(jié)點為符號文本
TreeView1.Style = tvwPlusMinusText
End Sub
Private Sub OptionButton4_Click()
'節(jié)點為直線文本
TreeView1.Style = tvwTreelinesText
End Sub
Private Sub OptionButton5_Click()
'節(jié)點顯示恢復(fù)正常
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)
'復(fù)選框事件
Label5.Caption = "當(dāng)前選擇的節(jié)點是:" & TreeView1.SelectedItem.Text
End Sub
下面是該用戶窗體的一些運(yùn)行結(jié)果截圖。
圖5:添加節(jié)點并展開節(jié)點。
圖6:為節(jié)點加上復(fù)選框。
圖7:選中復(fù)選框后,下面顯示相應(yīng)的信息。
圖8:選中某節(jié)點后顯示相應(yīng)的節(jié)點位置信息。
圖9:編輯某節(jié)點
圖10:顯示根節(jié)點連線
圖11:將節(jié)點變?yōu)榇煮w
圖12:選擇節(jié)點僅為文本后(其它選項按鈕的效果用戶可以自已體驗)
RDrmpy7Z.jpg (39.24 KB, 下載次數(shù): 282)
[分享]樹形目錄控件——TreeView控件介紹
fM2GzABc.jpg (39.89 KB, 下載次數(shù): 179)
[分享]樹形目錄控件——TreeView控件介紹
khiewo7D.jpg (40.75 KB, 下載次數(shù): 203)
[分享]樹形目錄控件——TreeView控件介紹
552jC13C.jpg (42.91 KB, 下載次數(shù): 176)
[分享]樹形目錄控件——TreeView控件介紹
LJqsoq8y.jpg (41.08 KB, 下載次數(shù): 140)
[分享]樹形目錄控件——TreeView控件介紹
KMbHA0w3.jpg (40.95 KB, 下載次數(shù): 165)
[分享]樹形目錄控件——TreeView控件介紹
S8CMXT1r.jpg (39.86 KB, 下載次數(shù): 86)
[分享]樹形目錄控件——TreeView控件介紹
xyzlBF2H.jpg (40.91 KB, 下載次數(shù): 106)
[分享]樹形目錄控件——TreeView控件介紹
iM8U0AJy.jpg (36.07 KB, 下載次數(shù): 160)
[分享]樹形目錄控件——TreeView控件介紹
[示例二] TreeView控件常用方法、屬性和事件示例(2)
在VBE編輯器中插入一個用戶窗體,并在該窗體上添加一個TreeView控件、一個ImageList控件、兩個標(biāo)簽控件、二個文字框、六個命令按鈕,如下圖13所示。
圖13:設(shè)計界面
在該窗體的代碼窗口中,輸入下面的代碼:
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 '在兄弟節(jié)點和根節(jié)點之間顯示線
'樹狀外觀包含全部元素
TreeView1.Style = tvwTreelinesPlusMinusPictureText
'建立名稱為"VBA控件"的父節(jié)點,選擇索引為1的圖像
Set nodx = TreeView1.Nodes.Add(, , "VBA控件", "VBA控件", 1)
'在"VBA控件"根節(jié)點下建立"第一章"子節(jié)點,選擇索引為3的圖像
Set nodx = TreeView1.Nodes.Add("VBA控件", tvwChild, "child01", "第一章", 3)
'在"VBA控件"根節(jié)點下建立"第二章"子節(jié)點,選擇索引為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
'不允許建立零字節(jié)的根節(jié)點和子節(jié)點
b = False
j = TreeView1.Nodes.Count
For i = 1 To TreeView1.Nodes.Count '檢查新輸入的根節(jié)點名稱是否存在
If TreeView1.SelectedItem.Children > 0 Then
If TextBox1.Text = TreeView1.Nodes(i).Text Then b = True
End If
Next i
If b = True Then '若存在, 則在根節(jié)點下建立子節(jié)點
Set nodx = TreeView1.Nodes.Add(TextBox1.Text, tvwChild, "child" & j, TextBox2.Text, 3)
Else '若不存在,則建立根節(jié)點和子節(jié)點
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 "請輸入根節(jié)點名稱!", vbInformation, "警告!"
'系統(tǒng)提示
ElseIf TextBox2.Text = "" Then MsgBox "請輸入子節(jié)點名稱!", vbInformation, "警告!"
End If
End Sub
Private Sub CommandButton2_Click()
For i = 1 To TreeView1.Nodes.Count
TreeView1.Nodes(i).Expanded = True '展開所有節(jié)點
Next i
End Sub
Private Sub CommandButton3_Click()
For i = 1 To TreeView1.Nodes.Count
TreeView1.Nodes(i).Expanded = False '折疊所有節(jié)點
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 '刪除選定的節(jié)點
End If
End Sub
Private Sub CommandButton6_Click()
End '退出程序
End Sub
Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node)
Node.ExpandedImage = 2 '節(jié)點被展開時,選擇索引為2的圖像
End Sub
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Dim str As String
If TreeView1.SelectedItem.Children = 0 Then '檢查是否有子節(jié)點,0為無
For i = 1 To TreeView1.Nodes.Count
If TreeView1.Nodes(i).Selected Then
str = TreeView1.Nodes(i).FullPath
'系統(tǒng)提示
MsgBox "您選擇的是:[" & str & "]子節(jié)點!"
End If
Next i
End If
End Sub
運(yùn)行后,初始化用戶窗體,見UserForm_Initialize()事件代碼。首先在ImageList控件中添加三個圖片,索引值分別為1、2、3;然后語句Set TreeView1.ImageList = img將圖片鏈接到TreeView控件中。下面的兩條語句使用LineStyle屬性和Style屬性來設(shè)置TreeView控件外觀,再使用Nodes對象的Add方法來添加節(jié)點,其語法為:
Nodes.Add([relative][,relationship][,key][,text][,image][,selectedimage])
其中,參數(shù)relationship是通過關(guān)系節(jié)點參數(shù)與新節(jié)點連接的另一個節(jié)點;參數(shù)可能是以下情況:
1-tvwlast 該節(jié)點置于所有其他的在relative中被命名的同一級別的節(jié)點的后面
2-tvwNext 該節(jié)點置于在relative中被命名節(jié)點的后面
3-tvwPrevius 該節(jié)點置于在relative中被命名的節(jié)點的前面
4-tvwChild 該節(jié)點成為在relative中被命名的節(jié)點的的子節(jié)點
本例中,第一個Add語句添加名為“VBA控件”的根節(jié)點,其它兩個Add語句添加該根節(jié)點的子節(jié)點。運(yùn)行后的結(jié)果如圖14所示。
圖14:窗體初步運(yùn)行后的結(jié)果。
界面中的兩個文字框用來添加節(jié)點,當(dāng)單擊“添加”按鈕后,如果文字框中沒有任何輸入,則會提示輸入根節(jié)點和子節(jié)點。在文字框中輸入根節(jié)點和子節(jié)點后,單擊“添加”按鈕,如果根節(jié)點已存在,則在該根節(jié)點下建立子節(jié)點,若不存在,則建立新的根節(jié)點和字節(jié)點。
“展開”和“折疊”按鈕根據(jù)Expanded屬性的值來確定是否展開和折疊節(jié)點。
將Sorted屬性設(shè)置為True,對當(dāng)前節(jié)點進(jìn)行排序,使用Remove方法來刪除當(dāng)前所選中的節(jié)點。
本例還運(yùn)用了兩個事件:Expand事件和NodeClick事件。當(dāng)節(jié)點展開時,發(fā)生Expand事件,更換所展開的節(jié)點圖片。當(dāng)單擊節(jié)點時,發(fā)生NodeClick事件,該事件代碼顯示所單擊節(jié)點的路徑。
本示例運(yùn)行后的結(jié)果如圖15所示。
圖15:運(yùn)行后的結(jié)果
yDuDPiqE.jpg (21.28 KB, 下載次數(shù): 152)
[分享]樹形目錄控件——TreeView控件介紹
lu04isEi.jpg (20.42 KB, 下載次數(shù): 87)
[分享]樹形目錄控件——TreeView控件介紹
G5pQ2MPH.jpg (25.92 KB, 下載次數(shù): 148)
[分享]樹形目錄控件——TreeView控件介紹
[示例三] TreeView控件的基本使用(By Ken Puls)
本示例中,將使用工作表名和工作表中含有公式的單元地址填充TreeView控件。
先創(chuàng)建一個新工作,在工作表Sheet1和Sheet2中添加一些公式。打開VBE編輯器,添加一個用戶窗體。在該窗體中添加一個TreeView控件、一個標(biāo)簽控件和一個命令按鈕控件。
在該窗體的代碼模塊中輸入下面的代碼:
Private Sub UserForm_Initialize()
'使用缺省的設(shè)置裝載用戶窗體
'設(shè)置控件的缺省值
With Me
.CommandButton1.Caption = "關(guān)閉"
.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
'在節(jié)點中添加工作表名
.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)
'將所選中的節(jié)點關(guān)鍵字寫到標(biāo)簽中
Me.Label1.Caption = Node.Key
End Sub
Private Sub CommandButton1_Click()
'關(guān)閉用戶窗體
Unload Me
End Sub
下面對代碼進(jìn)行說明:
(1) Private Sub UserForm_Initialize()
這段代碼的功能是在裝載用戶窗體時,進(jìn)行所需要的缺省設(shè)置,然后調(diào)用Treeview_Populate過程來填充TreeView控件。在代碼中,將Treeview控件的LineStyle屬性設(shè)置為'tvwRootLines',顯示根節(jié)點連線。
(2) Private Sub TreeView_Populate()
這段代碼使用工作簿中的所有工作表名和包含公式的單元格區(qū)域來填充所有節(jié)點。
在添加節(jié)點到TreeView控件中時,需要創(chuàng)建父/子節(jié)點的關(guān)系。在本例中,每個工作表是父節(jié)點,單元格地址是其子節(jié)點。要添加根節(jié)點,需要賦給其參數(shù)Key值和參數(shù)Text。參數(shù)Key必須是唯一的,參數(shù)Text所代表的文本將顯示在節(jié)點中。示例中,使用下面的代碼將工作表名稱添加到節(jié)點中:
.Add Key:=ws.Name, Text:=ws.Name
即Me.TreeView1.Nodes.Add Key:="Sheet1", Text:="Sheet1"
要添加根節(jié)點,就使用上面的代碼結(jié)構(gòu)。
添加子節(jié)點的代碼稍有不同,仍然使用Add方法且也需要一個唯一的Key值,也必須提供父節(jié)點的Key值(參數(shù)relative)和參數(shù)relationship值(tvwChild)。在本例中,添加子節(jié)點的代碼如下:
.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"
要將子節(jié)點鏈接到父節(jié)點的下面,參數(shù)relative必須與父節(jié)點的Key值一致,參數(shù)relationship必須設(shè)置為tvwchild。要使子節(jié)點有效,它必須也有自已唯一的Key值。
(3) Private Sub Treeview1_NodeClick(ByVal Node As MSComctlLib.Node)
這段代碼捕獲節(jié)點的Click事件,并將該節(jié)點的Key值顯示在標(biāo)簽控件中。當(dāng)窗體加載時,設(shè)置標(biāo)簽label1控件為vbNullstring以確保當(dāng)沒有選擇控件時標(biāo)簽為空。
(4) Private Sub CommandButton1_Click()
該命令按鈕卸載用戶窗體。
下面的代碼進(jìn)一步擴(kuò)展了示例的功能:
Private Sub CommandButton2_Click()
'定位所選節(jié)點
Dim sNodes() As String
'檢查是否選擇了節(jié)點
If Me.Label1.Caption = vbNullString Then
MsgBox "您沒有選擇任何節(jié)點!" & vbNewLine & _
"請選擇后再試.", vbCritical + vbOKOnly, _
"沒有選擇"
Exit Sub
End If
'將標(biāo)簽分解
sNodes = Split(Me.Label1, ",")
With Worksheets(sNodes(0))
'激活工作表
.Activate
'激活合適的范圍
If UBound(sNodes) + 1 > 1 Then
'激活所選區(qū)域范圍
.Range(sNodes(1)).Activate
Else
'選擇工作表并激活單元格A1
.Range("A1").Activate
End If
End With
'卸載窗體
Unload Me
End Sub
在窗體中再放置一個命令按鈕,并輸入上面的代碼。該代碼的功能是,激活所選節(jié)點對應(yīng)的工作表中的單元格區(qū)域。
[示例四] 自動創(chuàng)建樹狀圖形(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
本示例很好地演示了添加節(jié)點的方法。代碼中,通過循環(huán)添加了5個根節(jié)點,在每個根節(jié)點下又添加了7個子節(jié)點,在每個子節(jié)點下又添加了10個子節(jié)點。
[示例五] TreeView控件和復(fù)合框組合使用
在VBE編輯器中插入一個用戶窗體,并放置一個TreeView控件和一個復(fù)合框控件,然后在該窗體的代碼窗口中輸入下面的代碼:
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
上面的代碼先建立一個樹形圖,并將節(jié)點全部添加到復(fù)合框中。然后,可以單擊復(fù)合框中的相應(yīng)節(jié)點來展開樹形圖中的根節(jié)點。
[示例六] 控件綜合使用示例(1)
本例根據(jù)puremis.net中的代碼整理。
在工作表中選擇菜單“視圖”——“工具欄”——“控件工具箱”,使用“圖像”控件添加10個圖像控件,分別命名為Image1至Image9,還有一個為None。在這些控件中單擊右鍵,選擇“屬性”并從picture屬性中選擇合適的圖像。然后,將對象名稱放置在C1至C11單元格中。在B2至B11單元格,放置名字和相應(yīng)的父親的名字,在D列,放置個人簡介。此時,工作表Sheet1如圖16所示。
圖16:工作表中的數(shù)據(jù)
在VBE編輯器中插入一個用戶窗體,在其上放置一個TreeView控件和兩個文字框控件,并進(jìn)行相應(yīng)的設(shè)置,如圖17所示。
圖17:設(shè)計界面。
TreeView包含TreeNodes的集合,每個TreeNode對象都是TreeNode集合的一個成員,其編號按顯示順序從0到Nodes.Count-1。本例中,沒有使用索引號,而是關(guān)鍵字,如:
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
'從工作表中獲取數(shù)據(jù)作為一個數(shù)組
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)
'添加數(shù)據(jù)到節(jié)點中
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
'轉(zhuǎn)換數(shù)組順序從父節(jié)點到子節(jié)點
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
運(yùn)行后的結(jié)果如圖18所示。
圖18:運(yùn)行后的結(jié)果
kLUf9zau.jpg (48.44 KB, 下載次數(shù): 222)
[分享]樹形目錄控件——TreeView控件介紹
DGk846kE.jpg (22.22 KB, 下載次數(shù): 163)
[分享]樹形目錄控件——TreeView控件介紹
rCGsjLff.jpg (37.98 KB, 下載次數(shù): 143)
[分享]樹形目錄控件——TreeView控件介紹
[示例八] 改變背景色
在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
47NchiHT.jpg (10.35 KB, 下載次數(shù): 161)
[分享]樹形目錄控件——TreeView控件介紹
[其它示例]
在示例工作簿文件夾中,附帶有摘自vbaexpress.com論壇組中的幾個關(guān)于TreeView使用的示例。其中
(1) Structure.xls工作簿:根據(jù)工作表Structure中的數(shù)據(jù)填充TreeView控件,并將相應(yīng)的信息在文字框中顯示,還可以在復(fù)合框中快速搜索相應(yīng)的節(jié)點并定位。
(2) TreeviewHitTest.xls工作簿:能夠動態(tài)顯示光標(biāo)在窗體中的坐標(biāo)值。
示例文檔下載:
VEquHuSo.rar (127.97 KB, 下載次數(shù): 5806)