En la primer entrada sobre este asunto (link), vimos una de las cientos, o miles, de formas en que podemos solicitarle a Excel que nos "avise" cuando estamos frente a un determinada fecha. Pero un lector del blog necesita otra alternativa, misma que trataremos en la presente entrada.
Veamos la siguiente tabla:
[+/-] Ver el resto / OcultarLa primer columna hace referencia a la fecha en que un cliente debe abonar el interés de una cuota. La segunda posee la fecha del sistema (=HOY()), siendo que en la tercera, y mediante la función =SI(B2=A2;"ALERTA";""), logramos que Excel nos diga cuando ambas fechas son coincidentes. Noten el recuadro que realicé: las fechas de ambas columnas son iguales. La columna D no entendí bien para que es (jeje, todo no se puede) y en la última tenemos el importe a pagar.
Bueno, mi lector necesita que, al abrir el libro, un formulario le refleje todas las fechas que son idénticas, indicando el importe que el cliente debe abonar. Solucionaremos esto con un UserForm y un ListBox.
Empecemos.
Si queremos "que algo suceda" al abrir el libro....listo, VBA nos soluciona casi todo, dado que el Workbook posee un Sub para ello:
listo, cualquier código (válido) que incluyamos dentro ese procedimiento se ejecutará al abrirse el libro.
Sigamos.
Ahora debo:
1) Llamar a un formulario
2) Revisar las fechas de las columnas A y B
3) Si son coincidentes, darlas de alta en un ListBox.
Un UserForm posee muchas propiedades, métodos y eventos. Utilizaremos un evento en particular: Initialize, que se produce, como imaginarán, cada vez que se "inicializa" el formulario en cuestión. No confundir con "Activate": son parecidos, pero no tanto. "Activate" es cada vez que se "activa" el formulario: si llamo a dicho objeto se activa, pero si luego de esa acción aparece un MsgBox u otro formulario y vuelvo al primero.... se "activa" de nuevo. ¿Se entiende la idea? Solo se "inicializa" una vez, pero puede ser "activado" muchas veces.
Agregamos un UserForm al proyecto y dentro de el colocamos un ListBox:
Hacemos doble click sobre el formulario y una vez que estamos en su ventana de código elegimos el Sub Initialize, para escribir allí esto:
Private Sub UserForm_Initialize() Dim Uf As Long 'para determinar la ultima fila de la tabla Dim X As Long 'para el bucle 'almaceno la ultima fila ocupada de la tabla Uf = Cells(Cells.Rows.Count, 1).End(xlUp).Row 'ahora recorro con un bucle, desde la segunda fila '(por el encabezado de la tabla) hasta la última: For X = 2 To Uf 'si ambas celdas poseen valor: If Cells(X, 1) <> "" And Cells(X, 2) <> "" Then 'si ambos valores son fechas: If IsDate(Cells(X, 1)) And IsDate(Cells(X, 2)) Then 'y si las fechas son coincidentes: If Cells(X, 1) = Cells(X, 2) Then lstCuotas.AddItem Cells(X, 1) _ & " - abona: " & Format(Cells(X, 5), "currency") End If End If End If Next X End Sub
Vean que dentro del bucle For... hago una serie de "validaciones": si ambas celdas (de la columna A y B) tienen valores, si esos valores son fechas y, por último, si ambas fechas son iguales cargo el dato en el ListBox, al cual llamé "lstCuotas". Hago una concatenación:
lstCuotas.AddItem Cells(X, 1) & " - abona: " & Format(Cells(X, 5), "currency")en donde se aprecia que uno lo que hay en la primer columna con una palabra: abona, para luego juntarlo al valor existente en la quinta columna (importe), al cual le estoy dando el formato de moneda (currency)
El resultado:
todas las fechas del interés que coinciden con la fecha actual del sistema están dentro del ListBox
Nos dirigimos ahora al explorador de proyectos, hacemos doble click sobre "ThisWorkbook" (este libro) y seleccionando el sub Workbook_Open escribimos el siguiente código:
Private Sub Workbook_Open() UserForm1.Show End Sub
O sea: llamamos al formulario, quien en su evento Initialize lanzará el código ya mostrado.
Desconozco cuales serán los planes a futuro o si esa tabla podrá o no ser modificada, pero podríamos tranquilamente prescindir de la segunda columna, haciendo la comparación de fechas directamente desde VBA, de la siguiente forma:
If Cells(X,1) = Date Then
'codigo del ejemplo
End If
Lo que hice arriba es reemplazar la segunda columna (en donde se muestra la fecha actual del sistema) por la función Date de VBA, que hace exactamente lo mismo.
Espero que el ejemplo les sea de utilidad y puedan adaptarlo. No es difícil: con cambiar el número de columna dentro de Cells(fila, columna) ya se pueden lograr modificaciones "flexibles" que permitirán acomodarlo mejor al trabajo que estén realizando.
Un abrazo - link al archivo
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
como puedo achicar la hoja de un archivo de excel?
ResponderEliminarque tenga por ejemplo solo 20 columnas y 10000 filas?
hice un archivo de excel compartido para poder abrirlo en simultaneo desde 4 pc conectadas en red. ahora, cada vez que grabo los cambios, el archivo crece y crece aun sin realizar modificaciones hasta que se vuelve imposible de trabajar, y tengo que volver a crearlo de 0. sera que guarda info de control de cambios? cuando lo vuelvo a crear ocupa menos de 500k, y unmes mas tarde vuelve a pesar 10 o 15 megas
ResponderEliminarNo es posible. Podrías seleccionar las columnas que deseas ocultar e ir a formato /columna/ancho y darle un valor de cero. Luego haces los mismo con el alto de las filas. Esto hará invisibles dichas columnas y filas, pero no se pueden eliminar.
ResponderEliminarSobre el tamaño de los archivos de excel: http://support.microsoft.com/kb/930253/es
ResponderEliminarFijate si esa solución es viable y avisame, es un tema recurrente en archivos compartidos.
Hola Damian,
ResponderEliminarEXCELente!! trabajo...
Sin duda nuestro EXCELentísimo EXCEL no nos deja de sorprender!!
En particular me gustó mucho el Post sobre Algoritmos genéticos!! ya que tiene una buena base para seguir aprendiendo sobre IA.
Me chiflan esos temas si te pasas por mi Blog! tengo algo que puede servirte para animar más la cosa!!
Reconocimiento de Voz...
Hay un vídeo demostrativo en la sección videotutoriales!!
http://riverorobert.blogspot.com/
PD. El desarrollo web no es lo mío je je por lo que te encontrarás con un blog de novato aún, je je...
Un saludo y Feliz Navidad...
Gracias Roberto, muy muy bueno el blog, ya lo tengo en mis "favoritos". El tema de los AG es apasionante, casi sin fin y no hay muchos ejemplos en VB (en realidad nunca encontré ninguno, jaja) y x eso lo levanté.
ResponderEliminarUn excelente 2012 para vos y todos los tuyos.
Iré leyendo tu blog y seguramente te escriba. Un abrazo.
Muy bueno tu blog agregado a favoritos
ResponderEliminarmil gracias
Gracias a vos por tu mensaje.
ResponderEliminarUn abrazo.
Hola
ResponderEliminarSe podra que aparesca la suma de lo que se debe en el listbox,como seria?
como abrir userfor cuando llegue fecha determinada
ResponderEliminarsi, se puede. vas a necesitar hacer dos modificaciones en el código.
ResponderEliminarPrimero: dentro del último If..... vamos almacenando en una variable los valores de la columna "E"
If Cells(X, 1) = Cells(X, 2) Then
lstCuotas.AddItem Cells(X, 1) _
& " - abona: " & Format(Cells(X, 5), "currency")
valor=valor + cells(x,"E")
End If
Segundo: antes de terminar el procedimiento (End Sub). ahora tenemos que colocar la variable "valor" dentro del listbox:
lstCuotas.AddItem valor
y listo, debería funcionar sin problemas. Tené en cuenta que voy sumando los valores de la columna E (con Cells(X,"E")), si necesitas sumar otra columna, simplemente cambiá la letra.
Suerte y cualquier cosa me avisas.
Vamos a suponer que tienes en A1 una fecha: 12/01/2012. Vba es un lenguaje orientado a "eventos", por cuanto necesitaremos uno que sea el detonante y active al UserForm.
ResponderEliminarUn evento puede ser Workbook_Open() (cuando se abre el libro):
Sub Workbook_Open()
dim Fecha as date
Fecha = "aqui va la fecha en cuestion"
'y ahora comparo:
If Fecha = Sheets("Hoja1").Range("a1") then
UserForm1.Show
end if
End Sub
ese código también podría ser llamado al activarse una determinada hoja. En la ventana de código de la hoja en cuestión tenés que escribir:
Private Sub Worksheet_Activate()
dim Fecha as date
Fecha = "aqui va la fecha en cuestion"
'y ahora comparo:
If Fecha = Sheets("Hoja1").Range("a1") then
UserForm1.Show
end if
End Sub
la fecha podría ser tomada del sistema o de otras celdas, eso depende de tu proyecto, pero aquí te tiro una idea de como activar el formulario usando dos eventos.
cualquier cosa me avisas.
Damian buenas tardes primero felicitarte por la pagina es excelente me ha ayudado mucho. quisiera preguntarte, tengo en un libro varias hojas iguales que cada una tiene columna1: fecha pago, columna2 nombre banco, columna 3 intereses la primera hoja es para el banco 1 la siguiente banco2 etc ( cada banco tiene plazos diferentes). finalmente tengo una hoja resumen donde las junto mediante un igual y busco la celda para arrastrar el valor y cuando acabo de llenar el banco1 sigo en la fila siguiente con el banco2 y arrastro hasta tener una lista de todos los bancos y de este modo poder crear una tabla dinamica en donde me muestre la fecha de pago que banco es y el total resumido. ya tengo el msgbox que si cae la fecha de pago con la del sistema me arroje un msgbox pero mi pregunta es como juntar estas hojas automaticamente en una hoja resumen y que si cambio digamos la hoja1 en longitud se actualize la del resumen tambien y de este modo la tabla dinamica??. No hago funcion consolidar porque si dos creditos caen el mismo dia de pago me los suma y yo los necesito separados por cuanto es de cada uno por que las tasas son diferentes. mil gracias por tu ayuda espero haber sido claro sino vuelvo y te comento muchas graciass
ResponderEliminarDamian le pregunto como avisar dos dias antes y un dia antes de una fecha con un msngbox o con un formulario
ResponderEliminarmuchas gracias
Mirá este código:
ResponderEliminarDim F1, F2 As Date
F1 = Date
F2 = "26/02/2012"
f = DateDiff("d", F2, F1)
If Abs(f) = 2 Or Abs(f) = 1 Then
MsgBox "aviso de cumpleaños"
End If
con la función DateDiff le pido a VBA que me diga cuantos días ( "d", primer argumento) de diferencia hay entre las dos fechas (F1 y F2).
¿si? Luego vuelvo al resultado absoluto (con abs(), lo hago si o si positivo) y con un If... pregunto si la diferencia es igual a 2 o 1 día.
fijate se puedes adaptarlo a tu proyecto, si necesitas mas ayuda me avisas.
Daniel: muchas gracias por tu mensaje.
ResponderEliminarMe vendría muy bien que me pases el archivo (aunque sea una versión reducida del mismo), para conocer cabalmente la estructura y tipo de datos que posee, y así trabajar directamente sobre el ejemplo.
Envíamelo a la dirección de correo que figura al pié del formulario.
un abrazo
Felicidades Damian, super interesamte tu blog, muchas informaciones bien atinadas. Temgo un pequeño problema: Tengo una lista de personas que tienen que pagar en x fecha, pero yo quiero que excel me avise mediante un msbox dos dias antes, quienes tienen que pagar, que me de los nombres y su telefono (en cual tambien lo tengo en la tabla). Gracias mil.
ResponderEliminarPedro: si usaste mi código para hacer tu ejemplo lo que necesitas es sencillo de implementar.
ResponderEliminarSupongamos que la fecha está en la columna A.
for x = 2 to fin
if isDate(cells(x,"A")) then
if DateDiff("d",Cells(x,"A"),Date)=2 then
msgbox cells(x,"A") & cells(x,"B")
end if
end if
next
ese bucle recorre la tabla desde 2 hasta fin, en donde fin es el número de la última celda de la tabla. Si hay fecha en la Columna A, uso la función "DateDiff" de Visual Basic para calcular la diferencia entre esa fecha y la fecha del sistema (Date). Si es igual a 2, muestro un mensaje en donde concateno la columna A y la B.
Fijate que es muy fácil adaptarlo a tu proycto, solo debes cambiar que columna ir revisando (en dónde están las fechas) y que columnas se muestran en el MsgBox.
Cualquier cosa me avisas. Gracias x tu mensaje
Que tal damian mi consulta es como se podria aplicar a todo un libro de excel y que el resultado lo muestre en una sola ventana.
ResponderEliminar¿vos me estás preguntando si esa rutina se puede aplicar a todas las hojas de un libro? si, es factible, pero para trabajar mejor y mas seguro, todas las tablas de las hojas deberían respetar el mismo formato y estructura. ¿se entiende?
ResponderEliminarLuego con un bucle for each... se recorren todas las hojas, buscando en las tablas la misma información.
bajate este archivo de texto en donde te hice el ejemplo, copialo y pegalo en el proyecto:
https://sites.google.com/site/damianomarsilva2/ejemplo.txt
cualquier cosa me avisas. gracias x tu mensaje.
hola puedes darme la formula para si se cumple la condicion de que el valor que hay en dos columnas diferentes es el mismo, se muestre el contenido de toda la fila, al abrir el excel, gracias de antemanos
ResponderEliminargagnier: explícame un poco mas detalladamente que es lo que necesitas, así puedo ayudarte bien.
ResponderEliminar