Formulario de captura de datos en excel









Esta macro nos facilita el ingreso de datos hacia el Excel de una forma práctica y sencilla, como llevar datos a excel desde un formulario.


Primero creamos un formulario como se muestra a continuación.



A los cuadros de texto les ponemos los siguientes nombres (Name) en sus respectivas propiedades.

(Name)=TXTCODIGO
(Name)=TXTDESCRIPCION
(Name)=TXTSOTCK
(Name)=TXTPRECIO

Lo mismo para los botones cambiamos la propiedad (Name).

(Name)=CMDGRABAR
(Name)=CMDSALIR

El nombre del formulario también es muy importante.

(Name)=frminicio

No se olviden que desde la propiedad caption podemos poner  el nombre que se va a mostrar al usuario en dicho elemento.

¡Listo!, una vez hecho eso le damos doble clic al botón GRABAR para ir a visual basic y comenzar la programación de dicho botón, que es la siguiente.

Private Sub CMDGRABAR_Click()
Sheets("ARTICULOS").Select
NR = Application.WorksheetFunction.CountA(Range("A:A"))
If TXTCODIGO = "" Then
    MsgBox "INGRESE CODIGO"
    TXTCODIGO.SetFocus
        Exit Sub
End If
If TXTDESCRIPCION = "" Then
    MsgBox "INGRESE DESCRIPCION"
    TXTDESCRIPCION.SetFocus
    Exit Sub
End If
If TXTSTOCK = "" Then
    MsgBox "INGRESE STOCK"
    TXTSTOCK.SetFocus
    Exit Sub
    Else
    If Not (IsNumeric(TXTSTOCK)) Then
    MsgBox "EL STOCK DEBE SER NUMEROS"
    TXTSTOCK = ""
    TXTSTOCK.SetFocus
    Exit Sub
    End If
   End If
If TXTPRECIO = "" Then
    MsgBox "INGRESE PRECIO"
    TXTPRECIO.SetFocus
    Exit Sub
    Else
    If Not (IsNumeric(TXTPRECIO)) Then
    MsgBox "EL PRECIO DEBE SER NUMEROS"
    TXTPRECIO = ""
    TXTPRECIO.SetFocus
    Exit Sub
    End If
End If
Cells(NR + 1, 1) = TXTCODIGO
Cells(NR + 1, 2) = TXTDESCRIPCION
Cells(NR + 1, 3) = Val(TXTSTOCK)
Cells(NR + 1, 4) = Val(TXTPRECIO)
TXTCODIGO = ""
TXTDESCRIPCION = ""
TXTSTOCK = ""
TXTPRECIO = ""
TXTCODIGO.SetFocus
End Sub

Ahora vamos al Excel y desde la ficha programador vamos a insertar un botón de comando, también añadimos texto como se muestra en la siguiente imagen.




El nombre de la hoja le ponemos ARTÍCULOS, como se muestra en la imagen.




Ahora damos doble clic a nuestro botón para ir a visual basic donde aremos lo siguiente.




Su código es el siguiente:

Private Sub CMDINICIO_Click()
frminicio.Show   
End Sub

Del código tenemos lo siguiente:

NR = Application.WorksheetFunction.CountA(Range("A:A")), con este código lo que hacemos es decirle al visual basic que llame una función del excel que en este caso es la función contara, esta función cuenta los datos ingresados en la columna (A:A),siempre que llamemos a una función de Excel debemos colocarla en inglés.

TXTCODIGO.SetFocus, lo que hace este código es llevar el cursor de escritura a dicho cuadro de texto, If TXTCODIGO = "" Then, con este código le decimos si el cuadro de texto está vacío entonces, si se cumple la condición nos mandara un error, de lo contrario el programa continuara a la siguiente condición, nos obliga a escribir un dato en el cuadro de texto, también tenemos lo siguiente, If Not (IsNumeric(TXTPRECIO)) Then, con este código condicionamos a solo ingresar datos numéricos, de lo contrario mandara error, Cells(NR + 1, 1) = TXTCODIGO, con este código identificamos la celda donde se ubicara la información escrita en los cuadros de texto correspondientes.

frminicio.Show, abre el formulario para poder ingresar los datos.   






35 comentarios:

  1. Esto mismo exactamente pero necesito que los datos capturados se inserten en una hoja diferente a la hoja donde se llama la UserForm

    ResponderEliminar
    Respuestas
    1. cambia esto
      Sheets("ARTICULOS").Select
      en lugar de ARTICULOS puedes escoger la hoja que tu desees, hoja2, hoja3 o le pones el nombre que tu desees

      Eliminar
  2. cambia esto
    Sheets("ARTICULOS").Select
    en lugar de ARTICULOS puedes escoger la hoja que tu desees, hoja2, hoja3 o le pones el nombre que tu desees

    ResponderEliminar
  3. Hola Amigo buenas tardes, muy bien pero me da un error al tratar de guardar el primer registros mensaje: "Se ha producido el error '1004' en tiempo de ejecucion: Error en el metodo 'Range' de objeto _Global"

    Se detiene en la linea 2: NR = Application.WorksheetFunction.CountA(Range("(A:A"))

    Este es el siguiente codigo donde manda el mensaje:
    Private Sub cmdGuardar_Click()
    Sheets("Base").Select
    NR = Application.WorksheetFunction.CountA(Range("(A:A"))

    If ComboBoxname = "" Then
    MsgBox "Falta el Nombre"
    ComboBoxname.SetFocus
    Exit Sub
    ... continua.

    ResponderEliminar
    Respuestas
    1. ME pasa lo mismo a que se debe o como se corrige?

      Eliminar
    2. Es necesario declara NR como variable? y de que tipo ?

      Eliminar
    3. Son las comillas CountA(Range("A:A")) deben estar dentro de los paréntesis donde estas especificando el range.

      Eliminar
    4. aparte de las comillas, tiene un parentesis de mas(en la primera A) deberia quedar asi:

      (Range("A:A"))

      Eliminar
  4. TIENE LIMITE DE FILAS QUE SE PUEDAN COLOCAR? POR QUE CUANDO QUIERO PONER UN NUEVO ARTICULO ME DICE INSERTADO EN LA FILA 493 Y AL PONER OTRO LO PONE EN LA MISMA FILA

    ResponderEliminar
    Respuestas
    1. no tiene limite de filas, salvo que llenes todo el libro 1048576 filas en excel 2007 y 2010

      Eliminar
  5. ami tambien me los pone en la misma fila al llegar a un limite

    ResponderEliminar
  6. Buena tarde, finalice el código, pero en el momento que doy click al botón FORMULARIO INICIO, me sale un error 424 en tiempo de ejecución, cuando le doy depurar me traslada al fmrinicio.show, que puede estar mal?

    ResponderEliminar
    Respuestas
    1. verifica que este bien escrito el nombre del formulario y respetando las mayúsculas

      Eliminar
  7. HOLA..al ingresar los datos lo hace todos en la misma fila, borra los primeros e ingresa los siguientes, ayuda please

    ResponderEliminar
  8. hola buenas por que no puedo seguir, he añadido un txt y se me queda en TXTHOLA.SetFocus

    If TXTHOLA = "" Then
    MsgBox "pon algo"
    TXTHOLA.SetFocus
    Exit Sub
    End If

    ResponderEliminar
    Respuestas
    1. tal vez en la parte final te falta añadir
      Cells(NR + 1, 5) = Val(TXTHOLA)

      Eliminar
  9. lo que quiero poner es mas de cuatro, cuadros de texto(TXT)
    no me deja.

    ResponderEliminar
  10. MECESITO SABER COMO LE HAGO PARA QUE LOS CODIGOS NO SE REPITAN , QUE AL INSERTAR UN CODIGO , SI YA ESTA REGISTRADO ME MANDE EL MSJ QUE EL CODIGO YA EXISTE ,AUXILIO

    ResponderEliminar
    Respuestas
    1. http://macrosexcel.blogspot.pe/p/ingresar-datos-excel-desde-un-formulario.html

      Eliminar
  11. Tengo el siguiente código y me marca el error "Error de compilación, error de sintaxis".

    Private Sub Cbenviar_Click()

    If txtfecha = "" Or txthora = "" Or ListBoxjuego = "" Or ListBoxdisp = "" Or ListBoxso = "" Or ListBoxnav = "" Or txterror = "" Or txtanterror = "" Or txtcodigo = "" Or ListBoxmodo = "" Or listboxevidencia = "" Then MsgBox "Favor de llenar todos los campos", vbInformation, "Error de captura"

    Then
    Range("A" & Cells.Rows.Count).End(xlUp).Offset(1).Select
    ActiveCell = txtfecha.Value
    ActiveCell.Offset(0, 1) = txthora.Value
    ActiveCell.Offset(0, 2) = ListBoxjuego.Value
    ActiveCell.Offset(0, 3) = ListBoxdisp.Value
    ActiveCell.Offset(0, 4) = ListBoxso.Value
    ActiveCell.Offset(0, 5) = ListBoxnav.Value
    ActiveCell.Offset(0, 6) = txterror.Value
    ActiveCell.Offset(0, 7) = txtanterror.Value
    ActiveCell.Offset(0, 8) = txtcodigo.Value
    ActiveCell.Offset(0, 9) = ListBoxmodo.Value
    ActiveCell.Offset(0, 10) = listboxevidencia.Value

    End If

    MsgBox "Ticket registrado exitosamente", vbOKOnly, "Registro"
    txtfecha = ""
    txthora = ""
    ListBoxjuego = ""
    ListBoxdisp = ""
    ListBoxso = ""
    ListBoxnav = ""
    txterror = ""
    txtanterror = ""
    txtcodigo = ""
    ListBoxmodo = ""
    listboxevidencia = ""
    End If

    End Sub

    ResponderEliminar
  12. Hola buenas tardes, que excelente trabajo, te agradezco mucho. Me gustaría saber si hay una forma de llenar un número limitado de datos y pasando ése número, se limpié la hoja y se inicie de nuevo.

    ResponderEliminar
  13. Excelente contribución, muchas gracias por compartir tus conocimientos. Tengo una consulta, después de digitar el código, pongo TAB para que me lleve al siguiente recuadro, pero se va al botón ACEPTAR, que estaré haciendo mal? :-(, porfavor ayúdame. gracias.

    ResponderEliminar
    Respuestas
    1. en visual basic selecciona el formulario, luego vas al menu ver/orden de tabulacion y alli pones el orden que gustes

      Eliminar
  14. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  15. Gracias por el aporte,
    Pero tengo una duda, ¿porque cada vez que intento guardarlo me pide que lo guarde como un archivo Nuevo?

    ResponderEliminar
    Respuestas
    1. guarda el archivo como un libro de excel habilitado para macros

      Eliminar
  16. Hola, gracias por tu aporte. Consulta usando la misma programación, ¿Como elijo desde que fila y columna que yo necesite empiece a registrar los datos? ejemplo que los datos comience a registrar desde la fila 10 y la columna b

    ResponderEliminar
  17. gracias muchacho, sos un mazo! mi Dios te proteja!!

    ResponderEliminar
  18. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  19. Hola buenos días, cuando trato de probar el tablero y cargar los primeros datos me sale se ha producido el error 424 en tiempo de ejecución. Se requiere un objeto
    y sale un cursor amarillo en la siguiente linea
    TXTRECETARIO.SetFocus

    ayuda por favor... gracias

    ResponderEliminar
  20. Walter ya solucione el problema anterior, necesito consultarte como debo programar uno de los campos para que solo me reconozca fechas, es decir que me salga la leyenda que el campo debe ser una fecha y no admita texto o números sin las correspondiente / o -
    Saludos.

    ResponderEliminar
  21. Walter como hago para que uno de los TXT me valide y acepte fechas en el siguiente formato ##/##/####.
    Saludos.

    ResponderEliminar
  22. Hola buenas tardes yo tengo una duda para hacer que me muestre un mensaje en el formulario cuando ingresé un dato duplicado

    ResponderEliminar