Agregar datos en la primer fila libre de la tabla

lunes, febrero 04, 2008

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 comments:

Anónimo,  06 febrero, 2008 23:09  

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

Jorge L. Dunkelman 08 febrero, 2008 15:40  

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.

Manuel 28 julio, 2008 23:41  

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

Anónimo,  02 septiembre, 2010 23:12  

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.

Jorge L. Dunkelman 02 septiembre, 2010 23:57  

En la sentencia
aplication.ScreenUpdating = False

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

Anónimo,  03 septiembre, 2010 19:47  

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.

Jorge L. Dunkelman 03 septiembre, 2010 22:14  

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).

Anónimo,  05 octubre, 2013 17:51  

Gracias, esto fue muy útil para mi.

Publicar un comentario

Google+ Followers

Seguidores

Google+ Badge

Términos Legales

  © Blogger template On The Road by Ourblogtemplates.com 2009

Back to TOP