¿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/" & _ p>
"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 p>
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