下面是一个递归调用的例子,应该可以满足你的要求吧
Public Sub GetCompanyTree(objCompany As Object, objImg As Object, Optional intHighCompanyID As Integer = -1)
  '变量定义
  Dim adors As New ADODB.Recordset
  Dim strTemp As String
  
  '错误处理
  On Error GoTo Err_MSg
  
  '程序处理
  '处理1.1:判断intHighCompanyID(上级单位ID号)的数值,如果为-1则调用一级单位,否则按传值调用
  If intHighCompanyID = -1 Then
  '处理1.1.1:清空公司树
  objCompany.Nodes.Clear
  '处理1.1.2:调出一级单位
  strTemp = "Select Company_ID,CompanyName,CompanyShort from T_Company where HigherCompany_ID = 0"
  '处理1.1.2.1:获得一级单位记录集
  adors.Open strTemp, adoGbCONN
   If Not (adors.EOF Or adors.BOF) Then
      '处理1.1.2.2:创建一级单位树
      Do While Not adors.EOF
         objCompany.Nodes.Add , , "A" & adors(0), IfNullthenEmpty(adors(2)) & "_" & adors(1), objImg.ListImages(3).Index
         '处理1.1.2.3:递归调用创建公司树函数,获得下级公司树
         GetCompanyTree objCompany, objImg, adors(0)
         adors.MoveNext
      Loop
   End If
   objCompany.Nodes(1).Expanded = True
  Else
  '处理1.2.2:调出传值单位
  strTemp = "Select Company_ID,CompanyName,CompanyShort from T_Company where HigherCompany_ID = " & intHighCompanyID & " and Company_ID<> " & intHighCompanyID
  '处理1.2.2.1:获得下级单位记录集
  adors.Open strTemp, adoGbCONN
   If Not (adors.EOF Or adors.BOF) Then
      '处理1.2.2.2:创建下级单位树
      Do While Not adors.EOF
         objCompany.Nodes.Add "A" & CStr(intHighCompanyID), 4, "A" & adors(0), IfNullthenEmpty(adors(2)) & "_" & adors(1), objImg.ListImages(3).Index
         '处理1.2.2.3:递归调用创建公司树函数,获得下级公司树
         GetCompanyTree objCompany, objImg, adors(0)
         adors.MoveNext
      Loop
   End If
  End If
  Set adors = Nothing
  Exit Sub
Err_MSg:
  GetSystemMsg 8004
  Set adors = Nothing
End Sub