Red de conocimiento informático - Aprendizaje de programación - ¿Fórmula del calendario gregoriano de Excel al calendario lunar?

¿Fórmula del calendario gregoriano de Excel al calendario lunar?

Las funciones integradas de Excel no se pueden implementar perfectamente, al menos habrá problemas en el caso de los meses bisiestos.

Solo puedes considerar usar la programación VBA para personalizar una función.

Figura 1: Visualización de efectos:

Visualización de efectos

Figura 2: Diagrama de pasos:

Diagrama de pasos

p>

Figura 3: Diagrama de código completo:

Pasos:

1. Si el archivo está en formato .xlsx, debe guardarse como formato .xlsm, es decir, un libro de trabajo habilitado para macros.

2. Presione Alt+F11 para abrir el editor de código,

3. Haga clic en "Insertar"--"Módulo",

4. columna Haga doble clic en el módulo,

5. Pegue el código en el área de edición de la derecha,

6. Compruebe si el código informa un error y se vuelve rojo,

7. Cierra el editor de código.

Nota importante:

Nota 1. Baidu insertará líneas en blanco adicionales entre las líneas del código copiado desde aquí. Si esto hace que el error del código se vuelva rojo, puede simplemente eliminarlo. las líneas en blanco entre ellos.

Nota 2. Este código no es omnipotente. Tiene restricciones de rango de fechas y solo puede convertir el rango desde el primer día del primer mes lunar en 1921 al trigésimo día del duodécimo mes lunar en 2100. El rango correspondiente del calendario gregoriano es 1921/2/8 a 2100/2/8

Nota 3. Al usar fórmulas en tablas, puede escribir directamente una fecha en la fórmula o puede hacer referencia a la fecha en una determinada celda.

Ejemplo 1, convertir la fecha específica:

=iNlStr(DATE(2020,8,18))

Ejemplo 2, convertir siempre la fecha de hoy:

=iNlStr(TODAY())

Ejemplo 3, convertir fecha de referencia de celda:

=iNlStr(A1)

El código es el siguiente para que lo copie:

Opción explícita

Pública tf como booleana '

Pública sZhouJ como variante 'Matriz de semana

sTiGan público como variante 'conjunto de diez tallos celestiales

SDiZhi público como variante 'conjunto de doce ramas terrestres

SSXiao público como variante 'conjunto de doce signos del zodíaco

Public sNlMon As Variant 'Matriz de meses del calendario lunar

Public sNlDay As Variant 'Matriz de días del calendario lunar

Public sNlShu As Variant 'Matriz de datos del calendario lunar

Sub Cargar matrices ( )

sZhouJ = Split("*/lunes/martes/miércoles/jueves/viernes/sábado", "/") 'Matriz de semana

sTiGan = Split(" A / Yi / C / D / Wu / Ji / Geng / Xin / Ren / Gui", "/") 'Matriz de tallos celestiales

sDiZhi = Split("子/Chou/Yin/Mao/Chen /Si /Wu/Wei/Shen/You/Xu/Hai", "/") 'Matriz de ramas terrestres

sSXiao = Split("Rata/Buey/Tigre/Conejo/Dragón/Serpiente/Caballo /Oveja/Mono /Pollo/Perro/Cerdo", "/") 'Matriz del zodiaco

sNlMon = Split("*/Primer mes/febrero/marzo/abril/mayo/junio/julio/ocho meses /Septiembre/Octubre/Mes de invierno/Duodécimo mes lunar", "/") 'Matriz de meses

sNlDay = Split(_

"*/Primer día del mes lunar/Segundo día del mes lunar/Primer día del mes lunar Tercer/Cuarto/Quinto/Sexto/Séptimo/Octavo/Noveno/Décimo" _

& "/undécimo/duodécimo/decimotercero/decimocuarto/decimoquinto/décimo Seis/diecisiete/dieciocho/diecinueve/veinte" _

& "/veintiuno/veintidós/veintitrés/veinticuatro/veinticinco/veintiséis/veintisiete/veinte -ocho/veintinueve/treinta", "/") 'Matriz de días

sNlShu = Split( _

"002635/333387/001701/001748/267701/000694/002391/ 133423/ 001175/396438/" & _

"003402/003749/331177/001453/000694/201326/002350/465197/003221/003402/" & _

"400202/ 002901/ 001386/267611/000605/002349/137515/002709/464533/001738/" & _

"002901/330421/001242/002651/199255/001323/529706/ 003733 /001706/398762/" & _

"002741/001206/267438/002647/001318/204070/003477/461653/001386/002413/" & _

"330077/001197/002637/268877/003365/531109/002900/002922/398042/002395/" & _

"001179/267415/002635/661067/001701/001748 /3 98772/002742/002391/ 330031/" & _

"001175/001611/200010/003749/527717/001452/002742/332397/002350/003222/" & _

"268949/003402/003493/ 133973/001386/464219/000605/002349/334123/002709/" & _

"002890/267946/002773/592565/001210/002651/395863/001323/002707 /2 65877/" & _

"001706/002773/133557/001206/397998/002638/003366/335142/003411/001450/" & _

"200042/002413/723293/001197/002637/3 99 947/ 003365 /003410/334676/002906/" & _

"001389/133467/001179/464023/002635/002725/333477/001746/002778/199350/" & _

" 002359 /526639/001175/001611/396618/003749/001714/267628/002734/002350/" & _

"203054/003222/465557/003402/003493/330581/0 01386 /002669/264797/001325 / " & _

"529707/002709/002890/399018/002773/001370/267450/002651/001323/202023/" & _

"001683/462419/001706/002773 /330165/001206/002647/264782/003366/531750/"& _

" 003410/003498/396650/001389/001198/267421/002637/003349/138021 ",", ",", ","/","). data

tf = True 'Marca, la matriz ha sido cargada

End Sub

Función iNlStr(iDate As Date) As String 'Convierte el calendario gregoriano a lunar calendario

Si no es tf, entonces llame a cargar las matrices

Dim i%, t&, k%, m%, n%, text%, bit&

' Calcule desde 1921-2-8 (es decir, el primer día del primer mes lunar de 1921) hasta la fecha objetivo

t = iDate - #2/8/1921# + 1

'Calcular el valor del año, mes y día lunar

Hacer

Si Val(sNlShu(m)) < 4095 Entonces k = 11 De lo contrario k = 12

n = k

Hacer

'Obtener el valor de sNlShu(m) del enésimo bit binario

bit = Val(sNlShu(m))

Para i = 1 To n

bit = bit \ 2

Siguiente

bit = bit Mod 2

'Calcular el valor del día lunar

Si t <= 29 + bit Entonces

text = 1

Salir Hacer

Finalizar si

t = t - 29 - bits

n = n - 1

Bucle hasta n < 0

Si ext, entonces salga Do

m = m + 1

Bucle hasta falso

'Calcular los tres valores del calendario lunar

Dim cy%, cm%, cd%

cy = 1921 + m? año lunar

cm = k - n + 1 'El valor del mes lunar

cd = t ?'El valor del día lunar

Si k = 12 Entonces

Seleccione Case Val (sNlShu(m)) \ 65536 + 1 'Corregir el valor de cm

Case Is = cm

cm = 1 - cm

Caso es < cm

cm = cm - 1

Finalizar selección

Finalizar si

'Calcular texto chino

Dim ar( 1 To 5) As String

m = ((cy - 4) Mod 60) Mod 10 'Valor del índice Tiangan

n = ((cy - 4) Mod 60) Mod 12 'Ramas terrestres y valor del índice zodiacal

Si cm < 1 Entonces ar(1) = "Salto"

ar( 1) = ar(1) & sNlMon(Abs(cm)) 'Mes lunar

ar(2) = sNlDay(cd) 'Día lunar

ar(3) = sTiGan (m) & sDiZhi(n) ?'Rayos lunares

p>

ar(4) = sSXiao(n) ?'Zodíaco lunar

ar(5) = sZhouJ (Weekday(iDate, 2)) 'Caracteres chinos de la semana

' Coincide con los resultados de salida (consejo: matriz ar(1 a 5)***5 elementos, puede hacer coincidir libremente los resultados de salida según sea necesario)

iNlStr = ar(3) & "signo zodiacal del año" & ar(4 ) & " " & a

r(1) & ar(2) & "week" & ar(5) 'Resultados de salida

Función final