
本文于2023年4月14日首发于本人同名公众号:Excel活学活用,更多文章敬请关注!
上期我们分享了TextBox+ListBox的方法输入科目(Excel VBA 输入逐步提示/TextBox+ListBox),今天,我们再试试另一种VBA方法,通过TreeView控件,实现会计科目的选择输入,确保科目输入的统一性:

下面我们来简要说明的一制作过程:
首先,插入TreeView控件

然后,我们把“科目"表再优化一下,使它能够顺利地加载到TreeView控件中,加了一列“上级代码",再把科目层级完善一下,最后再按科目代码排个序。
接着我们就把worksheet,SelectionChange的科目输入部分代码修改一下:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim NodX As Node Dim accTypeDic As Object Dim arr5(), arr6() If Me.CmdSwitch.Caption = "控件输入" Then Exit Sub If Target.Row > 1 Then '避开表头 If Selection.Cells.count > 1 Then '避开多重选区 Me.TextBox1.Visible = False Me.ListBox1.Visible = False Exit Sub End If If Target.Column = 4 Then '科目 Set accTypeDic = CreateObject("Scripting.Dictionary") iRow = Sheets("科目").UsedRange.Rows.count arr = Sheets("科目").Range("A2:F" & iRow).Value For i = 1 To UBound(arr, 1) If Len(arr(i, 5)) = 1 Then accTypeDic(arr(i, 5)) = arr(i, 6) End If Next arr5 = accTypeDic.keys arr6 = accTypeDic.items With Me.TreeView1 .Nodes.Clear .Visible = True .Top = Target.Top .Left = Target.Left + Target.Width .Height = Target.Height * 10 .Width = Target.Width Set NodX = .Nodes.Add(, , "Account", "科目列表") For i = LBound(arr5) To UBound(arr5) Set NodX = .Nodes.Add("Account", tvwChild, "A" & arr5(i), arr6(i)) NodX.EnsureVisible Next For i = 1 To UBound(arr, 1) If Len(arr(i, 1)) >= 4 Then Set NodX = .Nodes.Add("A" & arr(i, 5), tvwChild, "A" & arr(i, 1), arr(i, 3)) End If Next End With Me.TextBox1.Visible = False Me.ListBox1.Visible = False ElseIf Target.Column = 5 Then '现金流量 Me.TreeView1.Visible = False iRow = Sheets("XJLL").UsedRange.Rows.count arr = Sheets("XJLL").Range("C2:C" & iRow).Value If Left(Target.Offset(0, -1), 4) = "1001" Or Left(Target.Offset(0, -1), 4) = "1002" Then With Me.TextBox1 .Visible = True .Top = Target.Top .Left = Target.Left + Target.Width .Height = Target.Height .Width = Target.Width .Text = IIf(IsNull(Target.Text), "", Target.Text) .Activate End With With Me.ListBox1 .Visible = True .Top = Me.TextBox1.Top + Me.TextBox1.Height .Left = Me.TextBox1.Left .Height = Target.Height * 5 .Width = Target.Width If Me.TextBox1 = "" Then .List = arr End If End With Else Me.TextBox1.Visible = False Me.ListBox1.Visible = False End If Else Me.TextBox1.Visible = False Me.ListBox1.Visible = False Me.TreeView1.Visible = False End If Else Me.TextBox1.Visible = False Me.ListBox1.Visible = False Me.TreeView1.Visible = False End IfEnd Sub
TreeView控件添加节点的顺序:顶级、一级、二级......,基本语句:
Set NodX = treeview1.Nodes.Add(父节点, tvwChild, key, text)
父节点:就是上节节点,最顶层可以没有,其余的都要有,否则关系就乱了。
tvwChild,子节点,表示是父节点的子节点。
key,键值,不能全部是数字,这里我们以科目代码作为key,key我们是看不到的。
text,文本,节点显示的字符,我们把科目表的第3列作为text,这就是我们要在明细账中输入的内容。
这里,我们先加一个顶级节点“Account“,文本为”科目列表"
再接着添加科目分类,然后一级、二级......
最后,我们双击TreeView控件,在其click事件中添加代码,把节点的文本填到当前单元格:
Private Sub TreeView1_Click() If Me.TreeView1.SelectedItem.Children = 0 Then Selection = Me.TreeView1.SelectedItem.Text Me.TreeView1.Visible = False End IfEnd Sub
其他地方略作修改,现金辅助列还是采用原来的方法。这样,就完成了!
好,今天我们就分享到这里,我们下期再会。
本文使用 文章同步助手 同步,本文于2023年4月14日首发于本人同名公众号:Excel活学活用,更多文章敬请关注!