Most Valuable Professional


View Jan Karel Pieterse's profile on LinkedIn subscribe to rss feed
Subscribe in a reader

Subscribe to our mailing list

* indicates required

Audit !!!

Check out our RefTreeAnalyser
the ultimate Excel formula auditing tool.

Trainings

Excel VBA Masterclass (English)
Excel VBA for Financials (Dutch)

Third party tools

Speed up your file

FastExcel
The best tool to optimise your Excel model!

Repair your file

Stellar Phoenix Excel Repair
Best tool to repair corrupt Excel sheets and objects
Home > English site > Articles > Treeview control > Examples

An MSForms (all VBA) treeview; Examples

This page displays some examples where our treeview has been used.

RefTreeAnalyser

Our RefTreeAnalyser also implements the treeview control, as you can see here:

Screenshot of RefTreeAnalyser, the ultimate Excel formula auditing tool.

The City Of Amsterdam

The Engineering Desk of the City of Amsterdam has implemented our Treeview in a VBA driven tool which is used by the technical designers of the Engineering desk so their drawings comply with the Dutch CAD standard NLCS. This is what the treeview looks like in their software:

Screenshot of technical drawing tool.

Extended Project Explorer

(by Peter Thornton)

The purpose of this file is to show a few ways how the VBA Treeview can be used in a real life app. The treeview lists projects and modules similar to the VBE's (Visual Basic Editor) Project Explorer, but the branches are extended to list procedures and declarations. These can be double clicked and in turn activated in the VBE.

Other features include routines to search the treeview, return details of the treeview to a sheet to document projects, and more. Please refer to the main demo files for the most recent version of the VBA Treeview.

It looks like this:

Screenshot of Extended Project Explorer.

Access and Word users: please note documentation is included in the main Excel demo.

Download The Extended Project Explorer V1.0 (Updated Dec 04, 2013, downloaded: 3,017times)

Access Archon article

Description: Helen Feddema from Access Watch published an Access Archon article with a sample .accdb database using the Treeview alternative that works in 64-bit Office; also includes a sample .mdb database that uses the native Treeview control.

XER toolkit

The XER Toolkit is an MS Excel based application that can read, display and analyse data from Oracle's Project Management application, Primavera. The toolkit helps to improve the quality of project schedules by providing visibility without the requirement for (expensive) Primavera licences. As an enterprise system, the data within Primavera is hierarchically arranged and so the Treeview developed by JKP has become an integral and essential part of the toolkit's data access functionality. See the video. One of the screens in the tool:

Treeview data selector

Spanish diseases classification list

From Diego Pereira: This treeview loads the International Classification of Diseases in Spanish. By entering a word, a part of a word or a ICD10 code, one can locate matching nodes, highlight them and expand them. The main purpose of this example is to serve as a simple implementation of the Treeview in an Access style.

Download the sample Access accdb database (05 Mar 2014, downloaded 2,331 times)

Treeview showing Spanish Diseases classifications

Sheet navigation tool

Yves Leboutte sent us these screenshots:

Go To sheet: Allows to jump to worksheet < List of countries
Jump to sheet

Go To Item: To jump to 1 item (rows)
Jump to item

Item Selection: Allows to save options to some items in 1 or all childs sheets.
Item selection

Filtered tree

Tiago Costa from EWEN Energy shared a treeview with us which the user can filter. The filtering is implemented quite simple by filtering the table containing the source data for the tree and rebuilding the tree after filtering using the filtered table (in a Worksheet). I particularly like the looks of the form, very "modern UI"-like:

Nice form with filtered tree

Template system

Template system

Your implementation

We're always interested to see how people have implemented the VBA Treeview. So please feel free to send a screenshot with a brief description or relevant details.

 


Comments

All comments about this page:


Comment by: Steve (2/28/2014 2:09:10 PM)

I am needing to use a treeview control for Access 2013 64 bit on a Windows 8.1 machine. Will this solution work for me? Do you think that MS will continue the MSForms for a while?

 


Comment by: Jan Karel Pieterse (2/28/2014 2:10:46 PM)

Hi Steve,

Yes, this method should work just fine (The MSACCESS demo file should work in 64 bit Access 2010 and 2013).
MSFORMS controls are definitely going to be around for a considerable amount of time.

 


Comment by: ANmar (9/12/2014 11:28:51 PM)

Hi
I am using the Treeview for few days now
Great job and I have to raise my hat

Few things though
1- I was able to add the Double-click on node to expand it since I use that a lot, will send you the details later on
2- I need to know how will I send the NodeClick event to select a certain node in code, and not in mouse

Thanks and great job again

 


Comment by: Jan Karel Pieterse (9/13/2014 5:13:58 PM)

Hi Anmar,

1: Thanks!
2: You can simply set the ActiveNode of the treeview. Suppose your node is called "ThisNode" and the variabole holding the treeview mcTree:

Set mcTree.ActiveNode = ThisNode

 


Comment by: Tarek Hegazy (4/10/2015 6:28:56 PM)

Great Job. Is it possible to get the source code for the Filtered Tree. Many Thanks.
Tarek

 


Comment by: Peter Thornton (4/13/2015 11:03:33 AM)

Hi Tarek,
What do you mean by "filtered tree"?

 


Comment by: Keven Kemege (4/14/2015 10:33:36 PM)

is there an example of a recursive function that would process a parent child hierarchy file like the legacy Tree view Addbranch function?

'======== AddBranch Sub Procedure =========================
'    Recursive Procedure to add branches to TreeView Control

thanks for any help that you could provide me on this subject.

Keven Kemege

 


Comment by: Peter Thornton (4/16/2015 6:32:34 PM)

Hi Keven,
What "AddBranch" function are you referring to which treeview are you referring to as the "legacy" treeview, AFAIK there is no such built-in function in the mscomctl.ocx version.
Adding nodes recursively according to the data is normally straightforward but perhaps explain the objective behind your question.

 


Comment by: Keven Kemege (4/27/2015 11:50:07 PM)

Peter Said:
What "AddBranch" function are you referring to which treeview are you referring to as the "legacy" treeview.

Keven Said:
just Google AddBranch and treeview and you'll find a site with a recursive addbranch Visual Basic function written to work with an Access Data base form + table/query dataset and the mscomctl.ocx.
I tried to revise this code with the JKP treeview and have failed to duplicate the treeview for my parentID; text; childID formatted data set.
Can't seem to get the branching levels set recursively...

 


Comment by: Peter Thornton (4/28/2015 11:57:01 AM)

Hi Kevin,
I take it you mean the example in kb/209891. You didn't explain why you are having difficulties adapting it, does the original work for you?
At a glance, I don't have a suitable Access file to test it with, apart form the obvious references it looks like the only thing you need to change is

objTree.Nodes.Add()
to
mcTree.NodeAdd()

Also change tvwChild to tvChild or 4

Although node.AddChild is more efficient we included the treeview.NodeAdd method to simplify porting code. Refer to the documentation.

 


Comment by: Keven Kemege (4/28/2015 6:01:17 PM)

Got this recursive function to work with these changes:
'================= AddBranch Sub Procedure =========================
     '     Recursive Procedure to add branches to TreeView Control
    
     Dim cParentNode As clsNode ' altered for JKP
     Dim cChildNode As clsNode    ' altered for JKP
    
     If IsMissing(varReportToID) Then
        strCriteria = parent_ID & " Is Null"
     Else ' Search for records pointing to parent.
        strCriteria = BuildCriteria(parent_ID, rst.Fields(parent_ID).Type, "=" & varReportToID)
'Article ID: 209891 Set nodParent = objTree.Nodes("a" & varReportToID)
                     Set cParentNode = mcTree.Nodes(CStr(varReportToID)) ' altered for JKP
     End If
        
        If Not IsMissing(varReportToID) Then ' Add new node to the root.
'Article ID: 209891 Set nodCurrent = objTree.Nodes.Add(nodParent, tvwChild, strKey, strText)
                     Set cChildNode = mcTree.NodeAdd(cParentNode, tvChild, strKey, strText) 'Peter Thornton & altered for JKP
                        
        Else 'add new node to the parent
'Article ID: 209891 Set nodCurrent = objTree.Nodes.Add(, , strKey, strText)
                     Set cChildNode = mcTree.NodeAdd(, , strKey, strText) 'Peter Thornton & altered for JKP
                
        End If

thanks to Peter Thornton & Jan...

 


Comment by: Jan Karel Pieterse (4/29/2015 7:41:21 AM)

Hi Keven,

Thank you!

 


Comment by: Salim (11/18/2015 5:44:34 PM)

Hi!

Please if possible can you explain briefly how to achieve parent child relationship of Class modules as with the case of your TreeView Control.

Thank you very much.

 


Comment by: Jan Karel Pieterse (11/19/2015 9:15:20 AM)

Hi Salim,

What it takes is a variable (property) of type collection in the parent class to which all child classes are added and an object variable (property) in the child class that gets an instance of the parent class.

In a class called clsParent:

Option Explicit

Private mcolChildren As Collection

Private Sub Class_Terminate()
    Set mcolChildren = Nothing
End Sub

Public Property Get Children() As Collection
    Set Children = mcolChildren
End Property

Public Property Set Children(colChildren As Collection)
    Set mcolChildren = colChildren
End Property

Public Sub AddChild(cChild As clsChild)
    Set cChild.Parent = Me
    If mcolChildren Is Nothing Then Set mcolChildren = New Collection
    mcolChildren.Add cChild
End Sub


In a class called clsChild:

Option Explicit

Private moParent As clsParent

Private msName As String

Private Sub Class_Terminate()
    Set moParent = Nothing
End Sub

Public Property Get Parent() As clsParent
    Set Parent = moParent
End Property

Public Property Set Parent(oParent As clsParent)
    Set moParent = oParent
End Property

Public Property Get Name() As String
    Name = msName
End Property

Public Property Let Name(ByVal sName As String)
    msName = sName
End Property


ANd in a normal module:

Option Explicit

Sub Demo()
    Dim cParent As clsParent
    Dim cChild As clsChild
    Set cParent = New clsParent
    Set cChild = New clsChild
    cChild.Name = "John"
    cParent.AddChild cChild
    Set cChild = New clsChild
    cChild.Name = "Peter"
    cParent.AddChild cChild
    For Each cChild In cParent.Children
        MsgBox cChild.Name
    Next
End Sub

 


Comment by: Bennett Stewart (2/16/2016 2:01:52 PM)

Is there a way to hide checkbox for root node but show checkboxes for child nodes?

 


Comment by: Jan Karel Pieterse (2/16/2016 5:48:49 PM)

Hi Bennett,

I'm afraid as we implemented it it's an all-or-nothing setting for the entire tree.

 


Comment by: Åsa (3/16/2016 5:13:14 PM)

Hi,

I downloaded your treeview control today because I needed to make an application work on 64-bit Word. I have managed to make most of my application work as it does on 32-bit with the Common controls treeview. Only one detail remains.

When the userform loads, all subfolders of a specific folder are listed in the treeview control. As the nodes are added I also check if the nodename matches the latest selected folder (saved from the previous visit of the user). I there is a match I save the index number of the node and when all nodes have been added I would like to select the node with the saved index.

This is the code used with the common control treeview
trvFolders.Nodes.Item(intIndex).Selected = True


Is there a way to achieve the same result in your treeview?

Best regards,
Åsa

 


Comment by: Jan Karel Pieterse (3/16/2016 5:31:16 PM)

Hi Åsa,

That works slightly different from the common controls treeview indeed, by setting the activenode:

Set trvFolders.ActiveNode = trvFolders.Nodes(intIndex)

 


Comment by: Daniel (4/19/2016 2:08:29 PM)

Hi, how can i make, please, for enabled my "context menu" when i clic in the text of node ? Only when i clic in then "blank" of frame permits to see my menu.

Thank's

Best regards
Daniel

 


Comment by: Jan Karel Pieterse (4/20/2016 6:25:30 AM)

Hi Daniel,

It is as simple as adding this to your userform:

Private Sub mcTree_Click(cNode As clsNode)
    Application.CommandBars("Cell").ShowPopup
End Sub


Of course you need to replace "Cell" with the name of your commandbar.

 


Comment by: Daniel (4/21/2016 11:04:31 AM)

Thank's more Jan for your response but my problem is another. My problem comes of the event "frTreeControl_DblClick" : when i double-click on the text of the node, nothing happens, on the other hand when i double-click right off the text of node the events occurs.
I do not manage to understand.
I apologize for my english

Thank you very much beforehand.

Best regards
daniel

 


Comment by: Jan Karel Pieterse (4/22/2016 4:39:18 PM)

Hi Daniel,

The double-click event of a node is currently reserved for going into label edit mode. You can find the event in clsNode:

Private Sub mctlControl_DblClick(ByVal Cancel As MSForms.ReturnBoolean)


To add a double-click event of the treeview to your own project you need a couple of steps, which I have described in a comment on this page:

http://www.jkp-ads.com/Articles/treeview.asp?AllComments=True

Look for this comment:

"Comment by: Jan Karel Pieterse (5/24/2013 12:55:38 PM)"

 


Comment by: Life (6/14/2016 9:39:06 AM)

Hi there

thank you so much for sharing your code and effort
with the world.

I am devlepoing a Ms Access in a Right to Left enviorment,
Thererfore I am wondering whether there is a simple way to define the TreeView as right to left display?

 


Comment by: Jan Karel Pieterse (6/14/2016 10:31:10 AM)

Hi Life,

Wow, that isn't easy in our current implementation. The entire control is indeed designed to be left-to-right.
You'd have to redo all assignments in clsTreeView that contain ".Left = ......." and make them direction sensitive.
Maybe something I can ask you to do? :-P

 


Comment by: Peter Thornton (6/14/2016 2:09:07 PM)

Hi Life,

Indeed not easy, that said nothing is impossible. I suspect the biggest challenge would be catering for variable widths when the scrollbars are implemented for a left-right environment, or do they also automatically switch in right-left?

Otherwise if the entire 'insidewidth' is fixed at design it might be easier, still a fair amount of work though!

 


Comment by: David Bickerton (7/22/2016 5:22:26 PM)

Hi,

I am using MSForms (All VBA) Treeview - it is great so far - thanks for all the help.

I am having issues with SETTING new PARENT NODES within the code ? Example : How can I do this when I have 10 NODES all at Level 0. Then I want one of these Nodes to move to the sibling of one of the others that already exist ? I am assuming I do something like

Set mcTree.Nodes(strKey).ParentNode.Key = "117"

But I am having problems.

Thanks,

David


 


Comment by: Peter Thornton (8/1/2016 3:39:01 PM)

Hi David,

The treeview includes a 'move' method, eg

mcListMove cSource, cDest


..where cSource is the node you want to move and cDest is the new parent.

See "Move" in the documentation in the Excel demo (clsTreeview) if you want to place before or after some node.

 


Comment by: Steven Wade (7/28/2017 3:54:18 PM)

Do you have any code examples that show how to synchronize the data record displayed on an MS Access form based on the value selected in the tree control (subform) on that same page? (similar to how linking master and child fields allows form/subform synchronization)

 


Comment by: Peter Thornton (7/31/2017 8:12:58 AM)

Hi Steven,

To trap the treeview's click event and whatever Access form event traps the selected data record and the events select or activate the reciprical item, something like this:

Private Sub mcTree_Click(cNode As clsNode)
    ' activate associated data record
End Sub

'In the Access form event
k = the KeyOrIndex associated with selected data item

    Set mcTree.ActiveNode = mcTree.Nodes(k)
    mcTree.ScrollToView mcTree.ActiveNode

 


Have a question, comment or suggestion? Then please use this form.

If your question is not directly related to this web page, but rather a more general "How do I do this" Excel question, then I advise you to ask your question here: www.eileenslounge.com.

Please enter your name (required):

Your e-mail address (optional but if you want me to respond it helps!; will not be shown, nor be used to send you unsolicited information):

Your request or comment:

To post VBA code in your comment, use [VB] tags, like this: [VB]Code goes here[/VB].