Public Sub ParseRange2(ByVal Target As Excel.Range, ByVal Dest As Excel.Range)
Dim arrDataIn As Variant
Dim arrDataOut() As Variant
Dim lngRowCount As Long
Dim lngCurrRow As Long
Dim intLastPos As Integer
Dim intPos As Integer
' Dim intCol As Integer
lngRowCount = Target.Parent.Columns(Target.Column).Find(What:="*", After:=Cells(1, Target.Column), _
SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
arrDataIn = Target.Resize(lngRowCount - Target.Row + 1, Target.Columns.Count)
ReDim arrDataOut(1 To 2, 1 To 1)
lngRowCount = 0
For lngCurrRow = LBound(arrDataIn) To UBound(arrDataIn)
intLastPos = 0
lngRowCount = lngRowCount + 1
ReDim Preserve arrDataOut(1 To 2, 1 To lngRowCount)
arrDataOut(1, lngRowCount) = arrDataIn(lngCurrRow, 2)
arrDataOut(2, lngRowCount) = arrDataIn(lngCurrRow, 3)
Do
intPos = InStr(intLastPos + 1, arrDataIn(lngCurrRow, 1), ",")
If intPos = 0 Then
intPos = 32767
End If
lngRowCount = lngRowCount + 1
ReDim Preserve arrDataOut(1 To 2, 1 To lngRowCount)
arrDataOut(1, lngRowCount) = Mid(arrDataIn(lngCurrRow, 1), intLastPos + 1, intPos - intLastPos - 1)
arrDataOut(2, lngRowCount) = arrDataIn(lngCurrRow, 3)
intLastPos = intPos
Loop While intPos > 0 And intPos < 32767
Next lngCurrRow
If Dest.Value > "" Then
lngRowCount = Dest.Parent.Columns(Dest.Column).Find(What:="*", After:=Cells(1, Dest.Column), _
SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
Dest.Resize(lngRowCount - Dest.Row + 1, Target.Columns.Count).ClearContents
End If
Dest.Resize(UBound(arrDataOut, 2), UBound(arrDataOut)) = Application.Transpose(arrDataOut)
End Sub
I just added a block to make the header column and tweaked it to output two columns. While I was changing this, though, I noticed an error in my earlier version. There is a line in there that reads:
it worked in my testing because it was a three by three array, but that was just a coincidence...