Al rellenar una celda, que se abra una nueva hoja y que se ordene sola

Hola a todos. Hace unos días hacía la siguiente pregunta:

Hola a todos. Tengo una tabla de excel con varias hojas, y necesito lo siguiente: Cuando rellene (con cualquier valor) la celda B2, debe abrirse automáticamente una nueva hoja, cuyo nombre sea el mismo que el valor de la celda R2, y que además sea copia de la hoja VALORES. Cuando rellene (con cualquier valor) la celda B3, debe abrirse automáticamente una nueva hoja, cuyo nombre sea el mismo que el valor de la celda R3, y que además sea copia de la hoja VALORES. Y así sucesivamente... Espero haberme explicado. ¡¡¡Muchas gracias de antemano por vuestras respuestas!!!


Y el experto luismondelo me respondía con lo siguiente:

Hola, te mando mi solución. No has dicho en que hoja estamos modifcando la columna B, en mi ejemplo lo hago sobre la hoja1. Es decir tengo una hoja llamada hoja1 y otra llamada valores y en la hoja1 es donde modifico las celdas de la columna B
Esta macro la tienes que copiar dentro del objeto hoja1 para que se autoejecute en el momento de teclear algo en la columna B
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 Then
nombre = Target.Offset(0, 16).Value
Sheets("valores").Copy after:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
ActiveSheet.Name = nombre
End If
End Sub


Visto lo anterior, lo que pregunto es lo siguiente:

Teniendo en cuenta que siempre las nuevas hojas que se van a crear automáticamente (gracias al macro anterior) van a tener por nombre un número, ¿existe alguna forma de que la nueva hoja no se coloque al final, sino que se coloque en su número de orden correspondiente?

Por ejemplo, supongamos que al escribir en la celda correspondiente, se me abre (por orden del macro) una nueva hoja, cuyo nombre va a ser (por ejemplo), 30. Y esa nueva hoja se coloca al final (como última hoja del libro). Lo que yo quiero es que se coloque entre la hoja 29 y la hoja 31, en vez de colocarse al final...

Espero haberme explicado.

Muchas gracias de antemano. ¡¡Saludos!!

1 respuesta

Respuesta
1

Como yo te contesté lo vuelvo a hacer ahora. Después del proceso inicial que ya te envié solo tienes que ejecutar esta macro para ordenar las pestañas de tu archivo

Sub ordenar()
On Error Resume Next
For Each hoja In ActiveWorkbook.Sheets
For x = 1 To Sheets.Count
If UCase(Sheets(x).Name) > UCase(Sheets(x + 1).Name) Then
Sheets(x + 1).Move before:=Sheets(x)
End If
Next
Next
End Sub

recuerda finalizar

Muchas gracias de nuevo por tu contestación, Luismondelo

¿Dónde debo ponerlo? ¿En la misma hoja que el otro código?

No, en este caso dentro de un módulo

¿puede unirse a la otra macro para que ambas cosas se hagan "automáticas" (una después de la otra)?

No te entiendo. ¿a qué te refieres con "dentro de un módulo"? ¿Cómo se hace?

Gracias

Claro, sería asi:

Esta es la macro que ya tenías dentro del objeto hoja en cuestión

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 Then
nombre = Target.Offset(0, 16).Value
Sheets("valores").Copy after:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
ActiveSheet.Name = nombre
End If
ordenar
End Sub

Después copia esta macro dentro de un módulo y ya está. Están encadenadas para hacer el proceso de crear la hoja y después ordenarlas

Sub ordenar()
On Error Resume Next
For Each hoja In ActiveWorkbook.Sheets
For x = 1 To Sheets.Count
If UCase(Sheets(x).Name) > UCase(Sheets(x + 1).Name) Then
Sheets(x + 1).Move before:=Sheets(x)
End If
Next
Next
End Sub

recuerda finalizar

No me funciona. Yo tengo en la hoja "Relación" el código siguiente:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 Then
nombre = Target.Offset(0, -1).Value
Sheets("1").Copy after:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
ActiveSheet.Name = nombre
End If
End Sub

Y ahora he entrado en "Módulo 1" y he copiado el siguiente código:

Sub ordenar()
On Error Resume Next
For Each hoja In ActiveWorkbook.Sheets
For x = 1 To Sheets.Count
If UCase(Sheets(x).Name) > UCase(Sheets(x + 1).Name) Then
Sheets(x + 1).Move before:=Sheets(x)
End If
Next
Next
End Sub

Pero cuando escribo algo en una nueva celda de la columna B me da error 1004 en tiempo de ejecuación (cosa que antes no me ocurría....

Observa las macros que te envié en mi último post: En la macro que ya tenías tenemos que anotar el nombre de la segunda y yo lo había anotado justo antes del end sub

Míralo por favor.

Repito aquí como quedarán tus dos macros.

(Mira la penúltima fila de esta macro)

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 Then
nombre = Target.Offset(0, 16).Value
Sheets("valores").Copy after:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
ActiveSheet.Name = nombre
End If
ordenar
End Sub

y en el módulo

Sub ordenar()
On Error Resume Next
For Each hoja In ActiveWorkbook.Sheets
For x = 1 To Sheets.Count
If UCase(Sheets(x).Name) > UCase(Sheets(x + 1).Name) Then
Sheets(x + 1).Move before:=Sheets(x)
End If
Next
Next
End Sub

Muchas gracias de nuevo. Va perfecto.

El único problema es que, además de las hojas cuyos nombres son números, tengo también tres hojas más (Relación, Recibos y Resumen), y al ordenar todas las hojas del libro me manda estas tres hojas al final. Y yo quiero que sólo me ordene las que tienen por nombre un número...

¿Se puede hacer? Muchas gracias por todo de nuevo.

Claro, esta es la solución, sigue estas instrucciones:

-Primero mueve manualmente esas tres hojas al principio para que sean las primeras

-Después ejecuta el proceso de nuevo con estas macros. Solamente tenemos que variar la macro del módulo, la correcta es esta:

Sub ordenar()
On Error Resume Next
For Each hoja In ActiveWorkbook.Sheets
For x = 4 To Sheets.Count
If UCase(Sheets(x).Name) > UCase(Sheets(x + 1).Name) Then
Sheets(x + 1).Move before:=Sheets(x)
End If
Next
Next
End Sub

no olvides finalizar la consulta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas