I've tested your GetFolders sub-procedure, and, after initialising the list box's RowSource property to a zero-length string, it works exactly as expected, writing the set of subfolder names to the list box once only.
The only conclusion I can draw from this is that the GetFolders sub-procedure is being called three times in your case. You should set a breakpoint at the head of whatever function or procedure calls the GetFolders sub-procedure, and step into the code line by line with the F8 key. This should show you why the GetFolders sub-procedure is being called three times. As the number of times the sub-procedure appears to be called equates with the number of subfolders, I would suspect that the calling code is iterating through the subfolders collection and calling the GetFolders sub-procedure at each iteration of the loop.
If you can't pin down the reason for the multiple procedure calls, if you initialise the list box's RowSource property to a zero length string within the sub-procedure like this:
MyListBox.RowSource = ""
For Each objFolder In objFolders.SubFolders
MyListBox.AddItem objFolder.Name
Next objFolder
The list box should be emptied before being filled again, however many times the GetFolders sub-procedure is called, so even though the error in the code will not have been been eliminated, only one set of subfolder names will be inserted into the list box.