Bom dia pessoal
Tenho um código que calcula a fase da lua conforme uma data informada.
Entretanto não quero programação, quero fazer em fórmula do excel mesmo.
Só que dá dando um erro quando eu vou conferir com o calendário e com a função em VBA.
Public Const Synod = 29.53058867
Public Const BaseNewMoonDateString As String = "18/11/1998 9:36:00 pm"
'Test a date for moon phase:
'Returns:
' 0: Nada
' 1: Lua Nova
' 2: Quarto Crescente
' 3: Full moon
' 4: Quarto Minguante
Public Function MoonPhase(dDate As Date) As Integer
Select Case MoonAge(dDate)
'Day of a new moon
Case Is > Synod - 1:
MoonPhase = 1
'Day of a 1/4 moon
Case Synod / 4 - 1 To Synod / 4:
Debug.Print Synod / 4 - 1
Debug.Print Synod / 4
MoonPhase = 2
'Day of a full moon
Case Synod / 2 - 1 To Synod / 2:
MoonPhase = 3
'Day of a 3/4 moon
Case 3 * Synod / 4 - 1 To 3 * Synod / 4:
MoonPhase = 4
'No special day
Case Else:
MoonPhase = 0
End Select
End Function
Public Function MoonAge(dDate As Date) As Single
Dim BaseDate As Date
BaseDate = CDate(BaseNewMoonDateString)
'Debug.Print (dDate - BaseDate) - Synod
MoonAge = Remainder((dDate - BaseDate), Synod)
'Debug.Print MoonAge
End Function
Public Function Remainder(Number As Variant, DivideBy As _
Variant) As Variant
If Number = 0 Then
Remainder = 0
Else
Remainder = Number - DivideBy * Int(Number / DivideBy)
'Debug.Print Remainder
End If
End Function
No código temos duas constantes, uma o synod e outra uma data de referencia.
Fiz o seguinte:
Criei dois nomes com o valor das minhas constantes
SINODO = 29,53058867
DATA_BASE ="18/11/1998 9:36:00 pm"
Para verificar se meu calculo estava correto fiz por partes, calculando a idade da lua com fórmula e contrastando com o valor da função moonAge debugando-a.
Em A6 eu informei a data
Calcular a idade da lua =(A6-VALOR(DATA_BASE)-SINODO*INT((A6-DATA.VALOR(DATA_BASE))/SINODO))
No select case criei varios SE's aninhados para retornar o valor pretendido
Case 01 (retornar 01)
SE((A6-VALOR(DATA_BASE)-SINODO*INT((A6-DATA.VALOR(DATA_BASE))/SINODO))>SINODO-1;1(...)
Case 02 (retornar 02)
SE(OU((A6-VALOR(DATA_BASE)-SINODO*INT((A6-DATA.VALOR(DATA_BASE))/SINODO))=SINODO/4-1;(A6-VALOR(DATA_BASE)-SINODO*INT((A6-DATA.VALOR(DATA_BASE))/SINODO))=SINODO/4);2;(...)
Case 3 (retornar 03)
SE(OU((A6-VALOR(DATA_BASE)-SINODO*INT((A6-DATA.VALOR(DATA_BASE))/SINODO))=SINODO/2-1;(A6-VALOR(DATA_BASE)-SINODO*INT((A6-DATA.VALOR(DATA_BASE))/SINODO))=SINODO/2);3;(...)
Case 4 (retornar 04)
SE(OU((A6-VALOR(DATA_BASE)-SINODO*INT((A6-DATA.VALOR(DATA_BASE))/SINODO))*SINODO/4-1;(A6-VALOR(DATA_BASE)-SINODO*INT((A6-DATA.VALOR(DATA_BASE))/SINODO))*SINODO/4);4;(...)
Bem a fórmula completa aninhada é a seguinte:
=SE((A6-VALOR(DATA_BASE)-SINODO*INT((A6-DATA.VALOR(DATA_BASE))/SINODO))>SINODO-1;1;SE(OU((A6-VALOR(DATA_BASE)-SINODO*INT((A6-DATA.VALOR(DATA_BASE))/SINODO))=SINODO/4-1;(A6-VALOR(DATA_BASE)-SINODO*INT((A6-DATA.VALOR(DATA_BASE))/SINODO))=SINODO/4);2;SE(OU((A6-VALOR(DATA_BASE)-SINODO*INT((A6-DATA.VALOR(DATA_BASE))/SINODO))=SINODO/2-1;(A6-VALOR(DATA_BASE)-SINODO*INT((A6-DATA.VALOR(DATA_BASE))/SINODO))=SINODO/2);3;SE(OU((A6-VALOR(DATA_BASE)-SINODO*INT((A6-DATA.VALOR(DATA_BASE))/SINODO))*SINODO/4-1;(A6-VALOR(DATA_BASE)-SINODO*INT((A6-DATA.VALOR(DATA_BASE))/SINODO))*SINODO/4);4;0))))
Preciso da ajuda de vocês para mudar este código em fórmula conforme foi explicitado.
Abraço
Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel
Postado : 03/08/2010 7:32 am