I like to use the Worksheet code to perform all "listing", This keeps the UserForm code neat and concise. It does mean that the Worksheet Code module most be treated like a Hybrid Class Module: Hybrid since it is still closely tied to the Worksheet; Class module since it will have UserDefined Properties and Methods.
Start by laying out the Data Base sheet with Headers (Here after I call Headers "Fields"), Make sure the Fields are properly spelled , It's a pain to change them half way thru the project. Change the CodeName of the DataBase Sheet to either something simple, like "DB" or something meaningful Like "DBSteps". Simple is fine when there is only one DataBase Style Sheet, Keep the "DB" prefix if you use something Meaningful so that all DB objects are listed together in the VBA Project Explorer window pane. The CodeName is what will be used in all code, instead of "Sheets("DataBase")"
Next design the layout of the UserForm, BUT, with just one Row of Controls, If you use Kadri's style of having Labels above the Row, that is Ideal; Name the Controls according to the Label Captions, but suffix a number after. So the First List/ComboBox will be named "Suppliers1," the next, "Cateory1", The "Product1" etc. The remaining 9 Rows will be added later.
Since you will have 10 Rows of UserForm Controls, I would Write one UserDefined DB Property, "GetList", that could handle 0 to many Parameters, Retrieve a list depending on which Parameters were present
Public Property Get GetList(Optional MainTxt As String, Optional Text1 As String, Optional Text2 As String, Optional Text3 As String, Optional Text4 As String) As Variant
If MainText Is Null then GetList = MainList
'Code to generate other list arrays goes here
'Or call a Sub Function to make said arrays
End Property
Finally, you will want a Method "Initialze" to create the first Main list, so that it is ready as soon as the UserForm is Showing. Call this Method from the Sub UserForm_Initialize (or form the Sub Workbook_Open.)
Back to the UserForm: The Form's Initialize sub should first initialize the DB then load the main list into the first List/Combo Box
Sub UserForm_Initialize()
DB.Intialize
Me.ComboBox1.List = Db.GetList()
End Sub
The Codes for each Control is very similar. Remember the numbers after control names?
'=====Row 1======
Sub Suppliers1_Exit()
Me.Category1.List = DB.GetList(Suppliers1.Value)
End Sub
Sub Category1_Exit()
Me.Products1.List = DB.GetList(Me.Supplers1.Value, Me.Category1.Value)
End Sub
Sub Products1_Exit()
Me.Next1.List = DB.GetList(Me.Supplers1.Value, Me.Category1.Value, Me.Products1.Value)
End Sub
'Repeat this pattern for all Controls in Row 1, adding a reference to the previous control's value as needed
'======Row 2======
After you have tested the DB Module code and are satisfied, merely copy the first Row's code 10 times and change the numbers after the Control names. Alternately, you can write a "With Events" module and follow this pattern to only use one (set of) sub Procedure(s).