lunes, 11 de junio de 2012

VBA: La propiedad MatchEntry en un ComboBox.

Recientemente un lector del blog, Ever David, me recordó una propiedad de los ComboBox (cuadros combinados) que permitía algo muy buscado por la red, como es el completar texto según escribimos, sobre los elementos de un listado.
Explicaré hoy, aprovechando esa característica, cómo utilizar un ComboBox ó Cuadro Combinado(ActiveX) en nuestra Hoja de Excel, para conseguir y obtener en otra celda de la Hoja de Excel, el valor asociado al elemento buscado con este cuadro combinado de control.
Además para un mejor control, añadiremos un poco de código VBA para evitar que se introduzcan elementos no pertenecientes a nuestro listado de base.


Empezaremos nuestro trabajo asignando un nombre a nuestro Listado de trabajo (llamado 'datos':
datos =Hoja1!$A$2:$A$8
siendo el origen de datos

VBA: La propiedad MatchEntry en un ComboBox.


El siguiente paso es insertar el ComboBox ó Cuadro combinado(ActiveX) en la Hoja de Excel; lo que haremos desde Programador > Controles > Insertar > Controles ActiveX > Cuadro Combinado:

VBA: La propiedad MatchEntry en un ComboBox.


Nos aseguraremos que tenemos la propiedad MatcEntry de este control como 1-fmMatchEntrecomplete:


Esta propiedad MatchEntry habilita que según escribamos en este ComboBox se vayan reconociendo los elementos de la Lista origen de datos.
Para darle más potencia a este Control, incluiremos un poco de código más, por lo que haciendo doble click en el control (siempre con el Modo Diseño activado), insertaremos, asociado al Cuadro Combinado(ActiveX), en la Hoja correspondiente del Explorador de proyectos del Editor de VBA el siguiente código, formando nuestra macro de Excel:

Private Sub ComboBox1_change()
'cargamos listado desde la tabla 'datos' previamente creada...
ComboBox1.ListFillRange = "datos"

Dim ListadoDatos As Range
Dim Buscado As Object
'Definimos la variable ListadoDatos
Set ListadoDatos = Range("datos")
'Definimos una variable 'buscado'
Set Buscado = Nothing
'damos un valor a la variable 'buscado'
Set Buscado = ListadoDatos.Find(ComboBox1.Value)

If Buscado Is Nothing Then
'Si el dato escrito no está en la lista arroja el siguiente error
MsgBox "El dato introducido [" & ComboBox1.Value & "] no se encuentra en la lista", vbInformation, _
"Detalle del error..."
Else
'si está, entonces devuelve el valor del 'importe' correspondiente
Range("F2").Value = Range("datos").Offset(ComboBox1.ListIndex, 1).Value
End If

Set ListadoDatos = Nothing
Set Buscado = Nothing
End Sub


Ya podemos probar nuestro ComboBox, desactvamos el Modo Diseño, y desplegamos los elementos... podemos ver como lista los existentes sin problemas, y cómo finalmente lleva a la celda F2 el importe correspondiente al elemento elegido:

VBA: La propiedad MatchEntry en un ComboBox.


Probamos que ocurriría si intentamos buscar escribiendo sobre el cuadro del ComboBox, y veríamos como mientrar introduzcamos caracteres coincidentes, el ComboBox mostrará los elementos más parecidos. en la imagen siguiente se vé como al introducir el caracter 'B' muestra automáticamente el primer elemento que coincide con el buscado:

VBA: La propiedad MatchEntry en un ComboBox.


Por último, comprobamos el funcionamiento de nuestra macro cuando el valor o caracter introducido no coincide con ninguno de los elementos del listado de 'datos':

VBA: La propiedad MatchEntry en un ComboBox.

89 comentarios:

  1. Ever Davidjunio 21, 2012

    Excelente funcion, ahora si que esta completita... Gracias!!!

    ResponderEliminar
  2. Hola,
    una pregunta,en este ejemplo el ComboBox se encuentra en la misma hoja en donde están los datos(o Tabla)... pero si yo deseo poner el ComboBox en otra hoja ¿Qué modificación debo hacerle al código?
    Por ejemplo imaginemos que yo quiero poner el control en la hoja1 y los datos están en la hoja2.

    Te agradeceré mucho si me ayudas.

    ResponderEliminar
    Respuestas
    1. Hola,
      entiendo que deseas incrustar el combobox en la hoja11, etando los datos en la hoja2... en este caso, obviamente el código lo deberáss incluir en la hoja2 del explorador de proyectos, y cualquier referencia a rangos, como ListFillRange o Range debería llevar la expresión Sheets("Hoja2"). delante.
      Slds

      Eliminar
    2. Ok, muchas gracias.

      Eliminar
  3. HOLA, CÓMO CARGAR DATOS A UN COMBOBOX SIN MOSTRAR LA HOJA DE DONDE PROVIENEN LOS DATOS?.
    HE CREADO UN FORMULARIO, PERO CUANDO ACTIVO EL COMBOBOX PARA MOSTRAR TODOS LOS DATOS DEL ELEMENTO SELECIONADO LEÉ TODOS TODO LOS REGISTROS DESDE EL PRIMERO HASTA EL ULTIMO Y LUEGO ME MUESTRA LOS DATOS Y LO VUELVE A HACER CADA VEZ QUE SELECIONO UN ELEMENTO DEL COMBO, CÓMO PUEDO EVITAR ESTO?

    ResponderEliminar
    Respuestas
    1. Hola,
      no entiendo que te muestre los datos junto a la hoja de procedencia... supongo que habrás indicado la propiedad ListFillRange, seleccionando un rango de una hoja... lo raro es que marque la procedencia y no únicamente los valores del rango???.
      Para resolver la otra cuestión que planteas podrías añadir una línea al principio del código asociado al evento click del combobox (supongo será este evento el que tengas):
      Combobox1.clear
      así limpias la carga inicial de elementos del combobox...

      Espero haberte entendido bien.
      Slds

      P.D.: Por favor, evita escribir en mayúsculas, esto equivale a gritar
      ;-)

      Eliminar
  4. Hola y buenas tardes.

    He aplicado tu código y me ha ido bien, aunque solo lo necesito para que me muestre los datos de una columna en particular.Pero ahora lo que necesito es saber si puedo tomar el dato registrado en el combobox y asignarlo a un filtro avanzado para que me muestre la información relacionada a este. Por ejemplo, he insertado el combobox para que me muestre los nombres de personas de una columna en particular, ahora basandome en el nombre que ha quedado en el combobox, quiero utilizarlo para, a travez de un filtro avanzado, me muestre todos los registros que coincida con ese nombre en particular. ¿Se puede hacer esto?. Gracias por tu respuesta

    ResponderEliminar
    Respuestas
    1. Hola Frdy Martín,
      si es posible,
      sólo tendrías que incluir una variable como resultado del combobox en el criterio del Filtro.
      Es decir, asignas como variable dentro de la macro:

      filtro=Range("datos").Offset(ComboBox1.ListIndex, 1).Value

      ActiveSheet.Range("datos").AutoFilter Field:=1, Criteria1:=filtro

      y debería funcionar.
      Slds

      Eliminar
    2. Hola Ismael, he pasado este codigo de filtro al codigo del ejemplo que tu das, pero me aparece un error. lo escribi despues del else.

      Eliminar
    3. Hola,
      antes del End if, debe funcionar.. asegúrate que los nombres de los rangos coinciden
      Slds

      Eliminar
  5. Hola estimado, quería saber algo parecido a Frdy Martin, exactamente después quedar el codigo o nombre en el combox, quiero que se muestre en la columna siguiente todos los valores que corresponden a ese código, es decir si en combox se elige el código 85690, en la columna siguiente de aparecer cinco celdas con los nombres de los medicamentos que corresponden a ese código, que no es otra cosa que numero de factura y así cada vez que se selecione el código (numero factura) se muestren en la columna contigua su contenido.
    Si no es mucha molestia pudieras colocar el código completo desde el inicio con los cambios.

    agradeciéndote de antemano
    juan

    ResponderEliminar
    Respuestas
    1. Hola Juan,
      realmente para subir el código completo necesitaría disponer de la estructura de datos de tu hoja.

      En todo caso, ambos planteamientos de desplegar elementos en base a otra previa elección se soluciona de una manera muy sencilla sin macros, echa un vistazo a
      http://excelforo.blogspot.com.es/2010/04/validacion-de-celdas-anidadas-y.html

      En todo caso, si necesitas que te desarrolle la macro que necesitas puedes enviármelo a
      excelforo@gmail.com

      Pero por favor, lee primero las Normas de uso del blog.
      Un cordial saludo

      Eliminar
    2. ok estimado revise tu enlace,pero si es posible preferiría que veas el archivo que te envió detallando lo que deseo, ojala se pueda lo que deseo, en todo caso me doy por atendido y muchas gracias por tu tiempo.

      Juan

      Eliminar
    3. Ok,
      si lo prefieres envíamelo por mail.
      Slds

      Eliminar
  6. Hola linda tarde.

    Estoy probando la macro del ejemplo, pero tengo un pequeño problema, ya que no importa lo que escriba, siempre me manda el mensaje de que el dato introducido no se encuentra, aunque si se encuentra.

    Tendrá que ver que la lista (aunque esta en la misma hoja) la estoy jalando de otro archivo a través de una formula?

    espero puedas ayudarme

    ResponderEliminar
    Respuestas
    1. Hola Yam!
      en el eejmplo el ComboBox lo llenamos con el campo 'Producto', al que hemos asignado un nombre definido 'Datos'; si tus valores están en otro Libro tienes que nombrarlo adecuadamente, o bien importar esa Tabla a tu Libro de trabajo actual, y actuar y nombrar sobre éste.
      Un cordial saludo

      Eliminar
    2. Gracias por responder Ismael,
      lo que estoy haciendo es importar la tabla, solo que como esa tabla va ir actualizándose diariamente, lo hice con formulas, de esta forma:
      ='C:\Users\Documents\Pruebas\Sistema - 13062013\[Base clientes.xlsx]Hoja1'!B5
      no cómo texto. crees que ese sea el problema?

      Eliminar
    3. A primera vista parece que ese puede ser el problema...
      ya que tu no has importado la Tabla en conjunto, sino vinculado celda a celda entre Libros.
      Trata de realizar una importación de datos desde la Ficha Datos > Obtener Datos Externos, asi importarás y tendrás una Tabla actualizable...
      Slds cordiales

      Eliminar
    4. Gracias, si era eso.
      Saludos.

      Eliminar
  7. Hola Ismael,
    De que manera puedo hacer que el texto predictivo del ComboBox reconozca, NO el principio del texto, sino cualquier parte del texto.
    En tu Ejemplo: en el combobox empezar a escribir "x001", y entonces en la lista me aparezca "AA012-x001" como el resultado que más se le parece?
    Gracias!

    ResponderEliminar
    Respuestas
    1. Hola, no creo que lo que busques sea un 'texto predictivo' en sentido estricto, ya que este tipo de textos funcionan reconociendo la primera, segunda, etc letra y restringiendo cada vez más la lista.
      Parece que lo que quieres más bien es una búsqueda de elementos de una lista que cumplan una condición, que sería que contuvieran los caracteres que se vayan introduciendo en el ComboBox.

      Yo intentaría generar un evento combobox_change que cada vez que cambie el valor introducido refrescara el combobox con un rango (quizá una collection) que mostrara únicamente los elementos del listado original que contiene los caracteres...
      pero esto no mostrará según escribes, si no que permitiría desplegar elementos según escribimos.

      Claro está, debido a las búsquedas y refrescos del combobos constantes, no lo creo indicado para grandes listas.

      Espero te haya podido dar una idea.
      Slds

      Eliminar
  8. Hola Ismael
    Se me ocurre tener el mismo combobox pero que cuando tipee me devuelva las palabras congruentes con las letras tipeadas en formas alfabética
    Espero posible respuesta
    Saludos

    ResponderEliminar
    Respuestas
    1. Hola Amadeo,
      la función ade autocompletar texto en Excel es muy restringida , de hecho sólo se consiguen con herramientas como la explicada en este post o algún otro pequeño truco (por otro lado bastante burdo).
      Sólo lee algunos de los comentarios de más arriba...

      Lo siento pero esto es Excel.
      Slds cordiales

      Eliminar
  9. Como puedo aplicar este mismo concepto (el procedimiento), pero a un "control de formulario", disculpa no pretendo ser redundante, lo que quiero lograr es que según introduzca el texto en el "combobox", este se auto complete, ya sea que lo que introduzca esta al final, principio o en medio del texto del "combobox", previamente llenado con un rango de datos de mi hoja de calculo.
    De antemano mil gracias...!

    ResponderEliminar
    Respuestas
    1. Hola,
      el procedimiento sería el mismo (misma propiedad) para un control (combobox) de formulario..
      pero el autocompletado siempre irá al escribir de izquierda a derecha...

      Saludos

      Eliminar
  10. Perdón, creo que no me deje entender, lo que necesito es que cuando este en el "combobox" y lo que escriba no necesariamente estará al principio, si no que puede estar al final o en medio - Ej: si empiezo a escribir "ANT" se autocompletara la lista... "ANTEZANA, zona los Cedros # 1225 telefono 4420958" (esto ya lo hace), pero lo que yo necesito que haga, es que cuando ingrese, por decir, los tres últimos dígitos de su teléfono, que seria "958" me muestre el resto de los datos "ANTEZANA, zona los Cedros # 1225 teléfono 4420958" o puede que ingrese el número del domicilio "1225" (esto para datos que estuviesen en medio) y cabe considerar que puede haber mas de uno que casualmente tienen esos tres últimos dígitos de teléfono, se desplace la lista y poder escoger la opción mas conveniente.
    Espero tu ayuda y nuevamente GRACIAS...!

    ResponderEliminar
    Respuestas
    1. Hola JR,
      creo sí comprendí lo que planteabas... no creo posible tal cosa, ya que el autocompletado siempre irá al escribir de izquierda a derecha..
      Lo siento
      Saludos

      Eliminar
  11. Bueno, la verdad observe esta funcionalidad en otro vídeo tutorial, lo malo es que el fulano que colgó este, no quiere compartir el código, pero de todas maneras GRACIAS POR TU TIEMPO.

    ResponderEliminar
  12. Buenas Ismael,

    Tengo una pregunta, actualmente tengo un userform, el cual tiene un combo box; donde tiene una lista de nombres. Con esto, lo que necesito es que cuando le de click a un botón, después de haber escogido algún nombre en el combo box, se cree una nueva hoja que tenga como nombre el que aparece en el combo box. Además, esta hoja debe tener siempre las mismas especificaciones como por ejemplo: un cuadro, que aparezca en ciertas celdas una información que se ve reflejada en los labels del userform.

    Gracias.

    ResponderEliminar
    Respuestas
    1. Hola,
      yo generaría un duplicado de una hoja plantilla con las especificaciones de información que necesites..
      luego asocia el código de duplicar hoja:
      Sheets("Plantilla").Copy After:=Sheets(Worksheets.Count)
      al botón o al evento de Change del combobox... no olvides cambiar el nombre a esa nueva hoja
      Sheets(Worksheets.Count).Name = Combobox1.value
      Espero te oriente
      Saludos

      Eliminar
  13. Buen día, de casualidad sabrá como se aplica la propiedad de MatchEntry y AutoWordComplete en VBA , más especificamente para fmMatchEntryNone. He intentando:
    ActiveSheet.OLEObjects("ComboBox1").MatchEntry= 0
    ó
    ActiveSheet.OLEObjects("ComboBox1").MatchEntry= fmMatchEntryNone
    Pero me marca error, no entiendo por que si hasta la propiedad viene en la página de Microsoft. A diferencia de ActiveSheet.OLEObjects("ComboBox1").ListFillRange = "ejemplo" que si me acepta el còdigo.

    Saludos y gracias.

    ResponderEliminar
    Respuestas
    1. Hola David,
      tendría que mirarlo.. pero por que no simplemente activas el control ActiveX y desde su ventana de propiedades cambias .Matchentry a la opción que deseas??
      Slds

      Eliminar
    2. Gracias por la pronta respuesta.
      Pretendo hacerlo desde VBA por que tengo que crear una gran cantidad de ComboBox, ( y desde VBA) por lo que si ya les puedo poner esa propiedad a cada uno desde código, me ahorraría muchísimo tiempo. Como menciono, por ejemplo, a cada uno ya le pongo su rango de items con .ListFillRange, pero como requiero hacer ComboBox cuyo método de búsqueda sea de ¨sugerir autocompletado¨ ( tipo búsqueda de google),el cual ya sé hacer (manualmente), pero lo único que me detiene es esta propiedad de MatchEntry y AutoWordComplete, si conociera bien la sintaxis, o como cambiarlas desde código, creo que podría concluir esta actividad.
      Cabe resaltar que el archivo genera combobox definidos por el usuario, asi que viéndolo desde el punto de vista como tal, entendería que el usuario no sabe, y no tiene por que cambiar las propiedades manualmente.

      Saludos y gracias nuevamente.

      Eliminar
    3. Siempre podrías copiar y pegar el mismo Control ;-)

      En todo caso, si quieres hacerlo desde código prueba con:
      ActiveSheet.OLEObjects("ComboBox1").Object.MatchEntry = 0

      o el valor que quieras 0,1 ó 2

      Saludos!

      Eliminar
    4. Intuía que mi error era algo sencillo.
      He probado este código y funciona a la perfección.
      Gracias por la info,ah!y también era AutoWordSelect= False, que de igual manera funciona bien.

      Eliminar
  14. Hola, antes que nada felicitarte por la gran ayuda que haces con el blog, el código de validación esta funcionando muy bien. Tengo una duda, en mi caso yo tengo en mi lista del combobox diversos productos, varios con nombres similares, por ejemplo "Curso básico", " Curso Intermedio", y "Curso avanzado", cuando empiezo a escribir el nombre de producto en el combo box, si escribo por ejemplo " cuso", me da el error, eso está bien porque está mal escrito, pero si escribo sólo "curso" me lo válida como correcto, a pesar de no haber completado todo, y dando un valor errorneo en la celda, ¿como puedo hacer para que la validación de la celda sea más exaustiva, sin perder la propiedsd de autocompletado (en ocasiones no autocompleta o demora, por eso suele aparecer ese error).
    De antemano, muchas gracias por la respuesta.

    ResponderEliminar
    Respuestas
    1. Hola, nuevamente yo, sólo para adicionar un detalle, cuando escribo una vocal tampoco me lo muestra como error, por ejemplo "o", ya que la palabra curso tiene la vocal como parte de su cadena de caracteres, pero si escribo "oo" si me da el erró porque la cadena de las 2 letras o juntas no lo encuentra.

      Eliminar
    2. Hola Yurigouki,
      la cuestión es que estamos asociando al evento Change de un combobox (esto es, cada vez que cambia algo en el desplegable) una búsqueda.. que en este caso realizamos con el método .Find
      Como puedes ver este método lo hemos dejado muy abierto, es decir, no estamos buscando que coincida exactamente con el contenido buscado o/y con mayúsculas-minúsculas.. por tanto nos vale cualquier coincidencia por aproximada que sea...

      Podrías ajustar una coincidencia exacta en el método Find, pero esto te ocasionaría que a cada letra escrita saltara el mensaje de fallo.

      A veces tenemos que optar por soluciones intermedias ;-)
      Saludos

      Eliminar
  15. buenas tardes, tengo un problema y me gustaría saber si me puedes ayudar... Tengo un listado de nombre el cual se va actializando y con ello el combobox, pero muchos de ellos están repetidos y necesito que en el combobox sólo aparezac una vez... No sé cómo hacerlo... Mil gracias de antemano

    ResponderEliminar
  16. Buenas tardes. Excelente tutorial. Me ha ayudado mucho.
    Lo que quisiera saber es si se puede hacer que a medida que vaya introduciendo letras en el combobox no solo autocomplete con la primer coincidencia que encuentre sino también que se despliegue la lista de dicho combobox con las posibles coincidencias.
    Por ejemplo, tengo una lista que tiene 2 clientes que se llaman Luis, y lo que quiero es que cuando teclee la letra L se despliegue el combo y me muestre esos 2 nombres.
    Espero haberme explicado bien.
    Desde ya muchas gracias. Saludos.

    ResponderEliminar
    Respuestas
    1. Hola Guillermo,
      subiré una explicación al respecto en cuanto sea posible.
      Un cordial saludo

      Eliminar
  17. Hola. Tengo un problema con mi Combobox. Funciona muy bien, pero cuando le doy click a la lista desplegable, se hac epequeño, el botón de desplegar y la letra de lo que está adentro... tan pequeño que después queda todo blanco y desaparece. Traté en las propiedades del objeto de bloquear el tamaño y eso, pero no funciona. Gracias

    ResponderEliminar
    Respuestas
    1. Hola Diena14,
      muy raro ??... no tendrás algún evento tipo MouseOver, GetFocus, que reduzca las dimensiones del objeto?

      No se me ocurre qué más puede ser

      Slds

      Eliminar
  18. Buenas mi estimado Ismael Romero, he implemetado el codigo que aportas en VBA pero al correr el codigo me sale un error en la linea de codigo: Set ListadoDatos = Range("Tabla"), "Tabla" es el nombre que le di a mi tabla dinamica, mi duda es en que momento hago esto que escribiste, "Empezaremos nuestro trabajo asignando un nombre a nuestro Listado de trabajo (llamado 'datos':
    datos =Hoja1!$A$2:$A$8 siendo el origen de datos"; ¿es en el moemnto de asignar un rango a mi tabla dinamica?

    ResponderEliminar
    Respuestas
    1. Hola Roger,
      el momento es lo de menos.. pero para que funcione correctamente se debe asignar ese nombre definido al primer campo de la tabla... por lo que no sería correcto empezar con:
      Set ListadoDatos = Range("Tabla")
      que recoge ambos campos de tu origen... ya que únicamente queremos mostrar los códigos.
      Asigna nombre al primer campo y sigue los pasos descritos
      Un cordial saludo

      Eliminar
    2. y, ¿como asigno nombre al primer campo?, disculpa que te pregunte dos veces.

      Eliminar
    3. Para asignar nombre selecciona el rango, en este caso el campo en cuestión, y desde el cuadro de nombres introduces el Nombre Definido.
      Hay una categoría en el Blog destinada a esta herramienta de Nombres definidos:
      ver

      Slds

      Eliminar
    4. Gracias por su ayuda, Mi estimado Ismael Romero, me ha servido mucho su ayuda. Saludos

      Eliminar
  19. excelente aporte, es lo que necesito , pero al copiar tu código me da error "1004" seguramente algo hice mal, espero tu respuesta

    ResponderEliminar
    Respuestas
    1. Hola,
      probablemente te falte generar en la hoja de cálculo un Nombre definido llamado 'Datos'...
      ?
      Slds

      Eliminar
  20. Hola mi nombre es Carmen
    Mi pregunta es como le puedo hacer que cuando utilizo la rueda desplazamiento del raton la lista se separa del combo y entre mas muevas la rueda desplazadora mas se aleja el listado. como le puedo hacer para que no se mueva me podrian ayudar por favor.

    ResponderEliminar
    Respuestas
    1. Hola Carmen
      ¿¿??
      quieres decir que al hacer Zoom con la rueda del ratón se separa el desplegable del combobox???

      Es algo muy raro.. quizá sea un tema de refresco de pantalla?

      Eliminar
  21. hola ismael romero
    necesito ayuda en esto se lo agradeceria
    un suponer a2*b2*c2*c1/12 , ahora c2 es un valoe ejemplo 6 y en otra celda tengo 5 los resto me tiene que quedar 1 pero que se refleje en la misma celda c2 y al mismo se quede asi si quitara el 5 y lo limpiara para volver a operar

    ResponderEliminar
  22. hola copie tu codigo para implementarlo en mi base de datos pero a la hora de correr el codigo me da un error no se aque se debe.

    ResponderEliminar
    Respuestas
    1. Hola Rebeca,
      habría que saber cómo tienes construido tu origen y qué error te devuelve el código
      ;-)
      En todo caso, para algo sencillo como el ejemplo, asegúrate que el nombre de la Tabla (del origen de datos) coincide.

      Saludos

      Eliminar
  23. hola tengo el siguiente código pero necesito que el combobox se auto complete a media que escribo el dato por que asi no se autocompleta y es una base muy grande para seleccionarlo con el mouse

    Private Sub ComboBox2_Change()
    Dim var2 As String
    If ComboBox2 = "" Then
    Else
    CommandButton1.Locked = False
    Sheets("proveedores").Activate
    If ComboBox2 = Empty Then
    MsgBox "Para modificar primero seleccione proveedor", vbInformation, "Almacen"
    ComboBox2.RowSource = A
    End If

    var2 = ComboBox2.Column(0)
    Cells.Find(What:=ComboBox2.Value, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
    xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
    , SearchFormat:=False).Activate



    If var2 = ActiveCell.Value Then

    TextBox1.Value = ActiveCell.Value
    TextBox2 = ActiveCell.Offset(0, 1)
    TextBox3 = ActiveCell.Offset(0, 2)
    TextBox4 = ActiveCell.Offset(0, 3)
    TextBox5 = ActiveCell.Offset(0, 4)
    TextBox6 = ActiveCell.Offset(0, 5)
    TextBox7 = ActiveCell.Offset(0, 6)
    TextBox8 = ActiveCell.Offset(0, 7)
    TextBox2.Locked = False
    TextBox3.Locked = False
    TextBox4.Locked = False
    TextBox5.Locked = False
    TextBox6.Locked = False
    TextBox7.Locked = False
    TextBox8.Locked = False
    End If
    End If
    End Sub
    Private Sub ComboBox3_Change()
    If ComboBox3 = "" Then
    Else
    CommandButton1.Locked = False
    Sheets("proveedores").Activate
    If ComboBox3 = Empty Then
    MsgBox "Para modificar primero seleccione proveedor", vbInformation, "Almacen"
    ComboBox3.ListIndex = 0
    ComboBox3.SetFocus
    End If
    var3 = ComboBox3.Column(0)
    Cells.Find(What:=ComboBox3.Value, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
    xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
    , SearchFormat:=False).Activate
    If var3 = ActiveCell Then
    TextBox2 = ActiveCell
    TextBox1 = ActiveCell.Offset(0, -1)
    TextBox3 = ActiveCell.Offset(0, 1)
    TextBox4 = ActiveCell.Offset(0, 2)
    TextBox5 = ActiveCell.Offset(0, 3)
    TextBox6 = ActiveCell.Offset(0, 4)
    TextBox7 = ActiveCell.Offset(0, 5)
    TextBox8 = ActiveCell.Offset(0, 6)
    TextBox2.Locked = False
    TextBox3.Locked = False
    TextBox4.Locked = False
    TextBox5.Locked = False
    TextBox6.Locked = False
    TextBox7.Locked = False
    TextBox8.Locked = False
    End If
    End If
    End Sub

    ResponderEliminar
    Respuestas
    1. Hola!,
      ¿has configurado las propiedades del combobox como se indica en este post (arriba)??
      Esa sería la manera de que se autocomplete y no tener que seleccionar...

      Saludos

      Eliminar
  24. Saludos, veo que eres de los que si toman importancia a sus seguidores :D
    Me agrado tu tema al inicio expuesto (VBA: La propiedad MatchEntry en un ComboBox.)

    Deseo me ayudes en lo siguiente con respecto de tu tema expuesto:
    1.- Agregar un Boton1 para que cuando le de clik, el ComboBox1 quede limpio.

    ResponderEliminar
    Respuestas
    1. Hola Dann,
      la idea sería en ese nuevo botón añadir el código:
      Private Sub CommandButton1_Click()
      ComboBox1.Value = ""
      End Sub


      Slds

      Eliminar
    2. y algo más extremo (eliminar los item a desplegar:
      Private Sub CommandButton1_Click()
      ComboBox1.ListFillRange = ""
      End Sub

      Eliminar
    3. Probé tus 2 métodos y si son correctos (ya que ambos usan botón ActiveX). Perdón sino especifique, que deberían ser con botón de control de formulario y no con botón de control ActiveX.
      Me podrías corregir ello por favor?? Es que le quiero usar con una macro en su respectivo modulo. XD gracias.

      Eliminar
    4. En un UserForm, en principio debería funcionar algo simialr a esto:
      Private Sub CommandButton1_Click()
      ComboBox1.Clear
      End Sub


      Saludos

      Eliminar
    5. jeje creo debo ser mas especifico aún. No estoy usando Userform. Lo que deseo es que el código este dentro de un modulo independiente y que este código responda al botón de control de formulario que esta insertado en la hoja excel; luego a dicho botón agregarle la macro de limpiar.
      Intente hacerlo asi hace ya mucho pero al ejecutarle me sale "se requiere un objeto".

      Sub Limpiar()
      ComboBox1.Clear
      End Sub

      Espero no molestarte con el problemita jeje

      Eliminar
    6. si vas a incluir algún tipo de código tienes que emplear objetos que puedan soportar código
      ;-)

      Eliminar
    7. mmm ok entendido. Pero te cuento, eh estado probando tu codigo expuesto al inicio, le eh quitado la parte donde sale el mensaje de que no halla lo buscado (ya que era algo molesto que salia en cada letra borrada de la palabra). Luego la probé, pero al borrar con suprimir o retroceso, el combobox copiaba el encabezado del titulo de precios y lo pegaba en F2; Hay alguna forma de evitar este defecto??

      Eliminar
    8. podrías añadir el código, en lugar de al evento change, al evento LostFocus
      así se activará al salir del control... debería funcionar.
      Slds

      Eliminar
  25. Me olvidaba también que, al seleccionar un Item de la lista del ComboBox1, este aparece en la celda "F2"(como en tu caso). Pero desearía que me ayuden en lo siguiente:

    2.- Que al elegir el primer item de la lista, este aparezca en la celda "F2", al elegir el 2do nuevo item, este aparezca en F3, y asi sucesivamente (digamos que las celdas a trabajar sean de "F2:F12"). Osea también que si una de las celdas ya tiene algún valor pase al siguiente. Y cuando llegue a la celda "F12" y quiera ingresar otro mas, me avise que ya no puedo ingresar mas porque eh culminado el rango de celdas permitidas a llenar.
    Como serian los codigos?? (Att, un Novato)

    ResponderEliminar
    Respuestas
    1. Hola,
      esto es algo más elaborado,
      la idea es modificar la línea:
      Range("F2").Value = Range("datos").Offset(ComboBox1.ListIndex, 1).Value

      por una variable, por ejemplo:
      UltFila=range("F"&Rows.Count).end(xlup).offset(1,0).row
      cells(UltFila,"F").Value = Range("datos").Offset(ComboBox1.ListIndex, 1).Value


      además tendrías que añadir un control o similar, quizá un IF..THEN.. para el caso que la nueva variable 'Ultfila' sea igual a 12 me saque del procedimiento.
      IF UltFila>=12 THEN Exit Sub

      Saludos

      Eliminar
    2. La parte del introducir el:
      IF UltFila>=12 THEN
      Exit Sub

      No me sale o no se como hacerlo. podrías ser mas detallista en esa sección por favor.

      Eliminar
    3. UltFila=range("F"&Rows.Count).end(xlup).offset(1,0).row
      IF UltFila >= 12 THEN
      Exit Sub
      ELSE
      cells(UltFila,"F").Value = Range("datos").Offset(ComboBox1.ListIndex, 1).Value
      END IF

      Slds

      Eliminar
    4. Excelente, me funciono de maravilla, gracias. Te daría manito arriba pero no hay donde jeje.
      Un detalle mas; al elegir un item, su valor se va a F2, pero quisiera que luego de haber elegigo el iten, el combobox1 quede limpio luego de haber elegido al instante y asi elegir el siguiente. Cual seria la variacion??

      Eliminar
    5. ;-)
      pues lo comentado, para dejar vacío el ComboBox se suele aplicar:
      ComboBox1.Value=""

      sigo hablando de controles ActiveX o de UserForm

      Slds

      Eliminar
  26. Gracias por tu ayuda anteriormente XD.
    Tendrás algún otro foro que tengas sobre este tema:

    PARPADEO DE CELDAS VACÍAS E INTERRUMPIDAS AL INGRESAR DATOS
    En Excel.
    1.- Que desde la celda "A5:A10" , la celda "B3" y el "C7" las cuales están vacías, parpadeen.
    2.- Al ingresar algún dato en dichas celdas dejen de parpadear.
    3.- Al borrar el dato ingresado en dichas celdas, nuevamente vuelvan a parpadear.

    Si lo tienes, pasa el link para visitarlo, gracias.
    Saludos.

    ResponderEliminar
    Respuestas
    1. Hola Dann,
      no se si haya alguno cosa al respecto en la categoría de macros.
      Echa un vistazo
      http://excelforo.blogspot.com.es/search/label/Macros

      Slds

      Eliminar
  27. Hola Buenos Dias
    Como hacer para que dentro de un formulario que contiene un combox por dentro. Dependiendo de lo que yo seleccione en el combobox el me realice un calculo que ya tngo listo

    ResponderEliminar
  28. Osea que si yo selecciono Anual
    me haga un calculo
    si selecciono Trimentral
    me haga un calculo
    Si selecciono mensual
    Haga otro

    ResponderEliminar
    Respuestas
    1. Hola María José,
      la idea sería asociar con un condicional por ejemplo la acción a realizar, asociandolo a un evento Change del ComboBox (o uno Exit):
      If Combobox1.Value="Anual" then
      calculo a realizar
      elseif combobox1.Value="Trimestral" then
      calculo a realizar
      elseif combobox1.Value="Mensual" then
      calculo a realizar
      end if

      dependiendo del número de casos, quizá un SELECT CASE fuera más eficiente...

      Saludos

      Eliminar
  29. ¿Sigue vigente ListFillRange? al ingresarlo en mi codigo, me señala que no existe ese metodo.

    ResponderEliminar
    Respuestas
    1. Hola Martín,
      un gusto saludarte igualmente.

      Sigue activo,, ojo por que depende de si trabajas con un control ActiveX o con un control de UserForm

      Un cordial saludo

      Eliminar
  30. Hola Ismael, mi consulta es ¿se puede hacer una correspondencia en word desde excel, una lista de registros?, si bien se uede hacer con un registro, pero no me ha salido hacerlo en forma de una lista por ejemplo:
    1. AAAAAAAAAAAAAAA, identificado con DNI Nº 111111111111, con Domicilio Real en Jr. Gabriel Bejar N° 844 Urb, Santa Luzmila , del Distrito Comas y Provincia de Huari.
    2. BBBBBBBBBBBBBBBBBB, identificado con DNI Nº 22222222222222, con Domicilio Real en el Jr. Zorritos N° 1399 Block 64 Dto. 204 , del Distrito Comas y Provincia de Huari.
    3. CCCCCCCCCCCCCCCCCCC, identificado con DNI Nº 33333333333333333333, con Domicilio Real en Av 23 de Setiembre Mz. M. 5 Lt. 15, del Distrito Carbayllo y Provincia de Huari.
    4. DDDDDDDDDDDDD, identificado con DNI Nº 44444444444444444, con Domicilio Real en el Jr. Mariano Melgar N° 186 Collique I Zona , del Distrito Comas y Provincia de Huari.
    5. EEEEEEEEEEEEEEEE, identificado con DNI Nº 5555555555555, con Domicilio Real en el Jr. San Isidro Nº 386 Urb. Popular San Carlos , del Distrito Comas y Provincia de Huari.
    6. FFFFFFFFFFFFFF, identificado con DNI Nº 666666666666666, con Domicilio Real en Psj. Ancash Nº 131 Urb. San Felipe , del Distrito Comas y Provincia de Huari.
    gracias por su ayuda y otro, mi base de datos de excel con macros se puede haver para que sea multiusuario en red local, y que modifiquen todos los ususarios de la red local al mismo tiempo?.
    Atte.
    Julio Reza

    ResponderEliminar
    Respuestas
    1. Hola Julio,
      en realidad al seleccionar desde Word la 'lista existente' (en Combinar correspondencia) te debería reconocer todos los registros..
      de todas formas, podrías asegurarte que lo reconoce, convirtiendo el rango de Excel en tabla (en Excel ficha Insertar > Tabla)

      En general Excel no es multiusuario, si bien tienes un par de opciones:
      1-convertir el fichero en Libro compartido.. perdiendo bastante funcionalidad
      2-trabajar desde la nube (OneDrive) y empleando Excel online.. pero igualmente con funcionalidades limitadas

      Saludos

      Eliminar
  31. Hola Ismael, te hago una consulta.
    Trabajo con una Mac, uso excel 2011 ya que con 2016 se limitaron muchas cosas.
    Agrego un combobox o un botón por ejemplo, y al hacer click en cualquiera de los dos, no pasa nada, no va a vba. Si hago click derecho no tengo la opción para ir a propiedades del combobox, por lo tanto no se como se llama mi combobox que creo. Por favor ayuda! Gracias!!

    ResponderEliminar
    Respuestas
    1. Hola Maca,
      lo siento pero el entorno de Mac es bastante distinto al de Windows (con códigos de programación en algunos casos diferentes).
      Mejor consulta en un foro o blog especializado en mac.
      UN saludo y suerte

      Eliminar
  32. Buenas tardes Ismael
    Es posible hacer dependientes a dos combobox, sin la necesidad de usar una ventana emergente, ya que necesito que se seleccionen desde la misma hoja de Excel.
    Esto es para mostrar las distintas opciones que tiene cada campo de mi combobox 1

    ResponderEliminar
    Respuestas
    1. Hola Josué,
      si te refieres a que un Combo2 muestre unos elementos u otros según la elección en un Combo1, claro que no hace falta 'ventana emergente'...
      Puedes emplear los Combobox 'ActiveX', y añadirles la programación correspondiente...

      Saludos

      Eliminar
  33. Hola, estaria necesiatdno ayuda con VBA. El problema que tengo es que no se como hacer, para que los datos del combobox esten ya cargados apenas abra el lirbo. saludos

    ResponderEliminar
    Respuestas
    1. Hola,
      lo que puedes hacer es añadir directamente en la ventana de propiedades del Combobox la propiedad:
      .ListFillRange = "datos"
      así lo tendrás cargado siempre, y no solo como en el ejemplo cuando se produce un cambio
      Slds

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.