Jump to content
  • 33 ¿Te resultaría interesante una carpeta sobre Python para Excelen el foro?

    1. 1. ¿Te resultaría interesante una carpeta sobre Python para Excel en el foro?


      • Sí! Me interesa
      • No me interesa.
      • Otros (Escribe tu respuesta en el tema)

UDF: diasmes


Gerson Pineda

Recommended Posts

Hola!

No se si en el foro esta UDF ya fue proporcionada por alguien (no recuerdo haberla visto), pero de todos modos la dejo como un aporte (desde luego mejorable y pues como las UDFs son precisamente para ahorrarnos tiempo, espero sirva de algo:)), tambien es probable que se encuentre en algun lugar en internet, como dice un amigo por ahi, los problemas que aqui se presentan, ya alguien los enfrento antes y se los resolvieron:cool:

Sirve para ver los dias que contiene un mes cualquiera, solo es necesario digitar una fecha valida en Excel

Saludos a todos!

UDF diasmes.zip

Link to comment
Share on other sites

Gerson, tu fórmula y la UDF generan error #¡VALOR! cuando en las celdas no hay fechas.

=SI(A2="";"No es fecha valida";DIA(FIN.MES(FECHA(AÑO(A2);MES(A2);1);0)))[/CODE]

Una forma de asegurar que las fechas son válidas y que la celda tiene formato de fecha es ésta que devuelve un 0 en caso contrario:

[CODE]=SI(O(A2<1;A2>2958466;IZQUIERDA(CELDA("format";A2);1)<>"D");0;DIA(FIN.MES(A2;0)))[/CODE]

Esta fórmula chequea si el número decimal que representa la fecha está entre las fechas aceptadas por Excel, del 1-01-1900 00:00:00 al 31-12-9999 23:59:59 (más o menos)

Además comprueba que el formato de la celda sea del tipo fecha, comenzando con la letra D:

"D1" d-mmm-aa o dd-mm-aa

"D2" d-mmm

"D3" mmm-aa

"D4" d/m/aa o d/m/aa h:mm o dd/mm/aa

"D5" mm/dd

"D6" h:mm:ss a.m./p.m.

"D7" h:mm a.m./p.m.

"D8" h:mm:ss

"D9" h:mm

Propongo esta UDF:

[CODE]Public Function diasmes2(ByVal fecha As Variant) As Long
If IsDate(fecha) Then
diasmes2 = VBA.Day(WorksheetFunction.EoMonth(fecha, 0))
Else
diasmes2 = 0
End If
End Function[/CODE]

que se sirve de la función IsDate para comprobar si se ha introducido una fecha correcta.

Link to comment
Share on other sites

Hola Gerson

La fórmula de C2 ¿no sería más breve así?: =SI(A2="";"";DIA(FIN.MES(A2;0)))

Gerson y Pedro, yo de macros ¡Pez! Estoy buscando algún manual que se titule algo así como "Manual VBA para los que no tienen ni puñ... idea" pero no lo encuentro. Si sabéis de alguno...

Saludos

Link to comment
Share on other sites

Pedro como estas!

Si, me enrolle jeje con mi UDF, tu propuesta esta mas restringida/completa en el hecho que si no es fecha no arrojara error... tambien comentarte que no puedo probarla/valorarla ya que el office 2003 de mi trabajo es bastatante complicado, por cierto haber si me indicas que debo hacer para poder probar las UDFs ya que ni la tuya ni la mia me funcionan me tira error de valor... supongo va por el tema de las librerias? bueno tu me diras...

Fleming

Tienes razon me enrolle nuevamente con macros y formulas jeje no era necesario la funcion Fecha/Dateserial respectivamente, bastaba comprobar el ultimo dia del mes para reflejarlo con la funcion Dia

Saludos a ambos y que esten bien

Link to comment
Share on other sites

Hola Gerson, el problema es que EoMonth no está disponible por defecto en Excel 2003. Viene de serie en 2007 y 2010.

Me limito a buscar en el foro y encuentro que tú mismo te has respondido:

https://www.ayudaexcel.com/foro/f7/contar-solo-dias-laborales-excel-2003-a-7198/#post32666

Para activar el complemento: Ve a Tools->Add-Ins y marca Analysis ToolPak y presiona OK / Ve a Herramientas->Complementos y marca Paquete de herramientas de análisis y presiona aceptar.

Puedes obtener el último día del mes de esta otra manera para cualquier versión de Excel pero con la limitación de que fecha sea menor que el 1 de diciembre de 9999:

diasmes = VBA.Day(VBA.DateSerial(Year(fecha), Month(fecha)+1, 0))[/CODE]

Ya me dirás si te funcionan los dos métodos.

Link to comment
Share on other sites

Pedro

Para activar el complemento: Ve a Tools->Add-Ins y marca Analysis ToolPak y presiona OK / Ve a Herramientas->Complementos y marca Paquete de herramientas de análisis y presiona aceptar.

Ese no es mi problema, porque ya los tengo activados, la pregunta es mas a fondo, por eso te hice la consulta?

Y gracias por la nueva opcion, funciona

Saludos amigo!

Link to comment
Share on other sites

Hola,

antes que nada saludarlos, que me alegra poder hacerlo.

No sé si esté entendiendo algo, que últimamente ando un poco desorientado y no doy con nada, jajaj.

En todo caso me parece que en versiones anteriores a XL 2007 para usar la función eomonth (o cualquiera de la Herramienta de Análisis de datos) es necesario tener activado el complemento "Herramientas para análisis - VBA".

Por acá hay algo al respecto: https://www.ayudaexcel.com/foro/f10/macro-que-genere-aleatorio-14756/

Como la función es de la herramienta de análisis de datos, no se puede llamar con application.worksheetfunction, sino que habrá que usar algo así:

Public Function diasmes2(ByVal fecha As Variant) As Long


If IsDate(fecha) Then

diasmes2 = VBA.Day([COLOR="blue"]Evaluate("eomonth(" & fecha & ",0)")[/COLOR])

Else

diasmes2 = 0

End If


End Function[/CODE]

Bueno, todo esto sólo para versiones anteriores a XL 2007 y suponiendo que no esté perdido yo, acá hablando disparates.

Link to comment
Share on other sites

Mauricio

Que bueno saber de ti y pues mencionarte que algo asi buscaba con mi consulta y no se me ocurrio el paquete de VBA (mañana lo reviso en el office 2003 del trabajo), tambien probe tu UDF pero el resultado arrojado no es el deseado... talvez si le pegas una revisadita

Saludos mi estimado mjrofra:)

Link to comment
Share on other sites

...tambien probe tu UDF pero el resultado arrojado no es el deseado... talvez si le pegas una revisadita...

Gerson, me alegra saludarte.

Pues la UDF no es mía, en realidad ni sé qué hace :mad:

mi respuesta iba como respuesta a esto:

...tambien comentarte que no puedo probarla/valorarla ya que el office 2003 de mi trabajo es bastatante complicado' date=' por cierto haber si me indicas que debo hacer para poder probar las UDFs ya que ni la tuya ni la mia me funcionan me tira error de valor...[/quote']

al ver la UDF en la respuesta #2 dada por Pedro: Pegones: Respuesta #2, vi que en la UDF que el copió allí usaba Application.worksheetfunction.eomonth.... mi respuesta sólo cambia eso por lo que puse en azul: Evaluate("eomonth(" & fecha & ",0)") para que funcione en 2003 y anteriores, pero la verdad no tengo la menor idea de qué hace esa función o qué debe hacer :D.

Link to comment
Share on other sites

Por mi lado para ver las diferentes formas de conseguir el mismo resultado, y pues tambien puedo mencionar para no teclear formulas como esta:

=SI(O(A2<1;A2>2958466;IZQUIERDA(CELDA("format";A2);1)<>"D");0;DIA(FIN.MES(A2;0)))[/HTML]

Sino un simple como esto: =diasmes(A1)

Tambien recordar que se puede utilizar como complemetos/Add ins para usarlas en cualquier momento y en cualquier libro

Este aporte no tiene intenciones de suplantar ninguna funcion ni formula:)

Saludos a todos

Link to comment
Share on other sites

Para no teclear formulas como esta:

=SI(O(A2<1;A2>2958466;IZQUIERDA(CELDA("format";A2);1)<>"D");0;DIA(FIN.MES(A2;0)))[/HTML]

Sino un simple como esto: =diasmes(A1)

[font=Tahoma]1.-La formula me parece innecesariamente larga y volátil. No expongo otra opción ya que en el foro y googlenado se pueden encontrar infinidad de opciones.[/font]

[font=Tahoma]2-La simplicidad para escribir la formula UDF en la hoja se contrapone con el trabajo extra que se requiere para crearla, controlar los errores, implementarla en otros archivo, crear los complementos y activarlos en otras computadoras, etc. [font=Tahoma]Y sobre todo que las macros estén activadas para que funcionen, caso contrario simplemente no funcionaran[/font][/font]

[font=Tahoma]3.-Sin duda las UDFs son de mucha ayuda y en ocasiones inevitables pero desde mi punto de vista se debe de evitar su uso cuando no representen realmente una mejor opción que las formulas nativas.[/font]

[font=Calibri][size=3]Saludos[/size][/font]

Link to comment
Share on other sites

Me pregunto para que hace falta una UDF para obtener el resultado del total de dias de un mes?

Saludos

hola Saile,

pues yo no sé si haga falta, que todavía no me entero qué hace la UDF :D.

En todo caso, supongo que Gerson escribió una función sólo por el placer de escribirla. Nada mejor que Excel para experimentar un rato y pasar el tiempo, sin mayores pretensiones. Al final, creo que todo aporte es válido y ensaña algo.

Link to comment
Share on other sites

De acuerdo sailepaty, aunque ese trabajo que tu mencionas solo se hace una vez y bueno ya tu sabes el fondo de las UDFs... aunque por eso que se les denomina UDF funciones definidas por el usuario, es decir queda a gusto de cada quien, en mi caso no uso UDFs, mas que para ver el mundo desde otra perspectiva

Por otro lado me gusta invertir mas mi tiempo en crear formulas con funciones nativas y sino es posible... al final recurrir a VBA (que logicamente encierra las UDFs)

Saludos mjrofra

Link to comment
Share on other sites

Estoy con sailepaty que dónde esté una fórmula nativa que se quiten las UDFs.

Gerson, siempre se puede llamar desde una UDF a una fórmula nativa. La que te pasé en el post #4 para calcular el último día del mes fué ésta:

diasmes = VBA.Day(VBA.DateSerial(Year(fecha), Month(fecha)+1, 0))[/CODE]

que se convierte fácilmente en una fórmula para todas las versiones de Excel:

[CODE]=DIA(FECHA(AÑO(A1);MES(A1)+1;0))[/CODE]

Y se obtiene [b]el día anterior al primer día del mes siguiente[/b], ¡como tú querías! :mad:

La Función FECHA(año; mes; día) permite expresiones aritméticas y la posibilidad no muy documentada de que el [b]argumento día sea 0[/b], lo que equivale al día anterior al día 1.

Link to comment
Share on other sites

Hola

Aprovecho para saludar a todos y felicitarlos por tan acertados comentarios

La Función FECHA(año; mes; día) permite expresiones aritméticas y la posibilidad no muy documentada de que el argumento día sea 0, lo que equivale al día anterior al día 1.

Aqui tambien cabe decir, que permite el valor 0 y tambien negativos, en el sentido de que va descontando los dias, por ejemplo se puede cambiar el 0 por -1, -2,-3 y asi segun los dias que se deseen descontar.

saludos cordiales

Link to comment
Share on other sites

Gracias never por tu aclaración. Sólo apuntar que ya dije que los argumentos permiten expresiones aritméticas, lo que se sobreentiende como operaciones con números positivos y negativos.

Leyendo la documentación del argumento día de la

día Obligatorio. Número entero positivo o negativo que representa el día del mes, de 1 a 31.

Si el día es menor que 1, día resta la magnitud de la cantidad de días, más uno, del primer día del mes especificado.

A buen entendedor sobran palabras de lo que pasará si día = 0.

Creo que compartiréis conmigo que la verdad es que muchos argumentos de funciones en Excel están penosamente documentados e incluso sin documentar.

Link to comment
Share on other sites

Hola master pegones

Desde luego que comparto contigo lo que a bien explicaste, en español a veces no estan documentadas totalmente las funciones (inclusive en ocasiones ni en ingles, es algo que ya desde antaño se le ha criticado mucho a MS, claro ejemplo es la fución sifecha, que si no fuerse por que recurrimos a la historia, no nos dariamos cuenta de su existancia, prueba de ello es el escribir en el cuadro de buscaqueda de la misma ayuda de MS Excel la palabra sifecha; el resultado que devuelve es que no se encontro ninguna coincidencia... ), y si tienes toda la razón que al hablar de expresiones aritmeticas, ya estabas icluyendo tanto valores positivos como negativos, solo que lo mio no era apuntar que tus aseveraciones estaban incompletas o inconclusas, mas antes apoyarlas al incluir los valores negativos de forma explicita, buscando incrementar la curiosidad al respecto.

Ademas debo decir que cada que leo uno de tus comentarios me quedo maravillado por tan excelsas explicaciones, y no es que te este haciendo la barba (como decimos aca en méx), mas antes es solo es un comentario por medio del cual trato de reconocerte por lo menos en un poco todo el mérito de tan atinadas exposiciones.

Saludos cordiales

Link to comment
Share on other sites

Recapitulando Fleming, el argumento n, con el número de meses, puede ser un número absoluto mayor que 12 y no hace falta restringirlo a ABS(n) < 12.

FIN.MES(fecha_inicial;meses)

Meses es el número de meses anteriores o posteriores al argumento fecha_inicial.

Si B6 = 23/02/2008

=FIN.MES(B6;24) = 28/02/2010

O sea, dos años despúes (24 meses después) y lo mismo ocurre con los números negativos.

Link to comment
Share on other sites

×
×
  • Create New...

Important Information

Privacy Policy