In Sub UserForm_Initialize()
ListBoxMain.List = Transpose(Range(Range("A1"), Cells(1, Columns.Count).End(xlToRight))
CreateNewNamesFromColumnHeaders SheetName:="Sheet2", StartColumn:=3, UseHeaders:=True
Put this in a Standard Module
Sub CreateNewNamesFromColumnHeaders(SheetName As String, _
Optional StartColumn As Long = 1, _
Optional IncludeHeader As Boolean = False)
'Creates Sheet Specific Named Ranges.
'Deletes spaces from Headers to create Names
'Allows empty columns or multiple Tables.
'Call From Sheet Change Event to handle Dynamic Lists
Dim Headers As Range
Dim Cel As Range
Dim Nme As Name
Dim strRefersTo As String
With Sheets(SheetName)
'Clear all Sheet Specific Names
For Each Nme In .Names
Nme.Delete
Next
Set Headers = Range(Cells(1, StartColumn), Cells(1, Columns.Count).End(xlToRight))
For Each Cel In Headers
If Cel <> "" Then
strRefersTo = "=" & SheetName & "!" & Range(Cel.Offset(Abs(IncludeHeader)), Cel.End(xlDown)).Address
.Names.Add Name:=SheetName & "!" & Replace(Cel, " ", ""), RefersTo:=strRefersTo
End If
Next Cel
End With
End Sub
Now when you create a new Listbox from a selection you can
'Not Code, just a Crude example
NewRowSource = "Sheet2!" & Replace(Selection, " ", "")