MAcro para salir de formulario

Espero me puedan ayudar con la siguiente macro la cual esta en un boton de un formulario; esta macro ordena una base de datos y despues sale del formulario pero cuando no ingreso nada a la base de datos al correr la macro me da error, que podria odificar para que me funcione aunque no ingrese ningun dato en la base

La macro es la siguiente

Private Sub CommandButton2_Click()
Range("PROVEEDORES[#All]").Select
    ActiveWorkbook.Worksheets("BASE DATOS PROVEEDORES").ListObjects("PROVEEDORES"). _
        Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("BASE DATOS PROVEEDORES").ListObjects("PROVEEDORES"). _
        Sort.SortFields.Add Key:=Range( _
        "PROVEEDORES[[#All],[PROVEEDOR/PROFESIONALES]]"), SortOn:=xlSortOnValues, _
        Order:=xlAscending, DataOption:=xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("BASE DATOS PROVEEDORES").ListObjects( _
        "PROVEEDORES").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Sheets("BASE DATOS PROVEEDORES").Visible = False
    Sheets("COMPRAS").Select
    UserForm1.Hide
Application.ScreenUpdating = True
End Sub

1 respuesta

Respuesta
1

Si la base no tiene datos hay que evitar que se ordene.

Entonces como primer instrucción evalua si la primer celda esta vacía o no.

Imaginemos que tu tabla tiene títulos en fila 1 y datos a partir de A2 entonces sería:

Private Sub CommandButton2_Click()
Range("PROVEEDORES[#All]").Select
If [A2] = "" then exit sub
'sigue con el proceso de orden

Reemplaza A2 por la celda que corresponda.

Elsa Matilde probé tu respuesta pero me sale un error y me marca con amarillo la primera línea de la macro, ¿sera por qué la base de datos esta en una hoja diferente de donde se inicia mi formulario?

Range("PROVEEDORES[#All]").Select

Si, colocale el nombre de la hoja, por ej:

If Sheets("Hojax").range("A2") = "" then exit sub

El rango escrito así o como te lo envié antes debe indicar la primer celda con datos de la tabla.

Hay otras maneras de saber si la tabla está vacía, como ubicar el fin de rango o contar cuántas celdas tiene la tabla... pero esta es la más segura.

Sdos!

Me sigue dando error, no se si me este saltando algun comando, recien estoy aprendiendo algo sobre macros, ahora esta asi la macro aunque tratando de comprender la linea que añadi da a entender que si el rango A2 esta vacio deberia salir, pero ese rango no esta vacio, vale aclarar que la tabla siempre se estaria agregando nuevos proveedores y por eso no sabria como se podria ubicar el fin del rango o saber cuantas celdas tendra la tabla 

Private Sub CommandButton2_Click()
If Sheets("BASE DATOS PROVEEDORES").Range("A2") = "" Then Exit Sub
'sigue con el proceso de orden
Range("PROVEEDORES[#All]").Select
    ActiveWorkbook.Worksheets("BASE DATOS PROVEEDORES").ListObjects("PROVEEDORES"). _
        Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("BASE DATOS PROVEEDORES").ListObjects("PROVEEDORES"). _
        Sort.SortFields.Add Key:=Range( _
        "PROVEEDORES[[#All],[PROVEEDOR/PROFESIONALES]]"), SortOn:=xlSortOnValues, _
        Order:=xlAscending, DataOption:=xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("BASE DATOS PROVEEDORES").ListObjects( _
        "PROVEEDORES").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Sheets("BASE DATOS PROVEEDORES").Visible = False
    Sheets("COMPRAS").Select
    UserForm1.Hide
Application.ScreenUpdating = True
End Sub

Enviame por favor tu hoja con la base (o parte de ella), Mis correos aparecen en el sitio que dejo al pie,.

Ya te envíe el archivo al correo

El problema no estaba solo con una tabla vacía. La tuya tiene datos pero al estar oculta no puede ordenarla.

Le agregué un par de líneas.

Private Sub CommandButton2_Click()
'ajustado x Elsamatilde
'si no hay datos en la tabla no ordena
If Sheets("BASE DATOS PROVEEDORES").Range("A2") = "" Then Exit Sub
'muestra y activa la hoja-la primer instrucción la hará invisible al usuario
Application.ScreenUpdating = False
Sheets("BASE DATOS PROVEEDORES").Visible = True
Sheets("BASE DATOS PROVEEDORES").Select
'--------------

También revisa las instrucciones donde comento como EM: 

Muchas gracias por tus comentarios, lo probé y ahí si funciona, solo una duda sobre el ocultar o cerrar el useform, me podrías indicar cual seria la diferencia ya que para mi seria lo mismo, y si quisiera cerrarlo como podría poner para que cierre el useform y no lo oculte

Muchas gracias por tu ayuda nuevamente

Con 'Hide' el formulario solo se oculta... quedando en memoria con todos los datos en sus controles. Si lo volvieras a mostrar (con Show) te aparecerá tal como estaba al momento de ejecutar la instrucción Hide. Es decir que al instruir Show no se ejecuta todo lo que puedas tener en el evento Initialize del formulario.

Para cerrarlo debes utilizar: Unload Me... o si lo cerraras estando ya en otro formulario sería Unload Userform1.

Sdos y no olvides valorar la respuesta para darla por cerrada.

Elsa

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas