二 创建控件1. 插入用户窗体

从Excel【开拓工具】选项卡进入VBA编辑器,插入一个用户窗体用来作为树形控件的容器。
这里,我们给窗体命名为“TreeFrm”。

2. 添加窗体树形控件

这一步非常关键,也很随意马虎出问题,由于这个控件不在根本的控件工具箱里面,它须要自行从组件库面引用一下。
详细操作过程为:

依次点击【工具】—【引用】选项,找到“ Microsoft Windows Common Controls 6.0 (SP6) ”组件,选择并确定。

html树状多级下拉菜单Excel树形多级下拉菜单的运用 Webpack

这时候,可以看到控件工具箱里面多了一个控件。
这个便是我们须要的树形控件。
接着将该控件添加到窗体。
将该控件命名为“TreeView1”

三 编写代码1.全局变量定义

Public Nodeitem As node2. 控件初始化

在窗体 TreeFrm ,初始化事宜 Initialize()下面写入树形控件初始化动作.

Private Sub UserForm_Initialize() Dim LastRowId As Integer Dim j As Integer Dim node_grade As String Dim node_father As String Me.ch_mutilple.Value = False '多选模式选择框初始化为默认不选择 Me.TreeView1.CheckBoxes = False '将树形构造初始化为单选模式 LastRowId = Sheet1.Cells(1, 1).End(xlDown).Row For j = 2 To LastRowId node_grade = Sheet1.Cells(j, 1) node_father = Sheet1.Cells(j, 2) '如果上节点为空,则作为父节点来添加,否则就按照子节点来添加 If node_father = "" Then Set Nodeitem = TreeView1.Nodes.Add(, , node_grade, node_grade) Nodeitem.Sorted = True Else Set Nodeitem = TreeView1.Nodes.Add(node_father, tvwChild, node_grade, node_grade) Nodeitem.Sorted = True End If Next jEnd Sub

编写完以上代码,运行窗体,可以看到已经正常加载了【目录】表里面所有的节点数据。

3. 选取数据

控件初始化后,节点数据能常常加载了,那么接下来就须要通过点击事宜将数据返回到指定的位置。
以下是代码:

Private Sub TreeView1_DblClick() Dim father_grade As String Dim selected_items As String Dim tree_path As String Dim rowid As Integer rowid = Selection.Row selected_items = Me.TreeView1.SelectedItem.Text tree_path = Me.TreeView1.SelectedItem.FullPath & vbCr & TreeView1.PathSeparator '获取当前节点的全路径,并用“\”来分隔 Sheets("物品管理").Cells(rowid, 1) = selected_itemsEnd Sub

4. 触发窗体加载

要利用树形框,就得探求一个机制通过加载TreeFrm窗体来实现。
这里,我选择的机制是:当激活第一列单元格后开始加载TreeFrm窗体。
这就须要在须要加载窗体的事情表下面写入代码,在此,我用到了一个事情表【物品管理】。
并在该事情表下面写入了如下代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) If ActiveCell.Column = 1 Then TreeFrm.Show End IfEnd Sub

完成以上代码,在双击节点后将节点选项值返回至【商品目录管理】这个事情表选定行的第一列,同时将该节点项目的整体父节点路径放在第二列。

5. 加入多选机制

到此为止,一个树形选择框的运用基本上完成了。
但从场景的适用上还可以更加宽广一些。
那么,我们可以连续添加多选的机制。
即可以一次性选择多个项目,而不是只能单选。
详细办法是在窗体上连续添加一个复选框控件和一个按钮。
复选框按钮用来切换选择模式,按钮用来处理选择完选项之后后续数据过程。

复选框控件代码

Private Sub ch_mutilple_Click() If Me.ch_mutilple.Value = True Then TreeFrm.TreeView1.CheckBoxes = True Else TreeFrm.TreeView1.CheckBoxes = False End IfEnd Sub按钮控件的代码

Private Sub cmd_confir_Click() Dim father_grade As String Dim selected_items As String Dim tree_path As String Dim rowid As Integer rowid = Selection.Row Dim i As Integer Dim checked_item As String Sheets("物品管理").Cells(rowid, 1) = "" '触发选择后,先清空当前的数值 Sheets("物品管理").Cells(rowid, 2) = "" If Me.ch_mutilple.Value = True Then '处于多选模式时开始遍历树形节点 For i = 1 To TreeView1.Nodes.Count '遍历全体树形节点,如果当选中,则开始循环拼接各个节点成为一个字符串。
If TreeView1.Nodes.Item(i).checked = True Then checked_item = TreeView1.Nodes.Item(i).Text selected_items = checked_item & Chr("59") & selected_items 'chr("59")为VB的字符“;” End If Next i Else selected_items = Me.TreeView1.SelectedItem.Text '如果是单选模式下,则返回节点路径,多选模式下不返回节点路径 tree_path = Me.TreeView1.SelectedItem.FullPath & vbCr & TreeView1.PathSeparator '获取当前节点的全路径,并用“\”来分隔 Sheets("物品管理").Cells(rowid, 2) = Trim(Left(tree_path, Len(tree_path) - 1)) '去除路径尾部多余的分隔符“\” End If Sheets("物品管理").Cells(rowid, 1) = Left(selected_items, Len(selected_items) - 1) '去除路径尾部多余的分隔符“;”End Sub

到此为止,基本大功告成,唯一不敷的就剩下以下几个方面了:

在单选模式下,父节点不许可被选取,只能选取末级节点。
在多选模式下,父节点选定后,所有子节点须要全部继续的选定。

以上两个遗留问题,实际上办理并不困难,便是判断一下当前选取节点的级别,然后根据条件做干系处理即可。
在此先按下不表,待后期有韶光了再来补充,当然如果有兴趣的朋友可以试着去处理以下。