En VBA Excel. Si cancelas el dialogo Guardar como: salir de la macro sin error

Esta macro guarda bien pero si cancelo el cuadro dialogo Guardar como: me dice que el libro se guardo, ¿Cómo qué se guardo si cancele?.

Otra cosa es que en el libro origen, si cancelo el dialogo, queda la selección en la hoja origen, (la de los puntitos), no ocurre si guardo. Le agregue la línea; Application.CutCopyMode = False para evitar lo anterior. No se si esta bien colocada

Que si cancelo el cuadro dialogo Guardar como: no guarde y me diga; MsgBox "Usted cancelo el proceso de guardado" y salga de la macro.

Private Sub cbtCopia_Nuevo_Click()
'Por.Dante Amor
Application.ScreenUpdating = False
    Set hc = HojaProdct 'Se establece la variable hc como la hoja origen
    Set l1 = Workbooks.Add 'Se crea un nuevo libro y a la vez se establece el nuevo libro en la variable l1
    Set h1 = l1.ActiveSheet 'Se establece la nueva hoja del libro nuevo en la variable h1
    c = lista.ColumnCount 'Cuenta la cantidad columnas del ListBox
    f = lista.ListCount 'cuenta el número de lineas del ListBox
    hc.Rows(1).Copy h1.Range("A1") 'Se copia la fila 1 de la hoja origen a la nueva hoja empezando en la celda A1
    hc.Columns("A:G").Copy ''Copia las columnas. Para poner el mismo ancho de columnas:
    h1.Range("A1").PasteSpecial Paste:=xlFormats 'Las pega pero con formato especial sólo formatos
'Recibe el rango de celdas el contenido del listbox, pero le resta 2 columnas para evitar el error _
#N/A, una por la columna que hace falta y otra por la fecha, ya que la fecha se pasa en otro momento.
    h1.Range(h1.Cells(2, 1), h1.Cells(f + 1, c - 2)) = lista.List
'Para poner el formato de fecha utilizo la siguiente instrucción para cada fecha que tienes almacenada en el listbox
    For i = 0 To lista.ListCount - 1
        h1.Cells(i + 2, "G") = Format(lista.List(i, 6), "mm/dd/yyyy")
    Next
'Las fechas están en la columna 6 del listbox y se pasan a la columna "G"
    Application.DisplayAlerts = False 'Para que solo pregunte 1 vez si  quier oreemplazar el existente
    With Application.FileDialog(msoFileDialogSaveAs)
        .Title = "Exportar Archivo a Nuevo Excel"
        .AllowMultiSelect = False
        .FilterIndex = 1
        If .Show Then
            march = .SelectedItems(1)
    Range("A2").Select 'quitar a seleccion
            h1.SaveAs Filename:=march, _
            FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        End If
    Application.CutCopyMode = False 'PARA QUE NO QUEDE SELECION EN LA HOJA ORIGEN CUANDO CANCELAS EL CUADOR DIALOGO GUARDAR COMO:
    End With
    l1.Close 'Cierra el nuevo libro
    Application.ScreenUpdating = True
    MsgBox "Nuevo Libro Creado"
    Unload Me
End Sub

1 respuesta

Respuesta
2

Quedaría así:

Private Sub cbtCopia_Nuevo_Click()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Set hc = HojaProdct 'Se establece la variable hc como la hoja origen
    Set l1 = Workbooks.Add 'Se crea un nuevo libro y a la vez se establece el nuevo libro en la variable l1
    Set h1 = l1.ActiveSheet 'Se establece la nueva hoja del libro nuevo en la variable h1
    '
    c = lista.ColumnCount 'Cuenta la cantidad columnas del ListBox
    f = lista.ListCount 'cuenta el número de lineas del ListBox
    hc.Rows(1).Copy h1.Range("A1") 'Se copia la fila 1 de la hoja origen a la nueva hoja empezando en la celda A1
    hc.Columns("A:G").Copy ''Copia las columnas. Para poner el mismo ancho de columnas:
    h1.Range("A1").PasteSpecial Paste:=xlFormats 'Las pega pero con formato especial sólo formatos
    '
    'Recibe el rango de celdas el contenido del listbox, pero le resta 2 columnas para evitar el error _
    #N/A, una por la columna que hace falta y otra por la fecha, ya que la fecha se pasa en otro momento.
    '
    h1.Range(h1.Cells(2, 1), h1.Cells(f + 1, c - 2)) = lista.List
    '
    'Para poner el formato de fecha utilizo la siguiente instrucción para cada fecha que tienes almacenada en el listbox
    '
    For i = 0 To lista.ListCount - 1
        h1.Cells(i + 2, "G") = Format(lista.List(i, 6), "mm/dd/yyyy")
    Next
    '
    'Las fechas están en la columna 6 del listbox y se pasan a la columna "G"
    Application.DisplayAlerts = False 'Para que solo pregunte 1 vez si  quier oreemplazar el existente
    cancelar = False
    With Application.FileDialog(msoFileDialogSaveAs)
        .Title = "Exportar Archivo a Nuevo Excel"
        .AllowMultiSelect = False
        .FilterIndex = 1
        If .Show Then
            march = .SelectedItems(1)
            Range("A2").Select 'quitar a seleccion
            h1.SaveAs Filename:=march, _
            FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        Else
            cancelar = True
        End If
        Application.CutCopyMode = False 'PARA QUE NO QUEDE SELECION EN LA HOJA ORIGEN CUANDO CANCELAS EL CUADOR DIALOGO GUARDAR COMO:
    End With
    l1.Close 'Cierra el nuevo libro
    Application.ScreenUpdating = True
    If cancelar Then
        MsgBox "Proceso cancelado"
    Else
        MsgBox "Nuevo Libro Creado"
    End If
    Unload Me
End Sub

s   a l u d o s 

Hola Dante, buen día

Probé l enmienda y me sigue diciendo que guardo el libro aunque cancele el cuadro dialogo.

Si efectivamente guardo, me dice "Nuevo Libro Creado", si cancelo el dialogo también dice "Nuevo Libro Creado"


                    

Pero tienes que copiar toda la macro.

Si cancelas, la variable Cancelar toma el valor True

Después si la variable es True entonces el mensaje es "Proceso cancelado".

No puedes tener el mismo mensaje, revisa bien el código, revisa que hayas puesto todas las nuevas instrucciones. O copia todo el código.

2ª Prueba con la macro tal como la dejas, completa

ESTA imagen acabada de crear al cancelar el dialogo

Puedes observar que me dice que lo creó, no me dice cancelado el proceso.

Gracias Dante

Envíame tu archivo con mi macro actualizada

Como bien sabes, pruebo el código antes de enviarlo, pero de lo que no estoy seguro es que pongan el código tal cual yo lo envié. Por eso te pido que me envíes tu archivo con mi código.

H o l a:

Tienes un procedimiento que se llama "cancelar", es el mismo nombre de mi variable, entonces está reiniciando el valor de la variable. Cómo voy a saber que tienes un botón que utilizar para "salir", que normalmente se llama CommandButton, le pusiste el nombre de "cancelar"

Private Sub cancelar_Click()
    Unload Me
End Sub

Cambia la macro por esta, ya le cambié el nombre de mi variable a "wcancelar"

Private Sub cbtCopia_Nuevo_Click()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Set hc = HojaProd 'Se establece la variable hc como la hoja origen
    Set l1 = Workbooks.Add 'Se crea un nuevo libro y a la vez se establece el nuevo libro en la variable l1
    Set h1 = l1.ActiveSheet 'Se establece la nueva hoja del libro nuevo en la variable h1
    '
    c = lista.ColumnCount 'Cuenta la cantidad columnas del ListBox
    f = lista.ListCount 'cuenta el número de lineas del ListBox
    hc.Rows(1).Copy h1.Range("A1") 'Se copia la fila 1 de la hoja origen a la nueva hoja empezando en la celda A1
    hc.Columns("A:G").Copy ''Copia las columnas. Para poner el mismo ancho de columnas:
    h1.Range("A1").PasteSpecial Paste:=xlFormats 'Las pega pero con formato especial sólo formatos
    '
    'Recibe el rango de celdas el contenido del listbox, pero le resta 2 columnas para evitar el error _
    #N/A, una por la columna que hace falta y otra por la fecha, ya que la fecha se pasa en otro momento.
    '
    h1.Range(h1.Cells(2, 1), h1.Cells(f + 1, c - 2)) = lista.List
    '
    'Para poner el formato de fecha utilizo la siguiente instrucción para cada fecha que tienes almacenada en el listbox
    '
    For i = 0 To lista.ListCount - 1
        h1.Cells(i + 2, "G") = Format(lista.List(i, 6), "mm/dd/yyyy")
    Next
    '
    'Las fechas están en la columna 6 del listbox y se pasan a la columna "G"
    Application.DisplayAlerts = False 'Para que solo pregunte 1 vez si  quier oreemplazar el existente
    wcancelar = False
    With Application.FileDialog(msoFileDialogSaveAs)
        .Title = "Exportar Archivo a Nuevo Excel"
        .AllowMultiSelect = False
        .FilterIndex = 1
        If .Show Then
            march = .SelectedItems(1)
            Range("A2").Select 'quitar a seleccion
            h1.SaveAs Filename:=march, _
            FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        Else
            wcancelar = True
        End If
        Application.CutCopyMode = False 'PARA QUE NO QUEDE SELECION EN LA HOJA ORIGEN CUANDO CANCELAS EL CUADOR DIALOGO GUARDAR COMO:
    End With
    l1.Close 'Cierra el nuevo libro
    Application.ScreenUpdating = True
    If wcancelar Then
        MsgBox "Proceso cancelado"
    Else
        MsgBox "Nuevo Libro Creado"
    End If
    Unload Me
End Sub

s a l u d  o s

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas