Bueno, ya lo hice pero a medias, y ya no me merece la pena seguir haciendolo (por ahora), el asunto era hacerlo de forma mas sencilla, porque hacer el calculo es un "chongo". No es lo mismo que 1 mes tenga 4 semanas porque 4 semanas tampoco hacen 1 mes, segui haciendolo con la excusa de poner (por ejemplo): "Aproximadamente 3 meses, 2 semanas" pero no, no merece la pena.
Lo que pasa es que tengo un modulo que hace una proyección de venta, y el programa calcula por ejemplo que tiene 47 dias de stock. Pero poner 47 no es tan "imaginable" para el cliente que poner: "1 mes, 2 semanas y 3 dias" (esto le resulta mas "imaginable").
'YAcosta
Private Function MesSemDia(dias As Integer)
Dim xDia As Integer
Dim xSem As Integer
Dim xMes As Integer
Dim diasRest As Integer
lDia = " 1 dia"
lSem = " 1 semana"
lMes = " 1 mes"
Select Case dias
Case Is < 7: MesSemDia = sDia(dias)
Case Is < 30
If dias Mod 7 = 0 Then
If dias = 7 Then MesSemDia = sSem(1) Else MesSemDia = sSem(dias / 7)
Else
xSem = Int(dias / 7)
diasRest = Round(((dias / 7) - xSem) * 7, 0)
MesSemDia = sSem(xSem) & " y " & sDia(diasRest)
End If
Case Is >= 30
If dias Mod 30 = 0 Then
If dias = 30 Then MesSemDia = sMes(1) Else MesSemDia = sMes(dias / 30)
Else
xMes = Int(dias / 30)
diasRest = Round(((dias / 30) - xMes) * 30, 0)
If diasRest >= 7 Then
If diasRest Mod 7 = 0 Then
If diasRest = 7 Then
MesSemDia = sMes(xMes) & " y " & sSem(1)
Else
MesSemDia = sMes(xMes) & " y " & sSem(diasRest / 7)
End If
Else 'aqui se me jode en los dias 58, 88, 118...etc
xSem = Int(diasRest / 7)
diasRest = Round(((diasRest / 7) - xSem) * 7, 0)
MesSemDia = sMes(xMes) & " y " & sSem(xSem) & " y " & sDia(diasRest)
End If
Else
MesSemDia = sMes(xMes) & " y " & sDia(diasRest)
End If
End If
End Select
End Function
Private Function sDia(dias As Integer) As String
If dias = 1 Then sDia = " 1 dia" Else sDia = dias & " dias"
End Function
Private Function sSem(sem As Integer) As String
If sem = 1 Then sSem = " 1 semana" Else sSem = sem & " semanas"
End Function
Private Function sMes(mes As Integer) As String
If mes = 1 Then sMes = " 1 mes" Else sMes = mes & " meses"
End Function
Asi que tire la toalla y daré al cliente la forma ortodoxa y mas sencilla: La fecha final con esta simple linea:
Label1 = "Tiene Stock hasta el: " & DateAdd("d", NumeroDias, Date)
y ya, a dormir.