Notifications
Clear all

Calculo para o retorno da Fases da Lua

3 Posts
1 Usuários
0 Reactions
4,105 Visualizações
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

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
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa tarde Luthius,

Tem um artigo no meu blog sobre como criar funções globais no Excel:

http://excelavancado.wordpress.com/2010/07/22/criando-funcoes-proprias-globais/

At.

Marcos Rieper

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 17/08/2010 10:18 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

experimente por esta formula na celua (sem as quebras de linha) - Esta rotina não contempla as variações de longitude e latitude (hemesferio norte e sul - e ocidente e oriente), para tanto a constante $k$1 deve ser tratada.

=SE(MOD(A3-$K$1;29,53058867)>28,53058867;1;
SE(E(MOD(A3-$K$1;29,53058867)>=6,382647;MOD(A3-$K$1;29,53058867)<=7,382647);2;
SE(E(MOD(A3-$K$1;29,53058867)>=13,76529;MOD(A3-$K$1;29,53058867)<=14,76529);3;
SE(E(MOD(A3-$K$1;29,53058867)>=21,14794;MOD(A3-$K$1;29,53058867)<=22,14794);4;""))))

onde:
$K$1 = 18/11/1998 21:36:00
A3 = data a ser avaliada

o "" pode ser substituido por qq outra coisa como 0... se vc utilizar algum fonte que tenha os desenhos da lua, tb pode substituir
1: Lua Nova
2: Quarto Crescente
3: Lua Cheia
4: Quarto Minguante

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 29/10/2010 5:09 am