Como eliminar registro de un combobox con una condición en excel VBA

Estoy haciendo un formulario con excel en VBA; dentro de un formulario de recibos, tengo un Combobox el cual me carga todas las facturas de un determinado cliente, al yo guardar, las facturas que he registrado allí, se deben cancelar, (eso ya lo programe), pero necesito que cuando vuelva a cargar este formulario no me vuelvan a aparecen las facturas que ya cancele anteriormente. Es decir, que si tenia las facturas 1525, 1527 y 1528, y cancelé la 1525 y 1528, cuando vuelva a ingresar donde el mismo cliente, solo me cargue la factura 1527.

1 Respuesta

Respuesta
1

No necesitas eliminarlo solo filtrar los cancelados al cargar la macro cehca este ejemplo, tengo 4 facturas canceladas y estas no serán cargadas en el combobox, prueba la macro copiandola en el modulo del formulario y esta es la macro

Private Sub UserForm_Initialize()
Set datos = Range("a1").CurrentRegion
With datos
    filas = .Rows.Count: columnas = .Columns.Count
    .Sort key1:=Range(.Columns(columnas).Address), order1:=xlAscending, Header:=xlYes
    cuenta = WorksheetFunction.CountIf(.Columns(columnas), "cancelada")
    fila = WorksheetFunction.Match("cancelada", .Columns(columnas), 0)
    Set facturavig = .Rows(fila + cuenta).Resize(filas - cuenta - 1)
End With
With facturavig
    .Sort key1:=Range(.Columns(1).Address), order1:=xlAscending, Header:=xlNo
    ComboBox1.RowSource = facturavig.Address
End With
Set facturavig = Nothing:   Set datos = Nothing
End Sub

Buenos días señor Bond, te agradezco por la ayuda que me has brindado, te informo que coloque el código en el evento Initialize, reemplace datos como el rango, el nombre del combobox, cree las  variables, pero me saca muchos errores en los with, entonces no se cual sera el error que lo genera. No se si definí mal las variables, para que me puedas decir que puedo hacer.

muchas gracias...

Cuando dices que te saca muchos errores hace falta ser más especifico ¿qué errores te marca? Y la otra como no pusiste una imagen de como esta estructurada tu información la macro la hice con información inventada así que por fuerza te iba a dar errores era solo un ejemplo para que adaptaras la macro a tu información. Así que por favor sube ambas cosas que mencione para ver que genera el error.

Hola de nuevo Sr Bond, la verdad si, tienes toda la razón, disculpame por no haber sido mas especifico en lo que quiero, aunque en algun momento pensé colocar un pantallazo para mostrarte mejor.... pero ya lo tengo...

Como puedes ver, tengo un combobox que se llama, cmbcliente que tiene el nombre de cada cliente, y cada vez que elijo uno, se me cargan las facturas del cliente seleccionado.

En este formulario hay un botón guardar, que me coloca a las facturas registradas como "CANCELADA", pero como te lo expuse antes, necesito que cuando vuelva a abrir el formulario me cargue las facturas que no haya cancelado; vos me dijiste que las filtrara, pero aun no se como hacerlo.

No se si con este pantallazo hay forma de que me puedas decir como programo para filtrar solo las no canceladas.

Te agradezco la colaboración para este problemita que tengo...

MUCHAS GRACIAS.

Falta un dato muy importante la pantalla de tu información, la requiero para saber de que columna se va a extraer el numero de la factura

Claro que si, esta es la pantalla de la información. Nuevamente muchas gracias...

Este es un ejemplo de como lo hace la macro, en la pantalla puedes ver cuantas canceladas tiene Aeromexico y como no se cargan en el combobox2 al seleccionar el cliente.

Private Sub ComboBox1_Change()
Set clientes = Range("CLIENTES")
CLIENTE = ComboBox1.Value
With clientes
    CUENTA = WorksheetFunction.CountIf(.Columns(1), CLIENTE)
    FILA = WorksheetFunction.Match(CLIENTE, .Columns(1), 0)
    Set FACTURA = .Rows(FILA).Resize(CUENTA)
    FACTURA.Select
    ComboBox2.Clear
    For I = 1 To FACTURA.Rows.Count
        NFACTURA = FACTURA.Cells(I, 3)
        If WorksheetFunction.IsText(NFACTURA) = False Then
            ComboBox2.AddItem NFACTURA
        End If
    Next I
End With
Set clientes = Nothing: Set facturas = Nothing
End Sub
Private Sub UserForm_Click()
End Sub
Private Sub UserForm_Initialize()
Dim UNICOS As New Collection
Set datos = Range("B1").CurrentRegion
With datos
    F = .Rows.Count
    .Sort KEY1:=Range(.Columns(1).Address), ORDER1:=xlAscending, Header:=xlYes
    For I = 2 To F
        CLIENTE = .Cells(I, 1)
        On Error Resume Next
            UNICOS.Add CLIENTE, CStr(CLIENTE)
            If Err.Number = 0 Then ComboBox1.AddItem CLIENTE
        On Error GoTo 0
    Next I
    ComboBox1.ListIndex = 0
    .Name = "CLIENTES"
End With
Set datos = Nothing
End Sub

Buenas tardes Sr. Bond.

Que pena la molestia pero me sigue sacando errores, reemplace datos como el nombre del combobox, cree las  variables, pero me saca errores en los with, por ejemplo, este mensaje me sale cuando voy a cargar el formulario

yo, definí las variables tanto en el evento Initiliaze como en el combobox1 que es donde esta el cliente, te muestro las variables para saber si están mal definidas o que..

Y estas son las variables en el evento change del combobox del cliente.

Me gustaría que las mires bien por favor y me digas que otra cosa tengo mal en la programación, para poder organizar, ya que debo terminar pronto este formulario.

Mil gracias por tu ayuda...

Tienes mal definidas las variables los que son numéricos o de texto los definiste como range o worksheets por eso te error, tienes un doble cargado de información en los clientes ya te marque que línea debes quitar, es tu decisión hacerlo, solo compara la macro que te envío con la que tu modificaste y te darás cuenta de donde están los errores

Private Sub CMBCLIENTE_Change()
Dim CLIENTES, FACTURA As Range
Dim CUENTA, NFACTURA, FILA As Integer
Dim CLIENTE As String
Dim FACTURAS As String
Dim I As Integer
Set CLIENTES = Range("CLIENTES")
CLIENTE = CMBCLIENTE.Value
With CLIENTES
    CUENTA = WorksheetFunction.CountIf(.Columns(1), CLIENTE)
    FILA = WorksheetFunction.Match(CLIENTE, .Columns(1), 0)
    Set FACTURA = .Rows(FILA).Resize(CUENTA)
    FACTURA.Select
    TXTFACT1.Clear
    For I = 1 To FACTURA.Rows.Count
        NFACTURA = FACTURA.Cells(I, 3)
        If WorksheetFunction.IsText(NFACTURA) = False Then
            TXTFACT1.AddItem NFACTURA
        End If
    Next I
End With
Set CLIENTES = Nothing: Set FACTURA = Nothing
End Sub
Private Sub UserForm_Initialize()
'CMBCLIENTE.RowSource = "NAME1" 'ESTA LINEA NO SE OCUPA
Sheets("FACTURAS").Select
Dim UNICOS As New Collection
Dim DATOS As Range
Dim F As Integer
Dim I As Integer
Dim CLIENTE As String
Set DATOS = Range("B1").CurrentRegion
With DATOS
    F = .Rows.Count
    .Sort KEY1:=Range(.Columns(1).Address), ORDER1:=xlAscending, Header:=xlYes
    For I = 2 To F
        CLIENTE = .Cells(I, 1)
        On Error Resume Next
            UNICOS.Add CLIENTE, CStr(CLIENTE)
            If Err.Number = 0 Then CMBCLIENTE.AddItem CLIENTE
        On Error GoTo 0
    Next I
    CMBCLIENTE.ListIndex = 0
    .Name = "CLIENTES"
End With
Set DATOS = Nothing
End Sub

Muchas gracias Mr. Bond por tu ayuda, te comento que cuando cambie la programación en el evento initialize y ejecute el formulario me cargó todos los clientes en orden alfabético. Pero cuando organice la información en el evento change, me sale el siguiente error.

Nuevamente te pido el favor si no es mucha molestia y me indiques como corregir este error.

Mil gracias de nuevo por tu gran ayuda...

Saludos...

Eso pasa cuando hay dato que no existe puedes poner

on error resume next

fila=worksheetfunction.....

on error goto 0

o bien borrar de initalize

ComboBox1.ListIndex = 0

Lo que no entiendo es porque a mi cuando corro de nuevo la macro no me marca ningún error, ¿en la columna A tienes datos?, porque eso también afecta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas