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











up vote
1
down vote

favorite












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 at 20:52















up vote
1
down vote

favorite












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 at 20:52













up vote
1
down vote

favorite









up vote
1
down vote

favorite











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 at 7:18









Pᴇʜ

20k42650




20k42650










asked Nov 19 at 20:10









Luis 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 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 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 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 at 20:52












2 Answers
2






active

oldest

votes

















up vote
0
down vote



accepted










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 at 20:48


















up vote
0
down vote













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',
    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








    up vote
    0
    down vote



    accepted










    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 at 20:48















    up vote
    0
    down vote



    accepted










    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 at 20:48













    up vote
    0
    down vote



    accepted







    up vote
    0
    down vote



    accepted






    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 at 22:07

























    answered Nov 19 at 21:04









    K.Dᴀᴠɪs

    6,696112140




    6,696112140












    • Thank you very much, this works perfect
      – Luis Camacho
      Nov 20 at 20:48


















    • Thank you very much, this works perfect
      – Luis Camacho
      Nov 20 at 20:48
















    Thank you very much, this works perfect
    – Luis Camacho
    Nov 20 at 20:48




    Thank you very much, this works perfect
    – Luis Camacho
    Nov 20 at 20:48












    up vote
    0
    down vote













    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

























      up vote
      0
      down vote













      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























        up vote
        0
        down vote










        up vote
        0
        down vote









        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 at 0:56









        Dy.Lee

        3,132159




        3,132159






























            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.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • 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

            Costa Masnaga

            Fotorealismo

            Sidney Franklin