0

For simplification, let's say a have Column A:

John
23
9
12
33
Peter
42
23
44
5
9
Mark
4
6
87

How can I sort it in 3 different columns where the names appears on top of each column and the corresponding data underneath each name?

2 Answers 2

1

I'm pretty sure you just want to split up one column into several but this includes code for sorting each column as well.

Option Explicit

Sub test()

    Dim i As Long, a As Long, rws As Long, rng As Range

    With Worksheets("sheet3")

        rws = .Cells(.Rows.Count, "A").End(xlUp).Row

        'split into columns based on a text header value
        For i = 1 To .Columns("A").SpecialCells(xlCellTypeConstants, xlTextValues).Cells.Count - 1
            Set rng = .Range(.Cells(2, i), .Cells(.Rows.Count, i).End(xlUp))
            a = Application.Match("*", rng, 0)
            With .Cells(a + 1, i).Resize(rws, 1)
                .Parent.Cells(1, i + 1).Resize(.Rows.Count, 1) = .Value
                .Clear
            End With
        Next i

        'did you actually want to sort the split values?
        For i = 1 To .Cells(1, .Columns.Count).End(xlToLeft).Column
            With .Range(.Cells(1, i), .Cells(.Rows.Count, i).End(xlUp))
                .Sort key1:=.Cells(1), order1:=xlAscending, Header:=xlYes
            End With
        Next i

    End With

End Sub
Sign up to request clarification or add additional context in comments.

Comments

0

Header Column to Columns

  • Adjust the values in the constants (Const) section to fit your needs.
  • The result of the current setup is shown in the following image:

enter image description here

The Code

Sub HeaderColumnToColumns()

    Const cSource As Variant = "Sheet1"   ' Source Worksheet Name/Index
    Const cSrcCol As Variant = "A"        ' Source Column Letter/Number
    Const cSrcFR As Long = 1              ' Source First Row Number

    Const cTarget As Variant = "Sheet1"   ' Target Worksheet Name/Index
    Const cTgtCol As Variant = "B"        ' Target Column Letter/Number
    Const cTgtFR As Long = 1              ' Target First Row Number

    Dim rng As Range      ' Target Range.
    Dim vntS As Variant   ' Source Array
    Dim vntT As Variant   ' Target Array
    Dim srcLR As Long     ' Source Last Row Number
    Dim srcRC As Long     ' Source Rows Count
    Dim tgtRC As Long     ' Target Rows Count
    Dim tgtCC As Long     ' Target Columns Count
    Dim i As Long         ' Source Row Counter
    Dim j As Long         ' Target Column Counter
    Dim k As Long         ' Target Row Counter

    ' In Source Column
    With ThisWorkbook.Worksheets(cSource).Columns(cSrcCol)
        ' Calculate Source Last Row Number.
        srcLR = .Cells(.Rows.Count).End(xlUp).Row
        ' Calculate Source Column Range.
        ' Copy Source Column Range to Source Array
        vntS = .Cells(cSrcFR, cSrcCol).Resize(srcLR - cSrcFR + 1)
    End With

    ' Write number of rows in Source Array to Source Rows Count.
    srcRC = UBound(vntS)

'    ' Reset Target Column Counter to 0 (because j = j + 1).
'    j = 0
    ' Reset Target Row Counter to 1 because of headers (titles).
    k = 1

    ' Calculate Number of Target Rows (tgtRC) and Columns (tgtCC) Count.
    ' Loop through rows of one-column Source Array.
    For i = 1 To srcRC
        ' Check if current value in Source Array is not an empty string.
        If vntS(i, 1) <> "" Then
            ' Check if current value in Source Array is a number.
            If IsNumeric(vntS(i, 1)) Then
                ' Count current row in Target Array (Next Row).
                k = k + 1
              Else
                ' Count Target Array Columns Count (Next Column).
                tgtCC = tgtCC + 1
                ' Check if current row in Target Array is greater than Target
                ' Array Rows Count. If so, write current row in Target Array
                ' to Target Array Rows Count.
                If k > tgtRC Then tgtRC = k
                ' Reset Target Row Counter to 1 because of headers (titles).
                k = 1
            End If
        End If
    Next

    ' Resize Target Array to just counted rows and columns.
    ReDim vntT(1 To tgtRC, 1 To tgtCC)

    ' Reset Target Column Counter to 0 (because j = j + 1).
    j = 0
    ' Reset Target Row Counter to 1 (because of headers (titles)).
    k = 1
    ' Loop through rows of one-column Source Array.
    For i = 1 To srcRC
        ' Check if current value in Source Array is not an empty string.
        If vntS(i, 1) <> "" Then
            ' Check if current value in Source Array is a number.
            If IsNumeric(vntS(i, 1)) Then
                ' Count current row in Target Array.
                k = k + 1
              Else
                ' Count current column in Target Array (Next Column).
                j = j + 1
                ' Reset Target Row Counter to 1 because of headers (titles).
                k = 1
            End If
            ' Write current value of current element in Source Array to current
            ' element in Target Array.
            vntT(k, j) = vntS(i, 1)
        End If
    Next

    ' In Target Columns
    With ThisWorkbook.Worksheets(cTarget).Columns(cTgtCol).Resize(, tgtCC)
        ' Calculate Target Columns Range.
        ' Note: Target Columns Range is the range in Target Columns that spans
        '       from the cells in Target First Row to the bottom row.
        ' Clear contents of Target Column Range.
        .Cells(cTgtFR, 1).Resize(.Rows.Count - cTgtFR + 1, tgtCC).ClearContents
        ' Note: Target Range is the cell range at the intersection of Target
        '       First Row and Target Column resized by the size of Target Array,
        '       i.e. rows (tgtRC) and columns (tgtCC) of Target Array.
        ' Calculate Target Range.
        Set rng = .Cells(cTgtFR, 1).Resize(tgtRC, tgtCC)
        ' Copy Target Range to Source Array
        rng = vntT

        ' Apply formatting to Target Range.
        With rng
            .Columns.AutoFit
            .Font.Bold = True
            .BorderAround , , 1
            With .Borders(xlInsideVertical)
                .LineStyle = xlContinuous ' Required.
                '.Weight = xlThin
                .ColorIndex = 1
            End With
            With .Rows(1)
                .Interior.ColorIndex = 49
                .Font.ColorIndex = 2
                .BorderAround , , 1
            End With
        End With
        ' ColorIndex:   1-Black, 2-White 3-Red, 4-(Bright) Green, 5-Blue,
        '               6-Yellow, 7-Pink, 8-Turquoise, 9 - Dark Red, 10 - Green

    End With

End Sub

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.