Crear Hojas nuevas a partir de condicion

Su ayuda tengo un problema con un VBA, aun soy novato en este tema pero estoy intentando crear una macro que haga lo siguiente:

-La Macro que tengo creada en el archivo "Bitácora" abre un archivo llamado "Reporte" que Siempre va a tener un numero en la celda "D5",

-La idea es que a partir de este número la Macro haga lo siguiente:

-Si el numero de hoja no existe que cree una hoja en el libro Bitácora con el número que esta en la celda "D5" y copie la información del Rango ("O42:O99") a la hoja nueva creada.

-Si la hoja con el número que esta en la celda "D5" ya existe que copie la información del Rango ("O42:O99") a la hoja ya creada.

Hasta ahora solo he podido hacer que la Macro abra el archivo automáticamente y que a partir de un solo numero cree la nueva hoja con el número que necesito.

No se cual es el bucle que debería usar.

Por favor su ayuda.

Gracias.

Sub Copiar_informacion_adjuntos()

Application.ScreenUpdating = False 'al principio del proceso para no ver nada en la pantalla

Dim Reporte, Bitacora As Workbook

Set Reporte = Workbooks.Open("C:\Reporte.xls") 'la ruta que obtiene la informacion
Sheets.Add After:=Sheets("1") 'Para añadir una hoja despues de hoja 1
ActiveSheet.Name = "67049"
Set Bitacora = ThisWorkbook

'copiar los datos en el nuevo libro
' Bitacora.Sheets("67049").Range("A1:A58") = _
' Reporte.Sheets(1).Range("O42:O99").Value

Reporte.Close False ' False es para no guardar los cambios
Bitacora.Save 'Guardar auto Bitacora.

End Sub

1 Respuesta

Respuesta
3

H o l a : Tengo algunas dudas.

Déjame resumir lo que entendí:

1. En el libro "Bitácora" tienes la macro.

2. La macro abre el libro "Reporte"

3. En el libro "Reporte", en la primera hoja, en la celda D5 hay un número.

4. La macro debe tomar ese número, y en el libro "Bitácora" debe buscar una hoja con el nombre de dicho número, ¿es correcto?

5. Si no encuentra la hoja, crea una nueva hoja en el libro "Bitácora"

6. Copia del libro "Reporte", de la hoja 1, el rango "O42:O99"

7. Y lo pega en el libro "Bitácora" en la hoja (número), a partir de la celda "A1". ¿Es correcto? ¿El pegado es solamente valores?


Lo que tampoco entiendo es, a qué te refieres con "No se cual es el bucle que debería usar". ¿Quieres qué el proceso se repita varias veces? ¿Y con cuáles datos se deberá repetir?

E spero tus comentatios.

Hola Dante, 

Gracias por tu respuesta, voy a responderte cada pregunta para que sea mas fácil la comunicación para los dos.

1. En el libro "Bitácora" tienes la macro. (Si)

2. La macro abre el libro "Reporte". (Si) 

3. En el libro "Reporte", en la primera hoja, en la celda D5 hay un número. (En el libro Reporte solo tiene una hoja y el la celda D5 hay un numero, el cual va a cambiar siempre ya que ese archivo Reporte se actualiza varias veces)

4. La macro debe tomar ese número, y en el libro "Bitácora" debe buscar una hoja con el nombre de dicho número, ¿es correcto? (Si)

5. Si no encuentra la hoja, crea una nueva hoja en el libro "Bitácora" (Si crea una nueva hoja en el libro bitacora con el numero que esta en la celda D5 de Reporte.

6. Copia del libro "Reporte", de la hoja 1, el rango "O42:O99" (SI)

7. Y lo pega en el libro "Bitácora" en la hoja (número), a partir de la celda "A1". ¿Es correcto? ¿El pegado es solamente valores? (El Pegado son Números y también letras)

El proceso se debe repetir cada vez que se abre el libro

Muchas gracias por tu ayuda, estoy trabajando en buscar una solución pero aun soy nuevo en el uso de VBA.

Espero tu respuesta.

Te anexo la macro. Para que la macro se ejecute cada vez que abres el libro "bitácora", deberás poner la macro en los eventos de thisworkbook

Private Sub Workbook_Open()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Set l1 = ThisWorkbook
    ruta = "C:\"
    ruta = "C:\trabajo\"
    arch = "reporte.xls"
    If Dir(ruta & arch) = "" Then
        MsgBox "El archivo no Reporte no existe en la ruta", vbCritical
        Exit Sub
    End If
    '
    Set l2 = Workbooks.Open(ruta & arch)
    Set h2 = l2.Sheets(1)
    num = h2.Range("D5").Text
    If num = "" Then
        MsgBox "La celda D5 no contiene datos", vbExclamation
        l2.Close False
        Exit Sub
    End If
    '
    existe = False
    For Each h In l1.Sheets
        If h.Name = num Then
            existe = True
            Set h1 = h
            Exit For
        End If
    Next
    '
    If existe = False Then
        l1.Sheets.Add after:=l1.Sheets(l1.Sheets.Count)
        Set h1 = ActiveSheet
        h1.Name = num
    End If
    '
    h2.Range("O42:O99").Copy h1.Range("A1")
    l2.Close False
    l1.Save
    MsgBox "Copia realizada", vbInformation
End Sub

Instrucciones para poner la macro en los eventos ThisWorkbook

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a ThisWorkbook
  4. En el panel del lado derecho copia la macro
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Estimado Dante,

Me has ayudado mucho, pero tengo un inconveniente con el código que me enviaste:

Tengo creada la primera hoja del libro con un indice de las hojas que contiene el libro, el inconveniente que tengo es que crea la nueva hoja de trabajo pero copia los datos del rango seleccionado en la hoja del indice.

Además cambie las rutas porque los dos archivos están en la misma dirección,

Por favor tu ayuda.

Gracias.


Application.ScreenUpdating = False
Set l1 = ThisWorkbook
ruta = "C:\syncplicity\z003bpca\Documents\Bitacora"
ruta = "C:\syncplicity\z003bpca\Documents\Bitacora"
arch = "copy_Reporte.xls"
If Dir(ruta & arch) = "" Then
MsgBox "El archivo no Reporte no existe en la ruta", vbCritical
Exit Sub
End If
'
Set l2 = Workbooks.Open(ruta & arch)
Set h2 = l2.Sheets(1)
num = h2.Range("D5").Text
If num = "" Then
MsgBox "La celda D5 no contiene datos", vbExclamation
l2.Close False
Exit Sub
End If
'
existe = False
For Each h In l1.Sheets
If h.Name = num Then
existe = True
Set h1 = h
Exit For
End If
Next
'
If existe = False Then
l1.Sheets.Add after:=l1.Sheets(l1.Sheets.Count)
Set h1 = ActiveSheet
h1.Name = num
End If
'
h2.Range("O42:O99").Copy h1.Range("A1")
l2.Close False
l1.Save
MsgBox "Copia realizada", vbInformation
End Sub 

Yo te hice esta pregunta:

3. En el libro "Reporte", en la primera hoja, en la celda D5 hay un número.

Y esta fue tu respuesta:

(En el libro Reporte solo tiene una hoja y el la celda D5 hay un numero, el cual va a cambiar siempre ya que ese archivo Reporte se actualiza varias veces)

Para corregir la macro, puedes hacer lo siguiente. Si la hoja es la número 2, entonces cambia esta línea:

Set h2 = l2.Sheets(1)

Por esta:

Set h2 = l2.Sheets(2)

Si no sabes cuál es el número de la hoja, entonces pon el nombre de la hoja, por ejemplo:

Set h2 = l2.Sheets("Hoja1")


sal u dos

Hola Dante,

Muchas gracias por tu ayuda, cambie lo que me dijiste, y copie todos los archivos en una carpeta en el escritorio (Es decir los dos archivos Bitácora y Reporte Dentro de la misma carpeta).

No se si tal vez el error es que en la celda "D5" de reporte adelante del numero tiene muchos ceros ejm: "00000004335" y el formato de la celda es "general".

Y cambie la ruta en la macro pero la dirección especificada, y me aparece el error que el archivo Reporte no existe .No se cual pueda ser el error.

También te quería pedir si me puedes ayudar, que cuando copie en una hoja que ya existe la copie en la celda siguiente a la que ya esta con información.

De antemano muchas gracias.

Sub Copiar_informacion_adjuntos()
    Application.ScreenUpdating = False
    Set l1 = ThisWorkbook
    ruta = "C:\Users\z003bpca\Desktop\Bitacora"
    arch = "copy_Reporte.xls"
    If Dir(ruta & arch) = "" Then
        MsgBox "El archivo Reporte no existe en la ruta", vbCritical
        Exit Sub
    End If
    '
    Set l2 = Workbooks.Open(ruta & arch)
    Set h2 = l2.Sheets("Sheet0")
    num = h2.Range("D5").Text
    If num = "" Then
        MsgBox "La celda D5 no contiene datos", vbExclamation
        l2.Close False
        Exit Sub
    End If
    '
    existe = False
    For Each h In l1.Sheets
        If h.Name = num Then
            existe = True
            Set h1 = h
            Exit For
        End If
    Next
    '
    If existe = False Then
        l1.Sheets.Add after:=l1.Sheets(l1.Sheets.Count)
        Set h1 = ActiveSheet
        h1.Name = num
    End If
    '
    h2.Range("O42:O99").Copy h1.Range("A1")
    l2.Close False
    l1.Save
    MsgBox "Copia realizada", vbInformation
End Sub

En esta línea te falta la diagonal al final:

ruta = "C:\Users\z003bpca\Desktop\Bitacora"

así:

ruta = "C:\Users\z003bpca\Desktop\Bitacora\"

Revisa que las carpetas estén bien escritas, que no le falten espacios o acentos, etc.

Revisa que el nombre del archivo sea el correcto.

Si los 2 archivos están en la misma carpeta, entonces también puedes utilizar esto:

ruta = thisworkbook.path & "\"

Si te aparece un error, debes decirme exactamente qué dice el error y en qué línea de la macro se detiene.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas