DEJE QUE EXCEL HAGA EL TRABAJO SUCIO

Ordenar las hojas de un libro de Excel

Es frecuente encontrarse con libros llenos de hojas cuyos nombres corresponden a números. También es frecuente encontrarse con libros que tienen las pestañas de sus hojas de distintos colores. En el primer de los casos, por lo general buscamos tener las hojas ordenadas. En el segundo, buscamos tener las hojas agrupadas por color. Las macros que se presentan a continuación permiten hacer esto fácilmente.

Para ordenar hojas numeradas se puede usar una macro como esta, que se basa en el algoritmo de ordenamiento burbuja (buble sort). No he probado la macro exhaustivamente, pero parece arrojar buenos resultados (tenga en cuenta que las hojas con nombres no numéricos serán tratados por la macro como de valor 0 (cero). Si desea excluir una o varias hojas de la ordenación, haga uso de los argumentos Desde y Hasta como se indica más adelante) :

Public Sub OrdenarHojas(ByVal Desde As Long, ByVal Hasta As Long)


    Dim i As Long
    Dim j As Long
    
    
    For i = Desde To Hasta - 1
    
        For j = i + 1 To Hasta
            
            If VBA.Val(Sheets(i).Name) > VBA.Val(Sheets(j).Name) Then
                
                Sheets(j).Move before:=Sheets(i)
                
            End If
            
        Next j
    
    Next i
    
    
End Sub

Para agrupar las hojas por el color de sus pestañas, pruebe con esta macro:

Public Sub AgruparColorHojas(ByVal Desde As Long, ByVal Hasta As Long)

    
    Dim i As Long
    Dim j As Long
    
    
    For i = Desde To Hasta
    
        For j = i + 1 To Hasta
        
            If Sheets(i).Tab.ColorIndex = Sheets(j).Tab.ColorIndex Then
                
                Sheets(j).Move after:=Sheets(i)
                
            End If
    
        Next j
    
    Next i
    

End Sub

Puede llamar las macros indicando de qué hoja a qué hoja quiere ordenar o agrupar, por ejemplo, para agrupar todas las hojas de un libro, podría usar algo así:

Sub prueba()
    
    
    Application.ScreenUpdating = False
    
    OrdenarHojas Desde:=1, Hasta:=Sheets.Count
    
    Application.ScreenUpdating = True
    
    
End Sub

Observe que estoy desactivando la actualización de pantalla antes de pasar a ordenar las hojas, ya que el procedimiento OrdenarHojas, al ir moviendo las hojas de una posición a otra, puede ser lento y si no se desactiva la actualización de pantalla se notará cómo se van cambiando de posición las hojas.

Tenga en cuenta que puede combinar ambas macros para lograr resultados combinados. Suponiendo que tiene hojas con nombres numéricos y con colores, y desea tanto ordenarlas como agruparlas, podría probar con:

Sub prueba()
    
    
    Application.ScreenUpdating = False
    
    OrdenarHojas Desde:=1, Hasta:=Sheets.Count
    AgruparColorHojas Desde:=1, Hasta:=Sheets.Count
    
    Application.ScreenUpdating = True
    
    
End Sub

Esto dará como resultado las hojas agrupadas por color y ordenadas para cada color.

También observe que puede ordenar sólo un rango de hojas, suponiendo que no quiere ordenar o agrupar las dos primeras hojas, podría probar con:

Sub prueba()
    
    
    Application.ScreenUpdating = False
    
    OrdenarHojas Desde:=3, Hasta:=Sheets.Count
    
    Application.ScreenUpdating = True
    
    
End Sub

Al usar Sheets.Count se está indicando que se ejecute hasta el total de hojas en el libro activo. Si, por ejemplo, quisiera ordenar todas las hojas sin incluir la última, podría usar:


Sub prueba()
    
    
    Application.ScreenUpdating = False
    
    OrdenarHojas Desde:=1, Hasta:=Sheets.Count - 1
    
    Application.ScreenUpdating = True
    
    
End Sub

Con una ligera modificación se puede usar la macro OrdenarHojas para que ordene hojas con nombres no numéricos, por ejemplo: "C", "D", "A", que pasaría a ser "A", "C", "D" tras ejecutar la macro:

Public Sub OrdenarHojas(ByVal Desde As Long, ByVal Hasta As Long)


    Dim i As Long
    Dim j As Long


    For i = Desde To Hasta - 1

        For j = i + 1 To Hasta

            If Sheets(i).Name > Sheets(j).Name Then

                Sheets(j).Move before:=Sheets(i)

            End If

        Next j

    Next i


End Sub

0 comentarios:

Publicar un comentario en la entrada