Ingreso, búsqueda y modificación de datos en Excel con Formulario ActiveX

El objetivo de este artículo es la de crear un formulario que nos sirve para además de introducir datos, tener la posibilidad de buscarlos y modificarlos.  En un artículo anterior habíamos visto como crear un formulario simple para ingreso de datos.

Por otro lado ya hemos visto varios artículos de cómo buscar datos sin embargo esta vez vamos a ver una forma sencilla de efectuar una búsqueda usando el formulario pero con formulas ya conocidas. Siempre empezamos con lo más básico para luego ir agregando funcionalidades e ir creando cosas más complejas.
Antes de empezar vamos a hablar de otras posibilidades que tenemos para manejar datos en Excel. Hay una función que propone para trabajar con formularios. Es muy fácil de usar  y puede servir para nuestro cometido sin necesidad en meterse en el uso de VBA o programación en Excel. Lo pueden chequear en la página de Microsoft con el nombre “Agregar, editar, buscar y eliminar filas usando un formulario de datos”.
En este artículo vamos a ver cómo construir un formulario con el cual podemos agregar datos, y luego poder modificarlos. Además podemos efectuar una búsqueda por código. También es posible modificar cantidades, que generalmente es lo que plantea manejar estos tipos de datos.


Click en la imagen para ver el video o en este link.

Elementos básicos:
En el artículo anterior habíamos visto como crear el formulario e introducir los botones, etiquetas y cajas de texto. A Continuación vamos a describir dichos elementos con los nombres asignados para la aplicación.
1.       Formulario (UserForm): El formulario se llama “Ingreso” y el nombre visible es para este caso “Stock”.

Es decir que las propiedades:
o   Name = Ingreso
o   Caption = Stock

2.       Botones de Comando (CommandButton): se utilizan dos botones de comando más comparado con el artículo anterior cuyas propiedades la vemos a continuación.
                                                        
·         Guardar Nuevo
o   Name = Ingresar
o   Caption = Guardar Nuevo

·         Cerrar
o   Name = Cerrar
o   Caption = Cerrar

·         Buscar
o   Name = Buscar
o   Caption = Buscar

·         Modificar
o   Name = Modifica
o   Caption = Modificar

3.       Cajas de Texto (TextBox): se utilizan las mismas ya utilizados, es decir no sé modifica el formulario del artículo anterior. Los textbox no tienen propiedad Caption. Los nombres de la propiedad “Name”  para “ID”, “Producto”, “Cantidad” y “Descripción” son: Id, Producto, Cantidad y Desc respectivamente.

4.       Etiqueta (Label): las etiquetas utilizadas son tres, Label1, Label2, y Label3 cuyos Caption dentro de las propiedades son “ID”, “Producto” y “Cantidad” respectivamente.

5.       Caja de verificación (CheckBox): para esta aplicación se agrega una caja de verificación.  La propiedad Name es “suma” y la propiedad Caption es “Sumar”.
Es necesario aclarar que para simplificar y hacer algo intuitivo los temas de referencia,  se utiliza la aplicación de los conocimientos de VBA de la forma más básica posible para no confundir ya que no es la intensión enseñar teoria de sistemas ni hablar en lenguaje tan técnico. Esto porque  a alguién muy interiorisado en programación o en sistemas le puede parecer algo burdo o básico la forma en que se utiliza el código.
Por ejemplo, a los controles se los nombra de acuerdo a lo que es y la función que cumple . El boton de ingreso  se podria llamar “ingreso_button” y la etiqueda id “id_label”.  Es la forma correcta,  se utiliza para aplicaciones mucho más avanzadas en dónde los conocimientos de progrmación son mas avanzados. Para algo sencillo como en nuestro caso que intentamos introducir ideas nuevas, no es necesario.

Funcionamiento:
El funcionamiento es similar al que habíamos visto para el formulario de ingreso de datos, cuando deseamos ingresar un dato nuevo el formulario carga automaticamente, para este caso, un ID consecutivo ya que son numeros y se deben rellenar los campos , luego guardar nuevo.
Por otro lado, si queremos modificar un dato como el cursos se posiciona automaticamente en el campo ID, cuando le damos “BackSpace o tecla retroceso” el número se borra y se me habilitan dos botones nuevos, el botón buscar y el botón modificar. Una vez que ponemos un ID que suponemos existente pulsamos el boton buscar, encuentra los datos y una vez modificados se pulsa el boton modificar y los datos han sido modificados.
Cómo ves es muy facil este metodo, es por id. En otros artículos veremos luego otras posibles formas de búsqueda. Empezemos por lo más básico.

Proceso:
Vamos a  comenzar modificando el formulario que ya habíamos visto en un artículo anterior, luego vemos el código utilizado y para qué sirve.


Empezamos desde la pantalla anterior. Tenemos el formulario que ya teníamos al cual solo le vamos a agregar tres elementos nuevos, dos botones de comando y un checkbox o botón de verificación.
El Textbox del ID lo hacemos menos ancho para que entre el botón buscar. El botón modificar y el checkbox los insertamos debajo del textbox cantidad, si es necesario hacemos más grande el formulario.


Ya vimos la denominación de los elementos del formulario al principio del artículo con lo que pasaremos a ver los códigos y a describir que es lo que realizan.

Código:
Recuerden que al hacer doble click sobre el objeto dentro del editor de VBA nos lleva a la parte de edición del evento principal del objeto. Por ejemplo si es un command_button el evento es Click, etc.

INICIALIZACIÓN DEL FORMULARIO: esto código hace que al cargarse el formulario se inicie los objetos de determinada manera o con determinada propiedad. El código hace que al iniciar el formulario la propiedad Enabled (habilitar) del control se inicie en falso para el botón buscar y modificar y en verdadero para ingresar. Además hace que el ID tome el valor del último código ingresado y suma 1 para crear uno nuevo, en este caso.
Private Sub UserForm_Initialize()
 Buscar.Enabled = False
  ingresar.Enabled = True
  modifica.Enabled = False
Id.Value = Range("f2").Value + 1
End Sub

BOTON  GUARDAR NUEVO: este código hace lo que ya  habíamos visto en el artículo relacionado anterior.
Private Sub ingresar_Click()
     With Sheets("Stock productos")
         .Range("A" & 5 + Range("F2").Value).Value = Val(Id)
         .Range("B" & 5 + Range("F2").Value - 1).Value = producto.Value
         .Range("C" & 5 + Range("F2").Value - 1).Value = cantidad.Value
         .Range("d" & 5 + Range("F2").Value - 1).Value = desc.Value
     End With
 End Sub

BOTON CERRAR: este código hace lo que ya  habíamos visto en el artículo relacionado anterior.
Private Sub Cerrar_Click()
Unload Me
End Sub

BOTON BUSCAR: ATENCIÓN CON ESTE CODIGO QUE ES NUEVO!!!! Este código hace lo mismo que hacemos para buscar elementos de una base de datos con el BUSCARV. La diferencia es que lo hacemos con código desde el formulario y no desde celdas de la planilla.  Se utiliza dentro del objeto WorkSheetFunction el método Vlookup (BuscarV en Inglés). Se deben declarar las mismas variables habituales, tal como lo usamos comúnmente. Primero la variable a buscar, luego dónde buscar, luego  el indicador de columnas y luego si queremos coincidencia exacta o no.
Usamos el “On Error Resume Next” en este caso sin peligro ya que lo único que hace es evitarnos mostrar el error de un dato no encontrado. Cuando no encuentra un Id, no muestra resultado. Con el ID introducido buscamos los tres datos que necesitamos, el nombre del producto, la cantidad y la descripción.
Private Sub buscar_Click()
On Error Resume Next
producto.Value = WorksheetFunction.VLookup(Val(Id.Value), Sheets(1).Range("A5:D12"), 2, False)
cantidad.Value = WorksheetFunction.VLookup(Val(Id.Value), Sheets(1).Range("A5:D12"), 3, False)
desc.Value = WorksheetFunction.VLookup(Val(Id.Value), Sheets(1).Range("A5:D12"), 4, False)
End Sub

BOTON MODIFICAR: en este código primeramente declaramos una nueva variable denominada “bus_id”. Para declararla usamos el método “Match” (Coincidir en Inglés) que es el mismo de las formulas de Excel.  Nos arroja como resultado la fila dónde esta el dato que coincide con el introducido en ID. Es decir que compara el valor de Id con la columna de Id’s y nos dice dónde esta el valor buscado. Se utiliza un checkbox condicional para no tener que estar sumando manualmente una cantidad previamente introducida con un valor nuevo a cargar en el stock. Una vez ejecutado el comando se actualizan todos los valores correspondientes.
Recuerden que el With únicamente nos sirve para no tener que volver a declarar una parte del código, en este caso la hoja “Stock Productos”.
Private Sub modifica_Click()
bus_id = WorksheetFunction.Match(Val(Id.Value), Sheets(1).Range("A5:A12"), 0) + 4
    With Sheets("Stock productos")
        .Range("B" & bus_id).Value = producto.Value
    If suma.Value = False Then
        .Range("C" & bus_id).Value = cantidad.Value
    Else
        .Range("C" & bus_id).Value = Range("C" & bus_id).Value + cantidad.Value
    End If
        .Range("d" & bus_id).Value = desc.Value
    End With
End Sub

TEXTBOX ID: este código responde a un evento “Change” (cambio en inglés). Si cambia algo en el textbox id ejecuta las acciones declaradas. En este caso habilita los botones “Buscar y modificar” y deshabilita el botón “Guardar Nuevo”. Cómo con en las propiedades del textbox ID esta declarado como “0”, el focus del cursor esta en el textbox ID, al hacer backspace o tecla retroceso se borra el ID, se ejecuta el código y podemos introducir numero de ID nuevo.
Private Sub Id_Change()
If Val(Id.Value) = 0 Then
 Buscar.Enabled = True
 ingresar.Enabled = False
 modifica.Enabled = True
End If
End Sub

CHECKBOX SUMAR: este código hace que cuando cambia el estado del checkbox se vuelva el focus al textbox de cantidad y  se borre el valor anterior. Se borra el valor en el textbox no así en la base de datos, si actualizamos con el botón modificar se guarda el valor según cómo este el textbox. Si esta tildado suma al valor anterior sino lo reemplaza.
Private Sub suma_Click()
If suma.Value = True Then
cantidad.SetFocus
cantidad.Value = ""
End If
End Sub
-------------------------------------- FIN CÓDIGOS
Recuerden que los artículos algunas veces requieren un mayor o menor nivel de conocimiento en ciertos temas de Excel, por ejemplo formulas avanzadas, macros o VBA, etc. Sin embargo en los artículos se nombran todos los elementos y con esta información podemos hacer nuestras pequeñas investigaciones usando internet, así desarrollamos nuestro conocimiento. Por ejemplo si  utilizamos la función “Y”, que la suponemos conocida, y no sabemos ¿qué es? podemos buscar en internet para ver como se utiliza y cuales son los componentes. Las mini aplicaciones no son más que la recopilación de muchos elementos para dar forma a una nueva idea.

Con todos los elementos vistos podemos construir una aplicación interesante para gestionar datos mediante un formulario. Esperamos que les sirvan las ideas.

Pueden descargar algunos ejemplos (plantillas/templates) de la zona de Descargas. Si tienen alguna duda o consulta pueden hacerlo a través del formulario de contacto.

Les recomendamos que sigan el blog por alguno de los medios, mail o por redes sociales, para recibir las actualizaciones y novedades.

¡Éxitos!

Keys:
·         Formulario de entrada, modificación y búsqueda de datos
·         Altas, bajas y modificaciones con formulario
·         Formulario ActiveX de entrada de datos en Excel
·         Modificaciones de datos en formulario
·         Insertar buscar y modificar datos en Excel
·         Form de búsqueda captura modificación de datos en Excel

·         Agregar, editar, buscar y eliminar filas usando un formulario de datos.

65 comentarios:

Roberto González dijo...

Hola, buena tarde.

Respecto a este código, tengo problemas porque no me hace la búsqueda y sólo me manda mensajes. ¿me podrías explicar la parte donde dice Sheets(1)? ¿Cómo sale el número uno, o ´cómo hago referencia a donde está la base de datos?
Gracias.

Riszard

producto.Value = WorksheetFunction.VLookup(Val(Id.Value), Sheets(1).Range("A5:D12"), 2, False)

Juan Pablo Torres dijo...

Hola amigo, cómo estas!

Como dice el artículo esta código expresa lo mismo que expresa la formula BuscarV. Justamente se llama la función "worksheetfunction.Vloolup" de función de la hoja y buscarv. Entonces las variables si te fijas bien son las mismas.
Con respecto a Sheets(1) quiere decir la hoja 1.
Espero te hayamos podido aclarar el tema. Recuerda que también nos puedes escribir directamente desde el formulario de contacto. Saludos

apmacedo dijo...

Hola Juan, te felicito por el aporte.
He hecho un formulario sin embargo no me funciona el boton modificar.
en la funcion match que significa el +4?:
bus_id = WorksheetFunction.Match(Val(Id.Value), Sheets(1).Range("A5:A12"), 0) + 4

Juan Pablo Torres dijo...

Hola amigo, cómo estas!

Si te fijas bien esta variable arroja un numero que es de lugar en que coincide con lo buscado, le sumamos 4 seguramente para acomodar a como tenemos en la hoja los datos y sumar filas de arriba.
Espero te haya servido el comentario. Si quieres también nos puedes escribir directamente. Saludos

apmacedo dijo...

Hola Juan Pablo,

gracias por la aclaración. funcionó a la perfección.

saludos
Adriano

Roberto González dijo...

Private Sub Buscar_Click()
Hola de nuevo!

ya probé este código pero sigue sin funcionarme.

Private Sub Buscar_Click()
RFC.Value = WorksheetFunction.VLookup(Val(id.Value), Sheets(2).Range("D3:Z200"), 2, False)
NoPersonal.Value = WorksheetFunction.VLookup(Val(Nombre.Value), Sheets(2).Range("D3:Z200"), 3, False)

End Sub

pero me sigue mandando el mensaje

Se ha producido el error 1004 en tiempo de ejecución:
No se puede obtener la propiedad VLookup de la clase worksheet.function

Mi formulario lo puse en la hoja 1 y mis datos están en la hoja 2 pero en la ficha le puse el nombre de BASE

¿qué podrá estar fallando?

Gracias

Riszard

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Al parecer estas usando mal la formula, tienes que revisar que estén bien asignado los campos. Por ejemplo que en el primer campo del Rango que seleccionas para cada formula este el valor de búsqueda. Recuerda que nos puedes escribir directamente mediante el formulario de contacto. Saludos

Hildefonso Tirado S dijo...

Hola Juan, e tenido el mismo problema que Roberto Gonzales, al momento de realizar busquedas y modificaciones, y solo me funciona cuando trabajo con una sola hoja dentro del libro de excel, pero cuando trabajo con dos o tres hojas ya no me funciona y me manda el error 1004 o a veces me manda el error de no coinciden los datos... que debo hacer?
gracias de antemano.

Guga DK dijo...

podrias subir el programita para descargarlo xfavor si fueras tan amable esque tus codigos no me funcan

Juan Pablo Torres dijo...

Guga DK, todavía no esta disponible para descargar la plantilla. Esperamos tenerla muy pronto. Saludos

Rodrigo Mesina dijo...

Muchas gracias, me sirvio muchiisimo como base :D

Juan Pablo Torres dijo...

Hola Rodrigo! Muchas gracias por tus comentarios!
Esa es nuestra idea!! Que les sirva de Base de ejemplo, de...
Saludos!!

John Sánchez dijo...

Hola amigo...

tengo un inconveniente... todo me funciona perfectamente excepto el botón modificar,

el caso es que el valor de mis codigos no coincide con la posicion del dato, por lo tanto no puedo utilizar la funcion coincidir "match", porque por ejemplo mi codigo 10 esta en la fila 4 y el siguiente es el codigo 15 el de la fila 5.

sabes como solucionar esto?
te agradeceria mucho.. gracias

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por escribir!
En cuanto a tu consulta, creo que lo dice en el video o en los comentarios que siempre que sea numérico tu código, para que coincida tienes que hacer una suma o resta aritmética con el valor dentro del código así te coinciden los IDs. Recuerda que nos puedes escribir directamente mediante el formulario de contacto. Saludos

Aldemar Bernal dijo...

Cordial saludo,, si tengo dos botones de busqueda, como hago para que la funcion WorksheetFunction.VLookup no busuqe en la primera columna si no alguna que yo le asigen

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por escribirnos. Esa función funciona así, busca el primer dato que encuentra de la lista porque en realidad esta función de búsqueda para datos ùnicos. Si necesitas eso deberías estudiar otra alternativa. Se puede hacer algo similar a lo que hicimos en el search engine o motor de búsqueda sin macros. Revisalo en el blog. Esperamos tus comentarios. Saludos

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por escribirnos. Esa función funciona así, busca el primer dato que encuentra de la lista porque en realidad esta función de búsqueda para datos ùnicos. Si necesitas eso deberías estudiar otra alternativa. Se puede hacer algo similar a lo que hicimos en el search engine o motor de búsqueda sin macros. Revisalo en el blog. Esperamos tus comentarios. Saludos

Marcelo Pickelny dijo...

Hola Antes que nada gracias por estos tutoriales que me estan siendo muy utiles.
Yo les escribi comentandoles un problema con la opcion de busqueda. pues ya lo solucione, asi que dejo aca para otros que lo necesiten, como quedo mi formula

ApellidoNombre.Value = WorksheetFunction.VLookup((dni.Value), Sheets(1).Range("A2:K1048576"), 2, False)

Dr Cpu dijo...

Buen dia compañero, podrias darme el ultimo archivo? es que el link de esta pagina me envia a una descarga de un archivo anterior que no tienen la funcion de busqueda! osea el que explicas aqui!

te lo agradeceria mucho.

Dr Cpu dijo...

Buen dia compañero, podrias darme el ultimo archivo? es que el link de esta pagina me envia a una descarga de un archivo anterior que no tienen la funcion de busqueda! osea el que explicas aqui!

te lo agradeceria mucho.

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por comentar!
En cuanto a tu consulta, las plantillas disponibles por el momento están en la zona de descargas. Si encuentras algún link roto nos avisas. Saludos

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por comentar!
En cuanto a tu consulta, las plantillas disponibles por el momento están en la zona de descargas. Si encuentras algún link roto nos avisas. Saludos

Claudio Melendez dijo...

Muy Bueno, queria saber si se podria buscar cualquier dato de la base de datos que tengo, no solamente el ID

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por comentar! En realidad la opción de búsqueda ya la tienes que es el famoso "Ctrl + b" donde te aparece un formulario para buscar en toda la hoja. Lo que se puede hacer y se hace es usar esa misma herramienta creando primero una macro luego modificándola para usarlo en un formulario personalizado o como lo desees. Cosa que hemos hecho en otros artículos ya. Espero te hayamos respondido sino nos escribes nuevamente por aquí o mediante el formulario de contacto. Saludos

Ivan Dmitry Becerril dijo...

hola buen día
tu publicacion esta excelente sin embargo te agradeceria si me pudieses ayudar con lo siguiente:
al momento de agregar este codigo:
Private Sub UserForm_Initialize()
Buscar.Enabled = False
ingresar.Enabled = True
modifica.Enabled = False
Id.Value = Range("f2").Value + 1
End Sub

quiero entender que lo que estamos diciendole es que active o desactive los boptones desde el inicio de nuestro formulario y lo mas maravilloso es el Id.Value que tenia dias buscandolo para enumerar con numeros consecutivos cada fila tomando el valor que en tu table esta en f2 agregandole 1 con la formula de contara de excel para que cuantifique las filas elegidas

Sin embargo, tengo combboxes codificadas dentro de userform_initialize y me marca error al meter este codigo, de que forma lo puedo agregar?
ejemplo:

Private Sub UserForm_Initialize()

Me.CBACTO.AddItem "COMPRA VENTA SIMPLE"
Me.CBACTO.AddItem "FE DE HECHOS"

With Me.CBRESP
.AddItem "ORION (ORCG)"
.AddItem "OTROS"
End With
End Sub

agradezco mucho tu atencion y quedo en espera de tus comentarios

saludos cordiales

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por comentar!
En cuanto a tu consulta, si revisas la listas de artículos te daras cuenta que hay más de un artículo en que tratamos el tema de formularios y elementos. Hay un par de ellos que tratan sobre el combo e introducir los datos, revisarlos.
Cualquier cosa nos avisas. Esperamos tus comentarios.
Saludos

La forma sería la siguiente:
-----
Private Sub UserForm_Initialize()
ComboBox1.AddItem "A"
ComboBox1.AddItem "B"
ComboBox1.AddItem "C"
ComboBox1.AddItem "D"
ComboBox1.AddItem "E"
End Sub
-----
Link artículo: http://excelminiapps.blogspot.com.ar/2014/06/formulario-activex-con-combobox.html

Discapacitado dijo...

no puedo echar andar el ID . siempre me sale 1

Private Sub UserForm_Initialize()
btn_buscar.Enabled = False
btn_agregar.Enabled = True
btn_modificar.Enabled = False
txt_cod.Value = Range("k2").Value + 1
End Sub

Private Sub txt_cod_Change()
If Val(txt_cod.Value) = 0 Then
btn_buscar.Enabled = True
btn_agregar.Enabled = False
btn_modificar.Enabled = True

End If


tengo ambos, fallo en algo? gracias

Discapacitado dijo...

lo arreglé . ahora tengo el problema que aparecen 3 , 2, 1 y no en orden correlativo como seria lo correcto

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por comentar!
A veces es una cuestión de concepto, cuando entras a probar te das cuenta cómo es y lo captas. Seguramente lo lograras, sino nos escribes.
Saludos

Aaron Valdes dijo...

Hola juan pablo, buenas noches gracias por este tipo de publicaciones, me podrías ayudar, como te darás cuenta en el siguiente código lo he modificado, pero no encuentro el error que me arroja, podrías ayudarme? pienso que el inconveniente esta en el +4, lo he intentado pero no meda. gracias por tu ayuda

Private Sub MODIFICA_Click()

bus_id = WorksheetFunction.Match(Val(REGISTRO.Value), Sheets(2).Range("A5:q1000"), 0) + 4

With Sheets("CONTROL")
.Range("B" & bus_id).Value = FRECIBIDO.Value

.Range("C" & bus_id).Value = PROGRAMA.Value

.Range("d" & bus_id).Value = CODIGO.Value

.Range("E" & bus_id).Value = PROVEEDOR.Value

.Range("F" & bus_id).Value = PRODUCTO.Value

.Range("G" & bus_id).Value = GRAMOS.Value

.Range("H" & bus_id).Value = CANPEDIDA.Value

.Range("I" & bus_id).Value = CFACTURADA.Value

.Range("J" & bus_id).Value = CRECIBIDA.Value

.Range("K" & bus_id).Value = FALTANTE.Value

.Range("L" & bus_id).Value = CRECHAZADA.Value

.Range("M" & bus_id).Value = LOTE.Value

.Range("N" & bus_id).Value = FPRODUCCION.Value

.Range("O" & bus_id).Value = FVENCIMIENTO.Value

.Range("P" & bus_id).Value = CSOBRANTE.Value

.Range("Q" & bus_id).Value = CDONADA.Value

End With

Application.Run "'RECEP. E INVENTARIO MP.xlsm'!convmays"

End Sub

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por escribirnos!
En cuanto a tu consulta, nosotros siempre damos una recomendación en estos casos en que hay muchas variables en juego. Y es que lleven su idea al caso más simple posible y luego que les funciona trasladar a toda la idea. En este caso probaríamos primero en el formulario con un solo textbox por ejemplo. Por otro lado, cuando se usan funciones de Excel ,como en este caso que utilizamos la función "Coincidir" , recomendamos que en una celda de excel prueben la función y parámetros para ver que están bien seteados. En este caso si construyes la función coincidir que tienes (MATCH) en una celda te generará un error porque debes comparar un valor con una lista, y la lista que estas definiendo tienen dos o mas columnas, debería ser una única columna es la "A". Luego y por último el valor que pones luego para hacer la suma aritmética depende de dónde empiecen tus datos.
Esperamos te haya servido de ayuda nuestros comentarios. Esperamos los tuyos.
Saludos

Radek46v dijo...

Buenas!
Genial el tutorial, me ha servido mucho para hacer una base de datos de los productos fabricados, comprados, conjuntos de sub-productos y producto acabado de nuestra empresa.
Sin embargo tengo un problemilla con el botón modificar. Muchos de los valores no son números enteros. Si cargo la fila en el formulario y modifico un valor, al guardar, me redondea los valores. Esto solo me ocurre cuando modifico una fila, si la creo nueva todo funciona bien.
Me puedes ayudar?
Un saludo y de nuevo gracias por el tutorial.

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por tus comentarios!
En cuanto a tu consulta, puedes darle al valor que tomas del formulario con cualquier formato usando la función "format" en el código, que es lo mismo que usar la función "texto" en una celda. Pruébalo , no deberías tener problemas con eso.
Saludos

Jose Manuel Malave Guerra dijo...

Buenas noches amigo, desearía saber si me podría ayudar a encontrar una manera de crear una macro que me permita ubicar una celda (insertando anteriormente la cédula de un trabajador) y luego insertar unos datos en esa misma fila, pasando los datos que estaban en esta a otra fila. De antemano, muchas gracias. Y disculpe las molestias causadas.

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por escribirnos!
Con los lineamientos de este artículo lo puedes hacer sin problemas. Sobre todo buscar un elemento de la lista. Para el caso de cambiar los datos de esa fila a otra, puedes hacer ya que una vez que encuentras el elemento sabes donde esta. El tema estaría que hacer con los datos de esa fila, a que lugar llevarlos?
Esperamos tus comentarios.
Saludos

Jose Manuel Malave Guerra dijo...

Buenas, muchas gracias por su respuesta. La cosa es que estoy trabajando en base a una base de datos ya creada. Y necesito que al modificar los datos, los que estaban antes se vayan a una hoja igual a la original. (ir haciendo un historial con los datos que han sido modificados). Gracias de antemano

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por escribirnos!
Claro que se puede, lo haces grabando macros en gran parte y luego modificando.
Tienes que ver cómo harás para reconocer la celda donde esta el dato que tu quieres modificar, lo puedes hacer con doble clic sobre la celda o posicionando el cursos en la celda, o puedes hacerlo identificando la celda en una celda o ingresando en un formulario. Hay varias maneras, al comienzo deberías elegir la más sencilla. Luego para guardar el dato en el historial, lo haces como ya hemos hecho, Te ayudas de un "contar" para saber cuánto datos tienes y cuál es la última celda. Con eso ubicas la celda vacía y donde colocaras el dato. Creemos que nuestros artículos anteriores te servirán.
Esperamos tus comentarios.
Saludos

Psic. Nelly Juárez dijo...

Hola!
Muy claro todo, pero la verdad yo soy muy lega para estas cosas. Me pasa que pruebo el código para ingresar datos y no los va acumulando en la fila siguiente sino que lo guarda en la misma. ¿Qué estoy haciendo mal?
así lo tengo guardado:

Private Sub GUARDA_Click()

With Sheets("CONTROL")
.Range("A" & 12 + Range("R2").Value).Value = Val(EXPEDI)
.Range("B" & 12 + Range("R2").Value - 1).Value = FECHA.Value
.Range("C" & 12 + Range("R2").Value - 1).Value = CONSULTANTE.Value
.Range("D" & 12 + Range("R2").Value - 1).Value = ANIOS.Value
.Range("E" & 12 + Range("R2").Value - 1).Value = JOB.Value
.Range("F" & 12 + Range("R2").Value - 1).Value = REFERENCIA.Value
.Range("G" & 12 + Range("R2").Value - 1).Value = TELCASA.Value
.Range("H" & 12 + Range("R2").Value - 1).Value = CELULAR.Value
.Range("I" & 12 + Range("R2").Value - 1).Value = OTRO.Value
.Range("J" & 12 + Range("R2").Value - 1).Value = ER.Value
.Range("K" & 12 + Range("R2").Value - 1).Value = CORREO.Value
.Range("L" & 12 + Range("R2").Value - 1).Value = CALLYNUM.Value
.Range("M" & 12 + Range("R2").Value - 1).Value = COLONY.Value
.Range("N" & 12 + Range("R2").Value - 1).Value = DELEGAC.Value
.Range("O" & 12 + Range("R2").Value - 1).Value = MOTIV.Value
.Range("P" & 12 + Range("R2").Value - 1).Value = SEGUIMIENTO.Value
End With

End Sub

Te agradezco de antemano.

jhon pool ibarra bascuñan dijo...

Private Sub Buscar_Click()
RFC.Value = WorksheetFunction.VLookup(Val(id.Value), Sheets(2).Range("D3:Z200"), 2, False)
NoPersonal.Value = WorksheetFunction.VLookup(Val(Nombre.Value), Sheets(2).Range("D3:Z200"), 3, False)
sabes que ocupe ese codigo de busqueda pero no funciona para buscar de 1 hoja a otra en el mismo libro cual seria el codigo correcto

Juan Pablo Torres dijo...

Hola, Gracias por escribirnos!

Nelly, tienes que revisar este articulo y otro anterior. Recuerda que deberías primero grabar la macro básica y después modificarla. Antes de agregar el dato debes insertar una fila nueva arriba si es con macro, es la mejor forma para ti que eres inexperta. Hay otra forma con código que también la vemos en otros artículos.

Jhon, para otro hoja debes modificar el sheet().

Esperamos sus comentarios.

Saludos

Germán A. Burgos Rivero dijo...

hola buenas noches todo muy bien hasta ahora solo que me gustaria saber como al momento de ingresar los datos se puede indicar el tipo de dato que debe de ser es decir si es numero fecha o texto, porque al momento de realizar la busqueda siempre no me la realiza conlos ultimos datos ingresados porque lo agrega como texto en vez de numero y otro error es que al momento de buscar los que si puede buscar en las casillas de fecha no me muestra la informacion con el formato de fecha pero en la tabla de excel si esta como fecha

Private Sub ingresar_Click()


With Sheets("Entregas de Productos")

.Rows("5:5").Insert Shift:=xlDown

.Rows("5:5").Interior.Pattern = xlNone

.Range("A5").Value = Pedido

.Range("B5").Value = Cliente

.Range("C5").Value = Contacto

.Range("d5").Value = Telefono

.Range("e5").Value = Correo

.Range("f5").Value = Alta

.Range("g5").Value = Entrega

.Range("h5").Value = Observaciones


End With


End Sub

y el codigo de busqueda

Private Sub buscar_Click()
On Error Resume Next
Cliente.Value = WorksheetFunction.VLookup(Val(Pedido.Value), Sheets(1).Range("A5:h15000"), 2, False)

Contacto.Value = WorksheetFunction.VLookup(Val(Pedido.Value), Sheets(1).Range("A5:h15000"), 3, False)

Telefono.Value = WorksheetFunction.VLookup(Val(Pedido.Value), Sheets(1).Range("A5:h15000"), 4, False)

Correo.Value = WorksheetFunction.VLookup(Val(Pedido.Value), Sheets(1).Range("A5:h15000"), 5, False)

Alta.Value = WorksheetFunction.VLookup(Val(Pedido.Value), Sheets(1).Range("A5:h15000"), 6, False)

Entrega.Value = WorksheetFunction.VLookup(Val(Pedido.Value), Sheets(1).Range("A5:h15000"), 7, False)

Observaciones.Value = WorksheetFunction.VLookup(Val(Pedido.Value), Sheets(1).Range("A5:h15000"), 8, False)

End Sub

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por escribirnos!
En cuanto a tu consulta, es lo mismo que en una operación normal de excel usando las celdas. Tienes diferentes tipos de datos, numéricos, alfanuméricos, etc. Cuando haces una formula hay veces que debes indicarle que tipo de valor es. Para eso existen las formulas valor(), Texto(), Esnumero(), etc. En el código es similar, tienes "Val()", en vez de texto tienes "Format". Con este último puedes dar el formato que quieras de la manera, si fuera fecha por ejemplo. Format("dd/mm/yy").
Esperamos tus comentarios.
Saludos

sebastian gamez caviedes dijo...

Hola buenos días tengo un problema

Private Sub UserForm_Initialize()
Cmdbuscar.Enabled = False
Cmdaceptar.Enabled = True
Cmdmodificar.Enabled = False
Txtid.Value = Range("J4").Value + 1

end sub

con el Txtid.value = Range("J4").value + 1 dice que no encuentra el metodo y no compila y lo dejo asì Txtid = Range("J4").value + 1 y me sobreescribe los datos que ingreso al formulario

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por tus comentarios.
Revisa en la ayuda o busca en internet o en otro de nuestros artículos cómo definir un rango dentro del libro. Desconocemos cómo tienes organizado el libro pero hay veces que tienes que decirle en que hoja se encuentra. Por ejemplo definir "hoja1.range("A1").value". es una forma pero depende de cómo estés trabajando se puede definir de otra manera.
Esperamos tus comentarios.
Saludos

Miguel Angel dijo...

hola he visto tu articulo y me parece interesante pero a mi no me funciona
tengo una hoja llamada data el boton que llama al formulario esta en la hoja consulta, pero mis datos como el codigo que es el dato que consultare es un texto no numero y he tratado de cambiar tu formula y no me jala ya arme el formulario y todo pero en la programcion del boton busqueda al ingresar no jala nada apesar que hay datos me puedes ayudar

Cristian Esquivel dijo...

Hola amigo, tengo una duda, intento usar la parte de del código para modificar en mi formulario, pero me marca el error '1004':
No se puede obtener la propiedad Match de la clase WorksheetFunction.

Agradecería mucho tu ayuda, para saber cual es mi error y como puedo darle solución.

El código es el siguiente.

Private Sub cmbCambiaOKC_Click()
Dim id_nombre, idBusca As String
Dim fila As Integer
fila = 6
id_nombre = txtid
Do While idBusca <> id_nombre
fila = fila + 1
idBusca = Range("A" & fila).Value
If idBusca = Empty Then
MsgBox "Consecutivo Invalido"
Exit Do
End If

Loop

txtMaterial2 = Range("D" & fila).Value
txtLote2 = Range("F" & fila).Value
txtSolicitante2 = Range("H" & fila).Value
txtEmpresa2 = Range("Q" & fila).Value
txtContacto2 = Range("X" & fila).Value
txtTeléfono2 = Range("Y" & fila).Value
txtRemision2 = Range("AB" & fila).Value
txtPedido2 = Range("AC" & fila).Value
txtFactura2 = Range("AD" & fila).Value
txtFecha2 = Range("j" & fila).Value
txtNotas2 = Range("AE" & fila).Value

txtid = SetFocus


End Sub

Private Sub cmbOKC_Click()
bus_id = WorksheetFunction.Match(Val(txtid.Value), Sheets(1).Range("A7:A100"), 0) + 31
With Sheets("Registro")
.Range("D" & bus_id).Value = txtMaterial2.Value
.Range("F" & bus_id).Value = txtLote2.Value
.Range("H" & bus_id).Value = txtcmbSolicitante2.Value
.Range("Q" & bus_id).Value = txtEmpresa2.Value
.Range("X" & bus_id).Value = txtContacto2.Value
.Range("Y" & bus_id).Value = txtTeléfono2.Value
.Range("AB" & bus_id).Value = txtRemision2.Value
.Range("AC" & bus_id).Value = txtPedido2.Value
.Range("AD" & bus_id).Value = txtFactura2.Value
.Range("J" & bus_id).Value = txtFecha2.Value
.Range("AE" & bus_id).Value = txtNotas2.Value

End With

End Sub

Private Sub CommandButton1_Click()
Unload Me

End Sub


Private Sub UserForm_Click()

End Sub

David Abraham dijo...

Hola, antes que nada, excelente trabajo, es de mucha utilidad para quienes excel representa una herramienta diaria en nuestros trabajos. De verdad, tu trabajo es muy valioso!
Quería hacer una pregunta, quizás mi pregunta ya está respondida en otra publicación, en caso de ser así, por favor me dirías cual?

Deseo hacer dos formularios, el primero para ingresar datos, y el segundo para modificarlos y guardarlos. Por lo tanto dividi las formulas aquí vistas. Para el ingreso de nuevos artículos todo está excelente!

Para el registro de modificaciones tengo un problema: Mi intención es completar las filas ya grabadas con datos complementarios. Pero al buscar, para luego modificar, surge el problema de no poder usar un solo ID.

Te comento: El ID, en mi caso, se repite, dado que representa a un numero de comprobantes que contienen varios artículos diferentes, es decir, hay una fila por cada artículo con un mismo comprobante (ID) y Los artículos no pueden ser ID porque se repiten con otro comprobante (ID) diferente. La búsqueda solo es precisa cuando coinciden tres datos.

Pienso que al realizar la búsqueda debo utilizar una formula SI o Y- Para ingresar 3 datos y al buscar, me busque la posición de la fila donde coincidan los 3 parámetros buscados. y allí pueda COMPLETAR con otros datos y guardar. Podrías instruirme? Espero que se entienda.

Desde ya muchísimas gracias por todo el trabajo y el tiempo en responder cada pregunta.

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por escribirnos!
En cuanto a consulta, la idea de ID es una "una identificación único". Eso es lo que significa. Hay sistemas u otras cosas que pueden contener ID's porque en general también representa un número de pieza, objeto, etc. Es decir que se puede repetir. Sin embargo, siempre cuando nos referimos a ID es darle a cada elemento introducido en una base de datos un identificación única. Para tu caso, si hay Identificaciones iguales para tus productos, son elementos individuales así que deberías generar otra clave que sea única para cada elemento así no tendrás ese problema.
Esperamos tus comentarios.
Saludos

Dj J dijo...

Buenas, muy buen post. Tengo dos dudas
1- es como le doy formato a la fecha y monto:
Private Sub Ingresar_Click()
With Sheets("BD")
.Rows("3:3").Insert shift:=xlDown, CopyOrigin:=xlformat_fromabove
.Rows("3:3").Interior.Pattern = xlNone
.Range("A3").Value = codigo
.Range("B3").Value = fecha
.Range("C3").Value = descripcion
.Range("D3").Value = precio
.Range("E3").Value = (impuesto / 100) * precio
.Range("F3").Value = precio + .Range("E3").Value
.Range("G3").Value = proveedor
.Range("H3").Value = .Range("F3").Value / present
End With
codigo.Value = ""
fecha.Value = ""
descripcion.Value = ""
precio.Value = ""
impuesto.Value = ""
proveedor.Value = ""
present.Value = ""
End Sub

2- La parte de buscar la realiza bien, pero si le quiero modificar algo, me da error, no tengo el código completo:
Me indica que no se puede optener la propiedad Math de la Funcion:
Private Sub Modificar_Click()
ID = WorksheetFunction.Match(Val(codigo.Value), Sheets(1).Range("A2:I2000"), 0)
With Sheets("BD")
'.Range("B" & ID).Value = fecha.Value
.Range("C" & ID).Value = descripcion.Value
'.Range("D" & ID).Value = precio.Value
'.Range("E" & ID).Value = impuesto.Value
End With
End Sub


Gracias

Diego Flores dijo...

hola amigo, primero que todo te quiero dar las gracias por este tutorial que a servido muchisimo, te cuento que estoy intentando realizar la busqueda y modificar. En que consiste la busqueda debo ingresar el nombre de alguna persona y me debiese de devolver las responsabilidades que este posea (son mas de 1)

y use esta formula

Registro_historico.Value = WorksheetFunction.VLookup(Val(Lista.Value), Sheets("Historico actividades").Range("e22:g23"), 2, False)

pero me dice este error (deje el onerror modo comentario)

"Se ha producido el error 1004 en tiempo de ejecución:
No se puede obtener la propiedad VLookup de la clase worksheet.function"

Registro_Historico, es donde se almacenara el resultado de mi busqueda
lista, el nombre que estoy ingresando para despues realizar busqueda
Historico actividades, la hoja donde se encuentra la matriz

en que me puedo estar equivocando ?

Juan Pablo Torres dijo...

Hola DJ y Diego, cómo están ! Gracias por escribirnos!
En cuanto a sus consultas, vienen las dos por el mismo camino. Esas dos son formulas típicas de excel, esto quiere decir que en el código hay algo mal declarado en la formula. Quiere decir que la tienen que revisar con cuidado, ver si están bien puesto los valores. Por ejemplo en el buscarV hay siempre problemas con el tipo de dato de Ref. hay diferencias a si son números o no.
La recomendación que siempre damos es que se olviden del código y creen la formula de prueba en una celda común de excel para ver y estudiar los datos y como completar correctamente los campos.
Saludos

Deyvit dijo...

Hola buen día, Tengo una duda, tengo un archivo de una sola hoja llamada "Datos" realice un formulario similar al que me enseñaron en el tutorial, pero con mas campos, pero lo único que hace es buscar y modificar, el buscar me esta sirviendo a medias, por que quiero que me busque una cédula y no me la busca por que el formato es #-###-### o muchas veces #-##-## bueno varían mucho, pero coloque otro campo para que buscara que es un numero entero, Por otro lado el codigo de Modificar no me deja usar me sale un error, el codigo es el siguiente:

Private Sub Modifica_Click()
bus_Cedula = WorksheetFunction.Match(Val(Cedula.Value), Sheets("Altas").Range("A5:AF8002"), 0)
With Sheets("Datos")
.Range("W" & bus_Cedula).Value = RCB_Cupon.Value
.Range("X" & bus_Cedula).Value = Anticipo.Value
.Range("Y" & bus_Cedula).Value = Ven_instala.Value
.Range("Z" & bus_Cedula).Value = Prom_VM.Value
.Range("AA" & bus_Cedula).Value = VL_instala.Value
.Range("AB" & bus_Cedula).Value = rcb_fact.Value
.Range("AC" & bus_Cedula).Value = date_contr.Value
.Range("AD" & bus_Cedula).Value = date_orden.Value
.Range("AE" & bus_Cedula).Value = Vendedor.Value
.Range("AF" & bus_Cedula).Value = Instalador.Value
End With
End Sub

Como me podrian ayudar

Unknown dijo...

Buenas tardes,
Antes de nada agradecer su tutorial, está super bien explicado, sobretodo para mi que soy nueva en esto. Por el momento me surge una duda, tengo el dato que necesito trabajar como id en la celda H2 de la Hoja 3, esta celda, ya tiene la formula + 1 para que me indique el total de registros realizados.
He detectado que con el código:
TextBox1.Value = Range("H2").Value + 1
Me aparece siempre el 1, como le indico la hoja y la celda?
Y por otro lado, al darle al botón guardar y siguiente que lo tengo creado, necesito que me cambie el id por el nuevo número.
¿Qué código debería usar?
Espero haberme explicado bien y de nuevo gracias por sus tutoriales!

Dep.Sistemas Tmk dijo...

Disculpen!! Conseguí ambas cosas!!!
Declare rs como variable
Dim rs as Worksheet
Set rs = Worksheets("mi_hoja")
textbox1.value =rs.range("h2").value + 0
Y en el guardar y siguiente
Set rs = Worksheets("DATOS")
TextBox1.Value = rs.Range("H2").Text
Así lo actualiza al guardar!!
Gracias!

Juan Pablo Torres dijo...

Hola Gente , cómo están! Disculpen la tardanza en responder.
Básicamente una vez que tenemos la estructura básica probamos de acuerdo a lo que queremos. Por supuesto muchas veces no nos va a salir de primera pero probando varias veces y sobre todo estudiando el concepto de lo que hace el código "que es lo más importante" lo van a lograr. Para consultas también pueden escribirnos por el formulario de contacto!
Muchas gracias!

JOSE ALBERTO CHAVEZ dijo...

Hola, me ha servido de mucho el post. Sin embargo tengo un problema al modificar. No me permite dar de alta la función bus_id dice q es un error 1004 "no se puede obtener la propiedad match de la clase worksheetfunction

Gracias

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por el contacto!
En cuanto a tu consulta, si tira ese error es porque estas usando mal la función en la sintaxis. Es decir que debes revisarla bien.
Esperamos tus comentarios.
Slaudos

jhon jaimer dijo...
Este comentario ha sido eliminado por el autor.
jhon jaimer dijo...

Hola a todos alguien sabe como hacer la búsqueda de una forma diferente, trate de utilizar código que aparece aquí pero no me sirvió porque solo hace la búsqueda si el dato aparece en la primera columna "como buscarv", pero el problema es que no puedo mover la columna porque la necesito en la tercera posición alguien sabe como mas podría hacer la búsqueda.

Que se haga desde una caja de texto porque se debe introducir el dato, agradecería mucho su ayuda lo necesito realmente.

Private Sub buscar_Click()

On Error Resume Next
nombre.Value = WorksheetFunction.VLookup(Val(id.Value), Sheets(1).Range("A5:D450"), 2, False)
cedula.Value = WorksheetFunction.VLookup(Val(id.Value), Sheets(1).Range("A5:D450"), 3, False)
fecha.Value = WorksheetFunction.VLookup(Val(id.Value), Sheets(1).Range("A5:D450"), 4, False)
End Sub

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Así es, utilizas un buscarv porque si te fijas el código aparece "WorksheetFunction.VLookup" que es precisamente esa formula. Puedes usar otras formulas, como coincidir en donde cambiaría la sintaxis.
Esperamos tus comentarios.
Saludos

Guacare dijo...

Private Sub ingresar_Click()
With Sheets("Stock productos")
.Range("A" & 5 + Range("F2").Value).Value = Val(Id)
.Range("B" & 5 + Range("F2").Value - 1).Value = producto.Value
.Range("C" & 5 + Range("F2").Value - 1).Value = cantidad.Value
.Range("d" & 5 + Range("F2").Value - 1).Value = desc.Value
End With
End Sub

POR FAVOR ME PODRIAN EXPLICAR LO FUNCIONAL DE ESTOS MACRO

COLOQUE ESTE MISMO EN MI FORMULARIO Y EL INGRESO DEL PRODUCTO LO HACE EN LA FILA 5 (ES DECIR SE MONTA ARRIBA LA INFORMACION SI TENGO EL ID Nº 12 AL INGRESAR EL SIGUIENTE LO MONTA ARRIBA Y NO LO HACE CONSECUTIVO) Y NO CONSECUTIVO Y ESO QUE LO COPIE IGUAL AL HECHO POR UD PARA PROBARLO Y ADAPTARLO A UN PROYECTO QUE ESTOY HACIENDO

Juan Pablo Torres dijo...

Hola amigo, cómo estas! Gracias por escribirnos!
En cuanto a tu consulta, el artículo esta muy completo en cuanto a la explicación. Y también en la mayoría de las ocasiones utilizamos elementos vistos en artículos anteriores. En este caso, para que el código no sobrescriba la información tienes que decirle dónde ubicar el dato, eso lo haces con la primera parte, lo que esta antes del signo "=". Ahí es dónde debes probar y ver qué esta pasando.
Esperamos tus comentarios.
Saludos

Unknown dijo...

Hola el checkbox se puede cambiar por un botón y cual seria su macro

Alejandro dijo...

Muchísimas gracias por el tutorial.
Nunca he aplicado este tipo de funciones pero después de un rato de probar, al fin pude lograr lo que quería, es cuestión de analizar un poco las variables y listo.

De verdad, gracias a gente como uds que se toman el tiempo de explicarlo sencillamente.

Saludos

Juan Pablo Torres dijo...

Gracias Amigo, eres una persona muy amable.
Saludos