Sustitución de una hoja por otra ...

Estimado experto resulta ser que cuando genero por primera vez la hoja con la macro si me lo hace pero al volver a generarla obvio, ya existe y deseo sobrescribir la ya existente con la nueva, envío lo que tengo de código a ver si me puedes auxiliar, gracias de antemano por la atención.
NombreHoja = Range("A11").Value
    hoja_existe = False
    For i = 1 To Sheets.Count
        If Sheets(i).Name = NombreHoja Then
            hoja_existe = True
            Sheets("MENSUAL").Select
            Sheets("MENSUAL").Copy Before:=Sheets(1)
            Sheets("MENSUAL (2)").Select
            Sheets("MENSUAL (2)").Name = NombreHoja
            Application.CutCopyMode = False
            ActiveWorkbook.Save
            'MsgBox ("Hoja <" + NombreHoja + "> ya existente")
        End If
    Next
    If Not hoja_existe Then
        Sheets("MENSUAL").Select
        Sheets("MENSUAL").Copy Before:=Sheets(1)
        ActiveSheet.Name = "31DM0000BQNV4004"
        Cells.Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
        ActiveWorkbook.Save
    End If

1 respuesta

Respuesta
1
A ver si consigo adivinar lo que quieres hacer.
En el primer bucle estás buscando una página cuyo nombre está en A11 y, cuando la encuentras haces una copia de la página "Mensual" y renombras la copia con el nombre de A11. Problema: haces eso cuando la encuentras, por lo que siempre que ejecute ese código es porque existe la página y siempre dará error.
En el IF posterior hace que, si no se ha copiado en el primer bucle (que no puede funcionar), se copie la página "Mensual" en otra y que la renombre con un nombre fijo: "31DM0000BQNV4004".
Supongo que lo que quieres es hacer que se haga una copia de "MENSUAL" sobre una página cuyo nombre obtienes de la celda "A11". El código sería este:
Option Explicit
Sub copiarPaginaMensual()
    Dim NombreHoja As String
    Dim i As Integer
    NombreHoja = Sheets("hoja1").Cells(11, 1) ' Celda A11 de la página "hoja1"
    ' Buscamos para ver si existe ya la página
    For i = 1 To ThisWorkbook.Sheets.Count
        ' Comparamos los nombres en mayúsculas
        If UCase$(ThisWorkbook.Sheets(i).Name) = UCase$(NombreHoja) Then
            ' Existe la página. Tenemos que borrarla
            Application.DisplayAlerts = False
            ThisWorkbook.Sheets(i).Delete
            Application.DisplayAlerts = True
            Exit For
        End If
    Next i
    ' Hacemos la copia de la página Mensual y la renombramos (como lo tenías en el bucle de tu código)
    ThisWorkbook.Sheets("MENSUAL").Select
    ThisWorkbook.Sheets("MENSUAL").Copy Before:=Sheets(1)
    ' ThisWorkbook.Sheets("MENSUAL (2)").Select ' Esta línea no es necesaria porque ya está activa tras la copia
    ThisWorkbook.Sheets("MENSUAL (2)").Name = NombreHoja
    Application.CutCopyMode = False
    MsgBox "Página '" & NombreHoja & "' creada correctamente"
End Sub
Ok amigo experto, dejame explicarte porque me equivoque, perdón. Mira tengo un formulacio con botones de comando los cuales tienen como nombres A, B, C y DE, y tengo una hoja principal que se llama MENSUAL que es desde donde ejecuto la macro para que cargue el formulario, entonces si la ejecuto por el botón A, me genera lo que necesito y se agrega a mi libro la hoja A, pero como este reporte es MENSUAL, digamos que la hoja A ya existente tiene datos hasta el día 15 y si yo vuelvo a ejecutar la macro por el mismo concepto A, obvio ya existe una hoja con ese nombre, entonces lo que deseo hacer es que automáticamente me sustituya automáticamente el contenido de la hoja ya exisitente por el contenido de la nueva, dejándole el nombre a la hoja del concepto por el cual ejecuto la macro.
Mil gracias por tu ayuda y disculpa por volverte a molestar a ver si me puedes volver a apoyar.
Te reenvío nuevamente el código:
Dim NombreHoja As String
Dim i As Integer
 NombreHoja = Sheets("31DM0000BQNV4004") ' Celda A11 de la página "hoja1"
 ' ActiveSheet.Name = "31DM0000BQNV4004"
    ' Buscamos para ver si existe ya la página
    For i = 1 To ThisWorkbook.Sheets.Count
        ' Comparamos los nombres en mayúsculas
        If UCase$(ThisWorkbook.Sheets(i).Name) = UCase$(NombreHoja) Then
            ' Existe la página. Tenemos que borrarla
            Application.DisplayAlerts = False
            ThisWorkbook.Sheets(i).Delete
            Application.DisplayAlerts = True
            Exit For
        End If
    Next i
' Hacemos la copia de la página Mensual y la renombramos (como lo tenías en el bucle de tu código)
    ThisWorkbook.Sheets("MENSUAL").Select
    ThisWorkbook.Sheets("MENSUAL").Copy Before:=Sheets(1)
 '  ThisWorkbook.Sheets("MENSUAL (2)").Select ' Esta línea no es necesaria porque ya está activa tras la copia
    ThisWorkbook.Sheets("MENSUAL (2)").Name = NombreHoja
    Application.CutCopyMode = False
    MsgBox "Página '" & NombreHoja & "' creada correctamente"
    Generador_Principal.Hide
Primero disculpa por el retraso, pero he estado fuera.
Por lo que dices creo entender que el nombre de la hoja de destino depende del botón que hayas pulsado. Eso no sería problema siempre que declares un parámetro en el procedimiento que te puse.
En lugar de...
Sub copiarPaginaMensual()
    Dim NombreHoja As String
    Dim i As Integer
    NombreHoja = Sheets("hoja1"). Cells(11, 1) ' Celda A11 de la página "hoja1"
... tienes que poner...
Sub copiarPaginaMensual(ByVal NombreHoja as string)
    Dim i As Integer
De esta forma, en tu botón "A" pondrías: copiarPaginaMensual "A"
Y en el resto de botones con cambiar el nombre de la página de destino sería suficiente.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas