Macro Excel que borra el archivo actual guardando un dato en una tabla de otro archivo

Tengo una hoja con macros para hacer facturas. Tengo varios botones que hacen diversas funciones, he intentado crear uno nuevo para borrar el archivo actual y la secuencia es la siguiente: 1º guarda el dato de una celda en una tabla de otro libro y cierra dicho libro, 2º guarda el archivo con otro nombre y en otra ubicación, limpiando todas las celdas (para usarlo de comodín), 3º borra el archivo que me interesa y cierra excel.

El problema es que al pulsar el botón para que ejecute toda la secuencia, excel se bloquea y tengo que terminar el proceso.

Uso varios SUB que escribí para otros botones y que en ellos funcionan perfectamente, pero he podido comprobar que, por ejemplo el que me limpia de contenido la hoja, en el botón de borrar archivo no me fuciona bien. Voy a intentar detallarlo todo lo mejor posible porque sé que es un poco complejo.

Boton:

'Borra la factura actual y guarda el numero de dicha factura en un listado, 
'para usarlo en la siguiente factura nueva
Sub CommandButton1_Click()
    Nlibro = ActiveWorkbook.Name
    Call GUARDAR_NUM_FACTURA
    Call VACIAR
    Call GUARDAR_BORRAR
    Call BORRAR_LIBRO(Nlibro)
    Application.Quit
End Sub

Ahora detallo cada una de las llamadas que hago:

Sub GUARDAR_NUM_FACTURA()
    Application.ScreenUpdating = False
    FacturaUltima = Range("H5")
    'Abrir la lista y comprobar si la primera celda está vacía
    Set LibroRegistro = Workbooks.Open("C:\Users\Dani\Google Drive\OTROS\APP FACTURAS\FACTURAS PENDIENTES.xlsm")
    LibroRegistro.Activate
    'Si la celda está vacía, guardar el número ahi. Si no está vacía, pasar a la siguiente celda y volver a comprobar
    Call PRIMERA_VACIA
    ActiveCell.Value = FacturaUltima
    LibroRegistro.Save
    LibroRegistro.Close
    Set LibroRegistro = Nothing
    Application.ScreenUpdating = True
End Sub

Sub PRIMERA_VACIA()
    If Range("A2").Value = Empty Then
        Range("A2").Select
    Else
        ActiveSheet.Range("A1").End(xlDown).Offset(1, 0).Select
    End If
End Sub

Este "Sub VACIAR" lo uso con otro botón y funciona perfectamente, hace lo que tiene que hacer, pero con este otro botón el excel se queda pillado antes de que termine la secuencia de borrar:

Sub VACIAR()
    Hoja1.CheckBox1.Value = False
    Hoja1.CheckBox2.Value = False
    Range("K7:N8").Select
    Selection.ClearContents
    Range("E9:N14").Select
    Selection.ClearContents
    Range("A7").Value = "Número"
    Range("D7").Value = "Nombre"
    Range("N6").Value = "0"
    Range("A9").Value = "MES"
    Range("L5").Value = Empty
    Range("A11").Value = Empty
    Range("A13").Value = Empty
    Range("E9").Select
End Sub

Sub GUARDAR_BORRAR()
    'Application.DisplayAlerts = False
    ruta = "C:\Users\Dani\Google Drive\OTROS\APP FACTURAS\"
    ActiveWorkbook.SaveAs Filename:=ruta & "BORRAR.xlsm", FileFormat:=52
    'Application.DisplayAlerts = True
End Sub

Sub BORRAR_LIBRO(Nlibro)
    Kill ("C:\Users\Dani\Google Drive\FACTURAS\" & Nlibro)
End Sub

Los Sub GUARDAR_BORRAR y BORRAR_LIBRO los uso en procesos de otros botones y funcionan perfectamente.

El único que he creado para este botoón es el Sub GUARDAR_NUM_FACTURA. El fallo tiene que estar en este o en la secuencia del botón (son los dos primeros cuadros de código). O quizas en el planteamiento. Ya que tanto el VACIAR, PRIMERA_VACIA, GUARDAR_BORRAR y BORRAR_LIBRO los uso para otros cometidos en la misma hoja y funcionan bien.

Se que puede resultar algo complejo de entender, pero si teneis alguna solución os lo agradecería.

1 respuesta

Respuesta
1

Has puesto con comentario (lo que significa que ya no se ejecuta esto)

Application.DisplayAlerts = False

lo que me hace pensar, que Excel podría necesitar tu confirmación para algo, pero al haber desconectado el screenUpdating ya no lo ves...

Prueba primero lo siguiente:

Apaga el la desconexión del screenUpdating... pone comentario a esas líneas

No apague el displayalerts... quítale el comentario a esas líneas

Ejecuta tu macro... si hay fallas ve a la macro del CommandButton y ejecutala línea a lina con la tecla F8... al estar todo visible iras viendo como van las cosas y te dará cuenta en que lugar exactamente se genera el error

Además en ese modo de ejecución puedes mostrar en la interfaz de vba la ventana "Locales" y ver como se va modificando el valor de tus variables

Prueba y comenta como te fue.

¡Gracias!

No se me había ocurrido hacerlo paso a paso. Estaba tan seguro de que nada interferiría que ni lo pensé. El caso es que había algunas líneas de código que interferían en el proceso (aún sigo sin saber por qué).

Private Sub Worksheet_Change(ByVal Target As Range)
    'Nombre en mayúsculas y cambia a la celda de Mes de cobro
    If Target.Address = "$D$7" Then
        Range("D7").Value = UCase(Range("D7").Value)
        Target.Offset(2, -1).Select
    End If
   'Numero de documento en mayúsculas
    If Target.Address = "$A$7" Then
        Range("A7").Value = UCase(Range("A7").Value)
    End If
    'Numero de documento en mayúsculas - EMPRESA Datos del viajero
    If Target.Address = "$J$3" Then
        Range("J3").Value = UCase(Range("J3").Value)
    End If
    'Nombre en mayúsculas - EMPRESA Datos del viajero
    If Target.Address = "$H$3" Then
        Range("H3").Value = UCase(Range("H3").Value)
    End If
End Sub

Pero añandiendo una condición a los dos primeros IF y poniendo EXIT SUB antes de cerrar cada IF, se ha arreglado. El cuadro anterior quedaría así:

Private Sub Worksheet_Change(ByVal Target As Range)
    'Nombre en mayúsculas y cambia a la celda de Mes de cobro
    If Target.Address = "$D$7" And Range("D7").Value <> "NOMBRE" Then
        Range("D7").Value = UCase(Range("D7").Value)
        Target.Offset(2, -1).Select
        Exit Sub
    End If
   'Numero de documento en mayúsculas
    If Target.Address = "$A$7" And Range("A7").Value <> "NÚMERO" Then
        Range("A7").Value = UCase(Range("A7").Value)
        Exit Sub
    End If
    'Numero de documento en mayúsculas - EMPRESA Datos del viajero
    If Target.Address = "$J$3" Then
        Range("J3").Value = UCase(Range("J3").Value)
        Exit Sub
    End If
    'Nombre en mayúsculas - EMPRESA Datos del viajero
    If Target.Address = "$H$3" Then
        Range("H3").Value = UCase(Range("H3").Value)
        Exit Sub
    End If
End Sub

De esta manera funciona. Seguiré dándole vueltas en los próximos días, probando distintos sucesos, para ver que tal se comporta el código. Si todo va bien, cerraré la pregunta.

Saludos y gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas