Eliminar datos de un combobox

Hola de nuevo:
En una hoja tengo una serie de contactos. Cada contacto tiene una referencia (amigo, compañero de trabajo...) Estos datos se meten desde una ventana de diálogo UserForm3 (Referencias). En esta ventana tengo un Textbox desde la que inserto nuevas referencias. Quiero sustituirlo por un combobox editable en el que si escribo y doy a insertar meta la nueva referencia, pero que si elijo un elemento del combobox y le doy al botón eliminar (CommandButton3) busque en la hoja principal (Contactos) si tengo esa referencia metida en algún contacto y en el caso de que exista me envíe un MsgBox para que elimine los registros con esa referencia antes de eliminar la referencia. En el caso de que no exista que elimine directamente el registro seleccionado (supongo que debería eliminar la fila de la hoja "Listados" dónde esté esa referencia.
He probado de varias maneras. Esta es la última, pero me sigue sin funcionar. ¿Alguna idea?
Private Sub CommandButton3_Click()
Sheets("contactos").Select                           'Abrimos la hoja contactos
Cells.Find(what:=ComboBox1).Activate        'Buscamos el valor introducido en el combobx
If ComboBox1.Value <> "" Then                   'Si el valor es dif de "" entonces mensaje
    MsgBox "Tienes algún elemento con esta referencia borra elemento antes de borrar la referencia"
    Else                                                           'Sino eliminamos el elem seleccionado
    ComboBox1.Items.Remove (ComboBox1.SelectedItem)
End If                                                            'Fin del If
End Sub
1

1 respuesta

1
Respuesta de
Hola, me puedes explicar porque quieres un Combobox si cuando encuentre la referencia solo te va a llevar ese dato al Combobox, con un Textbox te hace la misma función y el código es mucho más corto y sencillo.
Aclarame esto.
>Un saludo
>Julio
Hola:
Estuve unos días fuera pero me vuelvo a meter con el asunto.
Quiero un combobox para que me salga el desplegable y vea bien todas las referencias que tengo metidas, así elegir la que quiero eliminar y entonces pulsar el botón de eliminar (y sería entonces cuando habría que comprobar si esa referencia está usada).
Al dejar el combobox como editable me serviría como un textbox y pulsando el botón de insertar lo añadiría a la lista de referencias.
Si se te ocurre alguna otra idea que pueda funcionar ...
Un saludo
Hola esta tres macros hacen todo, insetan, cargan el Combobox y eliminan si no exite la referencia si existe te lanza el mensaje:
Private Sub ComboBox1_Enter()
Sheets("Contactos").Select
Range("A1").Select
ActiveCell.End(xlDown).Select
final = ActiveCell.Address
ComboBox1.RowSource = "$A$1:" & final & ""
End Sub
La macro anterior carga la lista desde la celda A1 hasta el final de tu rango
Private Sub CommandButton1_Click()
Sheets("Contactos").Select
Range("A1").Select
ActiveCell.End(xlDown).Offset(1, 0).Select
ActiveCell.Value = ComboBox1.Value
End Sub
La macro anterior sirve para insertar y el valor que pongas en el Combo al hacer click en el botón inserta la referencia en tu hoja Contactos
Private Sub CommandButton2_Click()
Sheets("Referencias").Select
Range("A1").Select
Range(ActiveCell.Offset(0,1), ActiveCell.End(xlDown).Offset(0,1)).Select
On Error Resume Next
Selection.Find(What:=ComboBox1, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate
If ActiveCell.Text = ComboBox1 Then
MsgBox "Esta referencia existe, elimine primero los contactos"
Else
Sheets("Contactos").Select
Range("A1", ActiveCell.End(xlDown)).Select
Selection.Find(What:=ComboBox1).Select
Selection.EntireRow.Delete
End If
End Sub
La macro anterior eliges un valor del Combo y haces click en borrar primero buscará el texto del Combo en tu hoja Referencias 8 me he situado en la Col A por si tienes contactos a los que no tienes asignadas referencias) para que seleccione todo el rango aunque haya celdas vacías, busca el texto si lo encuentra te lanza el mensaje y si no te borra la entrada de la hoja Contactos eliminandote la fila.
Mira a ver si te sirve.
>Un saludo
>Julio
Hola Julio:
Lo primero muchas gracias por tu tiempo y el interés.
El cargar la lista y el botón de insertar ya lo tenía solucionado, pero de todas maneras me has dado ideas.
Mi problema es con el botón de eliminar. En tu macro hay alguna cosa que no entiendo muy bien. Te paso la que estoy haciendo yo a ver si ves por dónde voy.
Sheets("contactos").Select   'vamos a la hoja "Contactos"
Range("F:F").Select   'seleccionamos la columna dónde tengo las referencias
Cells.Find(what:=ComboBox1).Select   'buscamos lo escrito en el combobox1
If ComboBox1.Value <> "" Then   'si encontramos algo salta el mensaje
    MsgBox "Tienes algún elemento con esta referencia borra elemento antes de borrar la referencia"
    Else   'si no se encuentra nada continuamos (porque no habremos usado esa referencia)
   Sheets("listados").Select   'vamos a la hoja listados
   Range("A:A").Select   'Seleccionamos la columna A
   Cells.Find(what:=ComboBox1).Select   'buscamos la celda que tenga lo escrito en el combobox
   Selection.EntireRow.Delete   'seleccionamos la fila entera y la borramos.                                                                                                                                  
End sub
¿Cómo ves esta macro? Otro problema que tengo es que cuando busco en la hoja de "Contactos" me busca en todas las celdas no sólo en la columna "F" que es el rango que le indico yo.
Un saludo
Carlos
Hola, pues tu macro me parece bien pero tiene errores que por supuesto detectas cuando escribes:
Cells.Find(what:=ComboBox1).Select
Estas diciendo que te busque en todas las celdas, no le importa que previamente hayas seleccionado una Col donde buscar como es tu caso:
Range("F:F").Select
Si has seleccionado previamente un rango pues haz la búsqueda en él y no en todas la hoja:
Range("F:F").Select
Selection.Find(what:=ComboBox1).Select
Respecto a la otra consulta si analizas lo que estas diciendo en la sintaxis verás que no es el resultado que esperas obtener, tu pones:
If ComboBox1.Value <> "" Then   'si encontramos algo salta el mensaje
Si aclaras lo que quieres hacer, pero no escribes la sintaxis para hacerlo, tu has puesto
"Si el valor del Combobox es distinto de blanco" (Esto es lo que significa If ComboBox1. Value <> "" Then) me aparece el mensaje:
MsgBox "Tienes algún elemento con esta referencia borra elemento antes de borrar la referencia"
Y por supuesto esto no es correcto, porque tu en el combobox elegirás un valor a buscar y por lo tanto siempre tendrá un valor, que ocurre que como el valor no es blanco siempre te va a aparecer el mensaje, siempre, siempre...
Para hacer lo que quieres se complica la cosa un poco más:
Dim n As Range
valor=Val(ComboBox1.Value) 'Si tus datos a buscar no son numeros quita Val
Sheets("contactos").Select   'vamos a la hoja "Contactos"
Range("F:F").Select   'seleccionamos la columna dónde tengo las referencias
Set n = Selection.Find(What:=valor, LookIn:=xlValues, LookAt:=xlWhole) 'buscamos lo escrito en el combobox1
If Not n Is Nothing Then  'si encontramos algo salta el mensaje
MsgBox "Tienes algún elemento con esta referencia borra elemento antes de borrar la referencia"
    Else   'si no se encuentra nada continuamos (porque no habremos usado esa referencia)
   Sheets("listados").Select   'vamos a la hoja listados
   ActiveSheet.Range("A:A").Select   'Seleccionamos la columna A
Selection.Find(what:=valor).Select   'buscamos la celda que tenga lo escrito en el combobox
   Selection.EntireRow.Delete  'Seleccionamos la fila entera y la borramos
End If                  ' Fin del If  
Set valor=Nothing                                         
End sub
El problema de los botones dibujados en las hojas, viene dado cuando se cambia de hoja y se quiere seleccionar rangos, el botón no admite la propiedad si antes no le dices que el rango seleccionado corresponde a la hoja activa, de ahí la instrucción ActiveSheet delante de la selección de Range.
Para realizar la búsqueda en el rango seleccionado utilizamos la instrucción Set y una variable que nos indica Nothing (no) si encuentra el valor, por ello la doble negación si No es Nothing el resultado de la búsqueda( si encuentra el valor) me lanzas el mensaje y si no lo encuentra pasamos a la otra hoja buscamos el valor en el rango seleccionado y borramos la fila. A continuación volvemos a dejar la variable en su valor original Nothing por si se ha quedado con otro valor.
Prueba esto y me cuentas.
>Un saludo
>Julio
Añade un comentario a esta respuesta
Añade tu respuesta
Haz clic para o
Escribe tu mensaje
¿No es la respuesta que estabas buscando? Puedes explorar otras preguntas del tema Microsoft Excel o hacer tu propia pregunta: