VBA-Excel Rearrange columns in alphabetical order when new column is added












1















I´m having issues on my file when adding a new column through VBA. When clicking on a button it gets a process ID number and creates a column on table from a different sheet.



How can I rearrange the columns order alphabetically (By header value) each time a new column is added.



The number of columns is dynamic and I can´t know the header name until the user creates a process.



This is my current code:



'Create a new column on the process assignment table
Sheets("T_PRAS").ListObjects("T_PRAS").ListColumns.Add.Name = "PR_" & Sheets("Administrador").Range("B53").Value









share|improve this question

























  • Record a macro while sorting the table (use the "Sort left to right" option) and use that as a starting point.

    – Tim Williams
    Nov 19 '18 at 20:52
















1















I´m having issues on my file when adding a new column through VBA. When clicking on a button it gets a process ID number and creates a column on table from a different sheet.



How can I rearrange the columns order alphabetically (By header value) each time a new column is added.



The number of columns is dynamic and I can´t know the header name until the user creates a process.



This is my current code:



'Create a new column on the process assignment table
Sheets("T_PRAS").ListObjects("T_PRAS").ListColumns.Add.Name = "PR_" & Sheets("Administrador").Range("B53").Value









share|improve this question

























  • Record a macro while sorting the table (use the "Sort left to right" option) and use that as a starting point.

    – Tim Williams
    Nov 19 '18 at 20:52














1












1








1








I´m having issues on my file when adding a new column through VBA. When clicking on a button it gets a process ID number and creates a column on table from a different sheet.



How can I rearrange the columns order alphabetically (By header value) each time a new column is added.



The number of columns is dynamic and I can´t know the header name until the user creates a process.



This is my current code:



'Create a new column on the process assignment table
Sheets("T_PRAS").ListObjects("T_PRAS").ListColumns.Add.Name = "PR_" & Sheets("Administrador").Range("B53").Value









share|improve this question
















I´m having issues on my file when adding a new column through VBA. When clicking on a button it gets a process ID number and creates a column on table from a different sheet.



How can I rearrange the columns order alphabetically (By header value) each time a new column is added.



The number of columns is dynamic and I can´t know the header name until the user creates a process.



This is my current code:



'Create a new column on the process assignment table
Sheets("T_PRAS").ListObjects("T_PRAS").ListColumns.Add.Name = "PR_" & Sheets("Administrador").Range("B53").Value






excel vba excel-vba






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 20 '18 at 7:18









Pᴇʜ

22.4k42850




22.4k42850










asked Nov 19 '18 at 20:10









Luis CamachoLuis Camacho

82




82













  • Record a macro while sorting the table (use the "Sort left to right" option) and use that as a starting point.

    – Tim Williams
    Nov 19 '18 at 20:52



















  • Record a macro while sorting the table (use the "Sort left to right" option) and use that as a starting point.

    – Tim Williams
    Nov 19 '18 at 20:52

















Record a macro while sorting the table (use the "Sort left to right" option) and use that as a starting point.

– Tim Williams
Nov 19 '18 at 20:52





Record a macro while sorting the table (use the "Sort left to right" option) and use that as a starting point.

– Tim Williams
Nov 19 '18 at 20:52












2 Answers
2






active

oldest

votes


















0














This is mildly tested, but I've done a similar thing when sorting worksheets and this appears to work with your table as well.



Dim x As Long, y As Long, tbl As ListObject
Set tbl = ActiveSheet.ListObjects("T_PRAS")

' Loop through each column
With tbl.ListColumns
For x = 1 To tbl.ListColumns.Count
For y = x + 1 To tbl.ListColumns.Count
If .Item(y).Name < .Item(x).Name Then
.Item(y).Range.Cut
.Item(x).Range.Insert xlRight
End If
Next y
Next x
End With


Essentially, you have two loops. The first loop is comparing the column name with the second, and if the name of the 2nd loop comes before the first, then it will move that column.






share|improve this answer


























  • Thank you very much, this works perfect

    – Luis Camacho
    Nov 20 '18 at 20:48



















0














Try



Sub test()
Dim Ws As Worksheet
Dim obj As ListObject
Dim rng As Range

Set Ws = Sheets("T_PRAS")
Set obj = Ws.ListObjects("T_PRAS")
Set rng = obj.DataBodyRange.CurrentRegion
With Ws.Sort
.SetRange rng
.Header = xlGuess
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
End Sub





share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53381921%2fvba-excel-rearrange-columns-in-alphabetical-order-when-new-column-is-added%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    This is mildly tested, but I've done a similar thing when sorting worksheets and this appears to work with your table as well.



    Dim x As Long, y As Long, tbl As ListObject
    Set tbl = ActiveSheet.ListObjects("T_PRAS")

    ' Loop through each column
    With tbl.ListColumns
    For x = 1 To tbl.ListColumns.Count
    For y = x + 1 To tbl.ListColumns.Count
    If .Item(y).Name < .Item(x).Name Then
    .Item(y).Range.Cut
    .Item(x).Range.Insert xlRight
    End If
    Next y
    Next x
    End With


    Essentially, you have two loops. The first loop is comparing the column name with the second, and if the name of the 2nd loop comes before the first, then it will move that column.






    share|improve this answer


























    • Thank you very much, this works perfect

      – Luis Camacho
      Nov 20 '18 at 20:48
















    0














    This is mildly tested, but I've done a similar thing when sorting worksheets and this appears to work with your table as well.



    Dim x As Long, y As Long, tbl As ListObject
    Set tbl = ActiveSheet.ListObjects("T_PRAS")

    ' Loop through each column
    With tbl.ListColumns
    For x = 1 To tbl.ListColumns.Count
    For y = x + 1 To tbl.ListColumns.Count
    If .Item(y).Name < .Item(x).Name Then
    .Item(y).Range.Cut
    .Item(x).Range.Insert xlRight
    End If
    Next y
    Next x
    End With


    Essentially, you have two loops. The first loop is comparing the column name with the second, and if the name of the 2nd loop comes before the first, then it will move that column.






    share|improve this answer


























    • Thank you very much, this works perfect

      – Luis Camacho
      Nov 20 '18 at 20:48














    0












    0








    0







    This is mildly tested, but I've done a similar thing when sorting worksheets and this appears to work with your table as well.



    Dim x As Long, y As Long, tbl As ListObject
    Set tbl = ActiveSheet.ListObjects("T_PRAS")

    ' Loop through each column
    With tbl.ListColumns
    For x = 1 To tbl.ListColumns.Count
    For y = x + 1 To tbl.ListColumns.Count
    If .Item(y).Name < .Item(x).Name Then
    .Item(y).Range.Cut
    .Item(x).Range.Insert xlRight
    End If
    Next y
    Next x
    End With


    Essentially, you have two loops. The first loop is comparing the column name with the second, and if the name of the 2nd loop comes before the first, then it will move that column.






    share|improve this answer















    This is mildly tested, but I've done a similar thing when sorting worksheets and this appears to work with your table as well.



    Dim x As Long, y As Long, tbl As ListObject
    Set tbl = ActiveSheet.ListObjects("T_PRAS")

    ' Loop through each column
    With tbl.ListColumns
    For x = 1 To tbl.ListColumns.Count
    For y = x + 1 To tbl.ListColumns.Count
    If .Item(y).Name < .Item(x).Name Then
    .Item(y).Range.Cut
    .Item(x).Range.Insert xlRight
    End If
    Next y
    Next x
    End With


    Essentially, you have two loops. The first loop is comparing the column name with the second, and if the name of the 2nd loop comes before the first, then it will move that column.







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Nov 20 '18 at 22:07

























    answered Nov 19 '18 at 21:04









    K.DᴀᴠɪsK.Dᴀᴠɪs

    7,229112439




    7,229112439













    • Thank you very much, this works perfect

      – Luis Camacho
      Nov 20 '18 at 20:48



















    • Thank you very much, this works perfect

      – Luis Camacho
      Nov 20 '18 at 20:48

















    Thank you very much, this works perfect

    – Luis Camacho
    Nov 20 '18 at 20:48





    Thank you very much, this works perfect

    – Luis Camacho
    Nov 20 '18 at 20:48













    0














    Try



    Sub test()
    Dim Ws As Worksheet
    Dim obj As ListObject
    Dim rng As Range

    Set Ws = Sheets("T_PRAS")
    Set obj = Ws.ListObjects("T_PRAS")
    Set rng = obj.DataBodyRange.CurrentRegion
    With Ws.Sort
    .SetRange rng
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlLeftToRight
    .SortMethod = xlPinYin
    .Apply
    End With
    End Sub





    share|improve this answer




























      0














      Try



      Sub test()
      Dim Ws As Worksheet
      Dim obj As ListObject
      Dim rng As Range

      Set Ws = Sheets("T_PRAS")
      Set obj = Ws.ListObjects("T_PRAS")
      Set rng = obj.DataBodyRange.CurrentRegion
      With Ws.Sort
      .SetRange rng
      .Header = xlGuess
      .MatchCase = False
      .Orientation = xlLeftToRight
      .SortMethod = xlPinYin
      .Apply
      End With
      End Sub





      share|improve this answer


























        0












        0








        0







        Try



        Sub test()
        Dim Ws As Worksheet
        Dim obj As ListObject
        Dim rng As Range

        Set Ws = Sheets("T_PRAS")
        Set obj = Ws.ListObjects("T_PRAS")
        Set rng = obj.DataBodyRange.CurrentRegion
        With Ws.Sort
        .SetRange rng
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlLeftToRight
        .SortMethod = xlPinYin
        .Apply
        End With
        End Sub





        share|improve this answer













        Try



        Sub test()
        Dim Ws As Worksheet
        Dim obj As ListObject
        Dim rng As Range

        Set Ws = Sheets("T_PRAS")
        Set obj = Ws.ListObjects("T_PRAS")
        Set rng = obj.DataBodyRange.CurrentRegion
        With Ws.Sort
        .SetRange rng
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlLeftToRight
        .SortMethod = xlPinYin
        .Apply
        End With
        End Sub






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 20 '18 at 0:56









        Dy.LeeDy.Lee

        3,6421510




        3,6421510






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53381921%2fvba-excel-rearrange-columns-in-alphabetical-order-when-new-column-is-added%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Guess what letter conforming each word

            Port of Spain

            Run scheduled task as local user group (not BUILTIN)