Saltar al contenido

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

Enlace a comentario
Compartir con otras webs

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.

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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.

Enlace a comentario
Compartir con otras webs

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!

Enlace a comentario
Compartir con otras webs

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.

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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]

Enlace a comentario
Compartir con otras webs

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.

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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.

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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.

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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.

Enlace a comentario
Compartir con otras webs

Crear una cuenta o conéctate para comentar

Necesitas ser usuario para poder dejar un comentario

Crear una cuenta

Registrarse para una nueva cuenta en nuestra comunidad. ¡Es fácil!

Registrar una nueva cuenta

Conectarse

¿Ya tienes una cuenta? Conéctate aquí.

Conéctate ahora
  • 97 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      177
    • Comentarios
      90
    • Revisiones
      27

  • Crear macros Excel

  • Mensajes

    • Hola, Ya he podido, reoslverlo. Por favor dar por terminado, este tema. Muchas gracias Mariano
    • Buenas a todos, trato de transponer o pivotar el archivo que adjunto. El archivo tiene 3 columnas ( en este caso, como pueden ser más 😞 Cód.artículo, Cód.características y Valor. El objetivo es dejar como primera columna el Cód.artículo y como fila de encabezado Cód.características, y luego cruzando datos con Valor. No sé si me he explicado bien Gracias de antemano. Libro1.xlsx
    • Hola que tal amigos programadores por favor me podrían ayudar con una macro que me genere un archivo CSV delimitado por comas, la estructura del archivo CSV no deberá llevar encabezado, los datos del archivo CSV serán obtenidos de la hoja “Datos”. En la columna A: deberá tener la clave clues que se toma de la columna B de la hoja Datos En la Columna B: el Código (son 230 codigos que van del rango G1:IB1 de la hoja datos) En la Columna C: el valor almacenado a su correspondiente al código y clues En la Columna D: el número del mes que se obtendrá de la de la columna E de la hoja Datos En la Columna E: el año que se tomará de la columna F de la hoja de Datos   Son 230 códigos por lo que la macro generará 230 filas por cada clave clues que tenga la hoja Datos En el archivo anexo una hoja llamada CSV para que vean la estructura que tendrá, el archivo CSV estará delimitado por comas   Les agradecería mucho que me ayuden por favor, Dios los bendiga Exportar datos a csv.xlsx
    • Hola buenas tardes.   Debido al trabajo debo estar comparando en un periodo unos archivos dentro de una carpeta o subcarpeta. en base a la fecha de creacion o modificacion.  pero tengo que estar viendo carpeta por carpeta y aveces son varios. Con una macro intente  listar los archivos de cualquier carpeta y subcarpeta, esto activandolo segun la celdaactiva. El problema es que tiene algunos errores. 1. si la carpeta cuenta con subcarpetas me los manda a muchas filas abajo. Mi idea es hoja(Así debe quedar) Que con una macro pueda seleccionar la carpeta desde el buscador y me de la lista de archivos a partir de la fila 6. siendo columna A= fecha de modificación, columna B =Fecha de creación y columna C=Nombre del archivo con hiperlink. Con otro o con la misma macro poder seleccionar otra carpeta y sus subcarpetas, según sea el caso. y me liste a partir de la columna F de la fila 6 Siendo La columna F=Nombre del archivo, columna H=fecha de creación, columna I=ultima modificación   Para así poder acceder y comparar mis archivos, directamente desde excel.   Muchas gracias Mariano       Listar archivos de 2 carpetas para comparar.xlsm
    • Hola buenas, Os presento mis dudas. Tengo un libro  (llamémosle LibroDestino) con dos módulos, uno de definición de variables "ModDef" y otro de inicializacion de esas mismas variables "ModCfg". Necesito que al copiarme una hoja de otro libro(llamémosle LibroOrigen), mediante un procedimiento, sobrescribir el modulo de inicialización de variables del LibroDestino con el  contenido del módulo que hay en el LibroOrigen. Destacar que los dos módulos de cada libro tienen el mismo nombre "ModCfg". Y tienen una única variable llamada "Mensaje". En el LibroDestino tiene el valor "Hola" y en el LibroOrigen el valor "Adiós" Este procedimiento lo realiza perfectamente,  es decir se sobrescribe, pero si en el mismo procedimiento quiero utilizar el nuevo valor de esa variable, me conserva el valor de la variable anterior. Para hacer las comprobaciones he ejecutado un MsgBox al empezar y al acabar el procedimiento, pero en los dos casos me devuelve el valor original del LibroDestino el valor "Hola", cuando mi idea es que al sobrescribir el modulo con el nuevo valor de la variable, el último MsgBox me devuelva el valor "Adios". Mi objetivo es poder tener la inicialización de esas variables en un libro que no sea el de trabajo (LibroDestino), ya que según la hoja que importe puedo requerir que las variables tengan un valor u otro. ¿Por que no me coge en el procedimiento el nuevo valor de la variable? ¿Cómo podría conseguirlo? He tenido que activar en VBA  la referencia Microsoft visual basic for applications extensibility 5.3 desde  Herramientas -> Referencias. Creo que es la única manera de poder trabajar con los módulos desde VBA, aunque si se pudiera de otra manera creo que sería mas óptimo. Mil gracias de antemano, un saludo!         Libro1_Prueba.xlsm Libro2_Prueba.xlsm
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.