专栏名称: 完美Excel
Excel与VBA技术学习与实践
目录
相关文章推荐
完美Excel  ·  巧用COUNTA函数统计单元格数,但deep ... ·  2 天前  
完美Excel  ·  使用deepseek在Excel用户窗体中生 ... ·  昨天  
Excel之家ExcelHome  ·  WPS表格中的几个实用功能 ·  3 天前  
Excel之家ExcelHome  ·  让Excel自动检测录入的数据 ·  2 天前  
Excel之家ExcelHome  ·  还在手动筛选数据?FILTER函数这几种典型 ... ·  2 天前  
51好读  ›  专栏  ›  完美Excel

使用deepseek在Excel用户窗体中生成树状目录

完美Excel  · 公众号  · Excel  · 2025-02-20 06:29

正文

学习Excel技术,关注微信公众号:
excelperfect

标签: AI 大模型 deepseek VBA

我想要根据工作表中的数据生成树状目录。示例数据如下图 1 所示,根据行列中的值生成目录中相应的节点和子节点。

1
上述示例数据生成的树状目录效果应该如下图 2 所示。

2
我先准备好用户窗体。

Excel 中,打开 VBE ,插入一个用户窗体,在“工具箱”上单击右键,点击弹出的快捷菜单中的“附加控件”命令,在“附加控件”的“可用控件”中找到并选取“ Microsoft TreeView Control ”,如下图 3 所示。(当然,如果在工具箱中已添加这个控件则这步可省略)

3
此时,“工具箱”工具条中会出现“ TreeView ”控件,如下图 4 所示。

4
在用户窗体中绘制 TreeView 控件,保持其默认名 TreeView1 ,如下图 5 所示。

5
下面,进入 deepseek 提问界面,向 deepseek 提问:

我想使用 Excel VBA 在用户窗体中根据工作表中的数据生成树状目录,树状目录结构示意如下:

根目录

子目录

子目录

子目录

子目录

子目录

子目录

子目录

子目录

子目录

子目录

子目录

子目录

子目录

子目录

根据工作表数据结构形成任意层级的目录,也就是说列 A 中是根目录,列 B 中是第二级子目录,列 C 中是相应子目录下的第三级子目录, ...... ,依此类推。

附件工作簿中工作表 Sheet1 只是示例工作表,数据只是示意,可能会有不同的行或列,要求代码不要硬编码,可以根据工作表中的不同数据生成相应层级的树状目录。

请帮我使用 VBA 实现。

同时,上传示例工作簿作为附件供 deepseek 参考。

经过几次追问后, deepseek 给出了能够实现上述效果的代码:

' 用户窗体代码(假设窗体名为UserForm1,TreeView控件名为TreeView1)' 需要引用Microsoft Windows Common Controls 6.0 (SP6)Private Sub UserForm_Initialize() InitTreeViewEnd Sub
Sub InitTreeView() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1"' 根据实际工作表名称修改 TreeView1.Nodes.Clear
' 获取根节点 Dim rootCell As Range Set rootCell = ws.Range("A1") If rootCell.Value = "" Then   MsgBox "根目录未找到!", vbCritical Exit Sub End If
' 添加根节点 Dim rootKey As String rootKey = "RootNode" TreeView1.Nodes.Add , , rootKey, rootCell.Value TreeView1.Nodes(1).Expanded = True
' 初始化层级字典 Dim parentNodes As Object Set parentNodes = CreateObject("Scripting.Dictionary") parentNodes.Add 0, TreeView1.Nodes(1) ' 根节点的层级为0
' 获取数据区域的最后一行和最后一列 Dim lastRow As Long Dim lastCol As Long lastRow = GetLastRow(ws) lastCol = GetLastCol(ws)
' 遍历数据行 Dim i As Long Dim j As Long For i = 2 To lastRow Dim currentLevel As Long currentLevel = 0
' 遍历列,从第二列开始到最后一列 For j = 2 To lastCol Dim cellVal As String  cellVal = Trim(ws.Cells(i, j).Value)
' 如果单元格为空,跳过当前列,继续遍历下一列 If cellVal = "" Then currentLevel = j - 1 ' 更新当前层级 GoTo ContinueLoop ' 跳过当前迭代 End If
currentLevel = j - 1 ' 当前层级(从0开始)
' 确保父节点存在  If Not parentNodes.Exists(currentLevel - 1) Then     MsgBox "层级错误:行" & i & " 列" & j, vbCritical Exit Sub End If
' 创建唯一键并添加节点 Dim nodeKey As String Dim newNode As Node  nodeKey = "R" & i & "C" & j  Set newNode = TreeView1.Nodes.Add(parentNodes(currentLevel - 1), tvwChild, nodeKey, cellVal)
' 更新层级字典  If parentNodes.Exists(currentLevel) Then parentNodes.Remove currentLevel  parentNodes.Add currentLevel, newNode
ContinueLoop: Next j
' 清理层级字典,确保下一行的层级从正确的位置开始 Dim keys As Variant Dim k As Variant keys = parentNodes.keys For Each k In keys    If k > currentLevel Then parentNodes.Remove k Next k Next iEnd Sub
' 获取数据区域的最后一行Function GetLastRow(ws As Worksheet) As Long Dim lastRow As Long Dim col As Long Dim tempLastRow As Long
lastRow = 0 For col = 1 To ws.Columns.Count   tempLastRow = ws.Cells(ws.Rows.Count, col).End(xlUp).row If tempLastRow > lastRow Then lastRow = tempLastRow End If Next col
GetLastRow = lastRow






请到「今天看啥」查看全文