Contar numero de semanas en Excel con VBA

Quisiera saber un ejemplo de como poder contar el numero de semanas en el excel con visual empezando la semana desde el día viernes agradezco su respuesta.

2 respuestas

Respuesta
1

.30/08/16

Buenas, Jhon

MS Excel cuenta entre sus complementos con la función NUM.DE.SEMANA(<fecha>; <inicio>).

(Tales complementos son Herramientas para Análisis y Herramientas para Análisis - VBA)

Así para determinar el número de semana de una fecha -supongamos en la celda "D2"- considerando el viernes como inicio, usaría una fórmula como la siguiente:

=NUM.DE.SEMANA(D2;15)

Entonces para contar la cantidad de semanas entre dos fechas, podrías hacer la diferencia de los números de semanas de la fecha final y de la fecha inicial.

Ahora bien, para llevar ese cálculo a VBA, deberías usar una instrucción como la siguiente:

FechaIni = "C6" ' celda donde está la fecha inicial
FechaFin = "D6" ' celda donde está la fecha final
IniSem = 15 ' para viernes
CantSem = Application.WorksheetFunction.WeekNum(Range(FechaFin).Value, IniSem) - Application.WorksheetFunction.WeekNum(Range(FechaIni).Value, IniSem)

Espero que esta solución te sirva.

Un abrazo
Fernando

.

hola de antemano muchas gracias por tu atención y si el rango fuera un textbox de mi formulario 

como declararía ese código pues mi idea es que al digitar una fecha en un texbox y que en el otro textbox me muestre el numero de semana 

.

Hola, de nuevo

En el caso que mencionas, este podría ser el modo de incorporarlo.

Sólo que como no creo que quieras modificar el resultado de la fórmula propuesta, en lugar de un mostrarlo en un "textbox", sería mejor que fuera un "label".

En tal caso, intenta integrar esta instrucción en tu formulario:

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Label1.Caption = Application.WorksheetFunction.WeekNum(CDate(TextBox1), 15)
End Sub

Desde luego, depende de cómo venga tu código y qué controles haces sobre el textbox, pero creo que entenderás la idea.

Saludos

Fernando

.

Hola muchas Gracias ,me sirvió de mucho tu ejemplo lo hice de esta forma pero ahora quisiera que me ayudaras ah ponerle un msgbox ps eh intentado pero no me funciona gracias por la ayuda estoy aprendiendo y tus soluciones me sirven mucho de antemano gracias.

Private Sub txtFecha_Ini_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Me.txtSemana = WorksheetFunction.WeekNum(VBA.CDate(Me.txtFecha_Ini), 15)
End Sub

.

Qué tal! Jhon

Me cuesta entender a qué te refieres con un Msgbox, porque esa herramienta suele usarse fuera de los formularios. Y me parece que quieres tenerlo dentro del tuyo.

En tal caso, la solución será similar a la que te dí anteriormente:

Private Sub txtFecha_Ini_Exit(ByVal Cancel As MSForms.ReturnBoolean)
txtSemana.Caption = WorksheetFunction.WeekNum(VBA.CDate(Me.txtFecha_Ini), 15)
End Sub

Asumiendo que txtSemana es un elemento tipo "label" en tu formulario.

Espero haberte interpretado correctamente.

Abrazo

Fernando

.

Respuesta

Para ello puedes usa la función DateDiff, la cual te devolverá la cantidad de días, semanas, mese o anos transcurridos entre dos fechas, te dejo acá una forma fácil de usarla, solamente agrega una función en un modulo y podrás usarla en libro.

Esta función tiene cinco parámetros, los dos últimos son opcionales pero usaremos uno de ellos, para indicar el dia en que empieza la semana.

DateDiff( interval, date1, date2, [firstdayofweek], [firstweekofyear] )
  • interval: Indica en que tipo de intervalos quieres la cuenta, días, semanas, anos etc.  Para este caso usaremos "ww" para indicar semanas.
  • Date1 y date2: Las fechas inicial y final respectivamente.
  • Firstdayoftheweek: es un parámetro opcional, para indicar el día que empieza la semana, en este caso lo usaremos para establecer que empieza el viernes (vbFriday).
  • (La información adicional como firsrweekofyear, o como establecer la cuenta en días o anos, te las dejo de tarea).

Ejemplo:

Function cantSemanas(fecIni As Date, fecFin As Date) As Long

           cantSemanas = DateDiff("ww", fechaIni, fechaFin, vbFriday)

End Function

Es importante aclarar que el resultado sera la cantidad de viernes que han pasado entre las dos fechas, es decir si la primera fecha es jueves, y la segunda es sábado, pero solo han pasado tres días, se contara ese viernes como una semana, si eso es un problema puedes validar primero si la primera fecha para ver si es necesario restarle al resultado una semana.

Otra forma de hacerlo es contar la cantidad de días entre las fechas y dividirlas entre 7, considerando el día de cada fecha con la función WeekDayName(). Para ajustar a lo requerido.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas