Ordenar hojas II

Estimado Fernando:
Estuve probando tus macros eliminando las hojas que no interesa ordenar y funciona perfectamente.
Pero con el libro entero, como la celda B3 en estas hojas está protegida da error, desprotegerlas es un inconveniente.
En otras hojas esa celda tiene asignado una cadena de caracteres y también la ordena.
Todo se solucionaría si se pudiese obligar a que fuesen las hojas de 1 a 24 las que se ordenasen exclusivamente.
U obligar a que no ordene las hojas cuyos nombres
son:"Est","ob1","lista","faltas","ov","oc","jv","jc","p1","b1","inicio"
Yo, por supuesto ya lo he intentado, pero no lo he conseguido.
También me gustaría que contemplases la posibilidad que he estado pensando, que tal vez sea más fácil.
En lugar del proceso de cambiar el nombre de las hojas, si se pudiese ordenar alfabéticamente los nombres que hay en las B3 de las hoja de la 1 a la 24 exclusivamente, el problema estaría resuelto.
Sin necesidad de asignarle el número de A3 y sin cambiar el nombre de las hojas.
Siento molestarte tanto pero sin tu ayuda no puedo terminar el trabajo y es una pena las muchas horas que le he dedicado ya que no serviría para nada.

1 Respuesta

Respuesta
1
El hecho de que la hoja esté protegida sólo puede generar problema al momento que la macro escribe el nuevo número de hoja en la celda A3 (no en B3). Aquí, puedes desbloquear permanentemente esa celda o, si tienes otro modo de colocar ese valor eliminar la linea de código que dice:
Sheets(HojaAct).Range("A3").Value = Sheets(HojaAct).Name
---
Bien, la alternativa de limitar el ordenamiento de hojas desde la 1 a la 24 adolece, a mi parecer, del inconveniente que generaría agregar nuevas hojas a ordenar, pues estas incrementarían ese límite superior.
En la otra mano, la lista de nombres de las hojas que NO deben ser ordenadas no guardan ningún patrón entre sí que ayude a la macro a distinguir -automáticamente- si debe ser tenida en cuenta o no.
Por lo tanto, mi sugerencia es que exista una "marca" en aquellas hojas a excluir. Es decir la macro controlará si, por ejemplo, la celda A4 tiene un 1 (que puede estar oculto, si lo deseas). En tal caso enviará esa hoja al final del archivo, antes de las que estén en blanco, manteniendo el orden que tenia antes de agregar una nueva hoja.
Pero, no entiendo tu resistenccia a que la macro cambie el nombre de las hojas, si -de todos modos- este es un paso intermedio y al final las hojas quedan numeradas (no con el nombre que figura en B3). No es posible, en cualquier caso, ordenar hojas de acuerdo al contenido de una celda, por ello urdí tal solución...
Bien, Carbonello, si estuvieras de acuerdo con estos conceptos, éste sería tu nuevo procedimiento de VBA:
(Reemplaza todo lo anterior por este)
Public Erro As Boolean
Sub Reordena()
Erro = False
RenombraH
If Erro Then Exit Sub
OrdenaH
NumeraH
End Sub
Private Sub RenombraH()
'1º Renombra Hojas por su nombre real
On Error GoTo ErrHandler
For HojaAct = Sheets.Count To 1 Step -1
If Len(Sheets(HojaAct).Range("B3").Value) > 0 Then
'--- modificado por versión 2
If Sheets(HojaAct).Range("A4").Value = 1 Then
NombHoja = "ZZZYYY" & Trim(HojaAct)
Else
NombHoja = Sheets(HojaAct).Range("B3").Value
End If
'--- fin modificación versión 2
Else
NombHoja = "ZZZZZZ" & Trim(HojaAct)
End If
Sheets(HojaAct).Name = NombHoja
Next
On Error GoTo 0
Exit Sub
ErrHandler:
Sheets(HojaAct).Select
If Err.Number = 1004 Then
MsgBox "Existe algún problema con el nombre" & Chr(10) & "Macro detiene aquí su ejecución", vbCritical, "No es posible ubicar hoja"
Else
MsgBox Err.Number & ": " & Err.Description
End If
Erro = True
Err.Clear
On Error GoTo 0
NumeraH
Exit Sub
On Error GoTo 0
End Sub
Private Sub OrdenaH()
'2º Reordena Hojas Según nombre
Dim I As Integer, J As Integer
For I = 1 To Sheets.Count - 1
For J = I + 1 To Sheets.Count
If UCase(Sheets(I).Name) > UCase(Sheets(J).Name) Then
Sheets(J).Move Before:=Sheets(I)
End If
Next J
Next I
End Sub
Private Sub NumeraH()
'3º Renumera las hojas según su posición
For HojaAct = Sheets.Count To 1 Step -1
Sheets(HojaAct).Name = HojaAct
'If Len(Sheets(HojaAct).Range("B3").Value) > 0 Then
'Sheets(HojaAct).Range("A3").Value = Sheets(HojaAct).Name
'Else
'Sheets(HojaAct).Range("A3").ClearContents
'End If
Next
End Sub
---
Esta versión tiene anulado el procedimiento de colocar el número de hoja en las celdas "A3". Indico en la misma qué agregué para que la macro NO ordene determinadas hojas.
Espero que esta solución si te satisfaga. Pero, ya sabes, puedes volver a preguntarme aquí.
Un abrazo!
Fernando
Mira Fernando, se me ha estropeado el ordenador y lo siento porque me gusta probar tu solución, ver que funciona y con toda la alegría comunicártelo y esta vez creo que también has acertado de pleno, pero como no sé el tiempo que voy a tardar prefiero cerrar la pregunta.
Muchísimas gracias de todo corazón.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas