lunes, febrero 04, 2008

Agregar datos en la primer fila libre de la tabla

Excel no es la herramienta más adecuada para manejar bases de datos. Pero cuando se trata de cantidades limitadas de datos y sin vínculos complicados, Excel puede ayudarnos.

Por lo general, lo que hacemos es construir en una hoja una tabla (o lista) a la cual iremos agregando datos. También podemos crear una especia de formulario en otra hoja usando controles y también usar validación de datos.

Un ejemplo de este tipo de "aplicación" ya hemos mostrado en la nota Agrupar controles botones de opción en hojas Excel.

Una de las consultas que recibo con cierta frecuencia es: "cómo hago para que al agregar datos a mi base de datos, lo haga en la primer fila libre de la tabla?"

El archivo del ejemplo de la nota mencionada incluye una macro (de hecho dos, una para cada método de crear el formulario) que realiza esa tarea.

La macro es muy sencilla y fácil de adaptar a todo tipo de aplicaciones. Para los lectores sin experiencia en Vba, daremos aquí una explicación de la macro.


Sub clientes_form()
    Dim linea_libre As Long

    Application.ScreenUpdating = False

    Sheets("Clientes").Select
       linea_libre = WorksheetFunction.CountA(Range("A:A")) + 1
       Cells(linea_libre, 1).Value = Sheets("Formularios").[I2]
       Cells(linea_libre, 2).Value = Sheets("Formularios").[I3]
       Cells(linea_libre, 3).Value = Sheets("Formularios").[I4]
    Sheets("Formularios").Select

    Application.ScreenUpdating = True

    MsgBox "Se ha agregado el cliente " & Sheets("Formularios").[I2]

End Sub

Empezamos declarando una variable que contendrá el número de la primer fila disponible

Dim linea_libre As Long

Para calcular cuál es la primer fila libre, seleccionamos la hoja Clientes

Sheets("Clientes").Select

y usamos en el código la función CONTARA de Excel para establecer el valor de la variable

linea_libre = WorksheetFunction.CountA(Range("A:A")) + 1

Luego fijamos los valores de las celdas en clientes

Cells(linea_libre, 1).Value = Sheets("Formularios").[I2]
Cells(linea_libre, 2).Value = Sheets("Formularios").[I3]
Cells(linea_libre, 3).Value = Sheets("Formularios").[I4]


y volvemos a la hoja Formulario

Sheets("Formularios").Select

Para evitar que Excel "parpadee" durante la corrida de la macro, usamos la orden Application.ScreenUpdating = False y al final de la macro, antes de la aparición el mensaje, reponemos Application.ScreenUpdating = True.

Esta macro está ligada al botón "Agregar Cliente" en la hoja Formulario.






Technorati Tags:

8 comentarios:

  1. Buenas Tardes!, mi consulta no esta relacionada con el tema, pero daod que he estado leyendo tus respuestas y las encuentro más que útiles, me gustaría consultarte respecto a una duda que ha surgido en mi trabajo. Allí utlizamos archivos que estan vinculados a otros en forma mensual, por ej: mi libro principal llamemosle A, se vincula a un libro 200802.xls en la fila que se corresponde con el mes de feb-08. El problema que tenemos es que queremos encontrar la forma en que mensualmente ese vinculo se edite en los meses venideros, es decir en la fila 2 que se corresponderia con mar-08, la celda b2 se vincule automaticamente con la ruta del archivo 200803. Sabes como ayudarme, Desde ya te lo agradecere. Sdos! Bárbara

    ResponderBorrar
  2. Hola Bárbara
    parece una tarea para la función INDIRECTO. Puedes leer esta nota sobre INDIRECTO y también ésta, que trata el tema de los vínculos a cuadernos cerrados.

    ResponderBorrar
  3. Con respecto a este ejercicio me quedo una duda, como hacemos cuando un dato ingresado se repite, hay manera de generar alguna advertencia?

    ResponderBorrar
  4. Muy Buenas Tardes!

    Ya hice todo....pero me aparece el siguiente dialogo
    "Object Required"

    quiero que excel agregue todos los datos que capture en una hoja a un listado...

    Esto hice:

    Sub Crear_Tarjeta_Roja_Form()
    Dim linea_libre As Long
    aplication.ScreenUpdating = False

    Sheets("Crear_tarjeta_Roja").Select

    linea_libre = WorksheetFunction.CountA(Range("B:B")) + 1
    Cells(linea_libre, 2).Value = Sheets("Crear_Tarjeta_Roja").[c5]
    Cells(linea_libre, 3).Value = Sheets("Crear_targeta_roja").[c6]
    Cells(linea_libre, 4).Value = Sheets("Crear_targeta_roja").[c7]
    Cells(linea_libre, 5).Value = Sheets("Crear_targeta_roja").[c8]
    Cells(linea_libre, 6).Value = Sheets("Crear_targeta_roja").[c9]
    Cells(linea_libre, 7).Value = Sheets("Crear_targeta_roja").[c10]
    Cells(linea_libre, 8).Value = Sheets("Crear_targeta_roja").[c11]
    Cells(linea_libre, 9).Value = Sheets("Crear_targeta_roja").[c12]
    Cells(linea_libre, 10).Value = Sheets("Crear_targeta_roja").[c13]
    Cells(linea_libre, 11).Value = Sheets("Crear_targeta_roja").[c14]
    Cells(linea_libre, 12).Value = Sheets("Crear_targeta_roja").[c16]
    Cells(linea_libre, 13).Value = Sheets("Crear_targeta_roja").[c18]
    Cells(linea_libre, 15).Value = Sheets("Crear_targeta_roja").[c19]
    Cells(linea_libre, 16).Value = Sheets("Crear_targeta_roja").[c20]
    Cells(linea_libre, 17).Value = Sheets("Crear_targeta_roja").[c21]

    Application.ScreenUpdating = True

    MsgBox "se ha agregado la targeta" & Sheets(Crear_Tarjeta_Roja).[c5]
    End Sub

    Apreciaria su comentario.

    ResponderBorrar
  5. En la sentencia
    aplication.ScreenUpdating = False

    hay un error de ortografía. Debe ser
    Application.... con dos "p"

    ResponderBorrar
  6. Muchas gracias por responder. Alguna vez habia visto este sitio, pense que no contestaria.

    Gracias.
    Ahora bien me sale un error

    Run-time error'9':

    Subscript out of range

    he consultado en internet pero la respuesta para solucionarlo no me queda clara.

    ResponderBorrar
  7. Te sugiero que sigamos la conversación por línea privada. Fijate en las condiciones en la pestaña Ayuda (en la parte superior del blog).

    ResponderBorrar
  8. Gracias, esto fue muy útil para mi.

    ResponderBorrar

Nota: sólo los miembros de este blog pueden publicar comentarios.