I'd just use the built in data validation feature. Point it to a list and then the users will be presented with a float-level dropdown.
Edit:
Ok, then the basic principle here is linked lists. For every sub category there will be the category text and the parent category. Whenever the main category changes you re-filter the sub-category to only show the items belonging to that parent category.
There are a lot of ways to implement this idea. Here is a trivial example. To use it, create a user form with two comboboxes and paste in the code.
Option Explicit
Private masCat2() As String
Private Sub UserForm_Initialize()
Me.ComboBox1.List = CreateTestData(0)
With Me.ComboBox2
masCat2 = CreateTestData(1)
End With
End Sub
Private Sub ComboBox1_Change()
Me.ComboBox2.List = FilterArray(masCat2, Me.ComboBox1.Value)
End Sub
Private Function FilterArray(ByRef vals() As String, ByVal match As String) As String()
Dim i As Long, j As Long
Dim asVals() As String
ReDim asVals(UBound(vals, 1)) As String
For i = 0 To UBound(vals, 1)
If vals(i, 0) = match Then
asVals(j) = vals(i, 1)
j = j + 1
End If
Next
ReDim Preserve asVals(j - 1)
FilterArray = asVals
End Function
Private Function CreateTestData(ByVal series As Long) As String()
Dim asRtnVal() As String
Select Case series
Case 0
ReDim asRtnVal(1) As String
asRtnVal(0) = "Thing1"
asRtnVal(1) = "Thing2"
Case 1
ReDim asRtnVal(3, 1) As String
asRtnVal(0, 0) = "Thing1"
asRtnVal(1, 0) = "Thing1"
asRtnVal(2, 0) = "Thing2"
asRtnVal(3, 0) = "Thing2"
asRtnVal(0, 1) = "ThingA"
asRtnVal(1, 1) = "ThingB"
asRtnVal(2, 1) = "ThingC"
asRtnVal(3, 1) = "ThingD"
End Select
CreateTestData = asRtnVal
End Function