¿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. -Haga 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,
<. p>7. Cierre el dispositivo de edición 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, simplemente puede 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 utilizar 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/Día", "/") 'Matriz de semana
sTiGan = Dividir ("A / Yi / B / D / Wu / Ji / Geng / Xin / Ren / Gui", "/") 'Matriz de tallos celestiales
sDiZhi = Split("Zi/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 Mes/Septiembre/Octubre/Mes de invierno/Duodécimo mes lunar", "/") 'matriz de meses
sNlDay = Split(_
"*/primer día/segundo día/primer día Tercero/Cuarto/Quinto/Sexto/Séptimo/Octavo/Noveno/Décimo" _
amp; "/Once/Doce/Trece/Catorce/Quince/ Dieciséis/diecisiete/dieciocho/diecinueve/veinte" _
amp; "/veintiuno/veintidós/veintitrés/veinticuatro/veinticinco/veintiséis/veintisiete/veintiocho /veintinueve/treinta", "/") 'Matriz de días
sNlShu = Split( _
"002635/333387/001701/001748/267701/000694/002391/ 133423/001175/396438/" amp; _
"003402/003749/331177/001453/000694/201326/002350/465197/003221/003402/" amplificador _
" 400202/002901/001386/267611/000605 /002349/137515/002709/464533/001738/"_
" 002901/330421/001242/002651/199255/0013 23/529706/003733333333306/398762;
"002741/001206/267438/002647/001318/204070/003477/461653/001386/002413/" _
"330077/001197/002637/268877/003365/5311 02900/002922/398042 / 002395/" amp; _
"001179/267415/002635/661067/001701/001748/398772/002742/002391/330031/" amp; _
"001175/001611 / 200010/003749/527717/001452/002742/332397/002350/003222/" _
"268949/003402/003493/133973/001386/464219/000605/0023 34123/002709/" amperio; _
"002890/267946/002773/592565/001210/002651/395863/001323/002707/265877/" amplificador _
"001706/002773/133557/001206 /397998 /002638/003366/335142/003411/001450/" _
"200042/002413/723293/001197/002637/399947/003365/003410/334676/0029 06/"amp; _
"001389/133467/001179/464023/002635/002725/333477/001746/002778/199350/" _
"002359/526639/001175/001611/39661 8/00374 9 /001714/267628 /002734/002350/" amp; _
"203054/003222/465557/003402/003493/330581/001386/002669/264797/001325/" amp; _
"529707 /002709/002890/399018/002773/001370/267450/002651/001323/202023/" _
"001683/462419/001706/002773/330165/00 1206/002647/2 64782 /003366/531750/ " amp; _
"003410/003498/396650/001389/001198/267421/002637/003349/138021", "/") 'Datos del calendario lunar
tf = True ' Marque, la matriz se ha cargado
End Sub
Función iNlStr(iDate As Date) As String 'Convertir calendario gregoriano en calendario lunar
Si no es tf, entonces Llamar
Cargue las matrices
Dim i, tamp;, k, m, n, ext, bitamp;
'Calcular desde 1921-2-8 (es decir, el primer día de la primera luna mes en 1921) El número total de días hasta la fecha objetivo
t = iDate - #2/8/1921# 1
'Calcular el valor del año, mes y día
Hacer
p>Si Val(sNlShu(m)) lt 4095 Entonces k = 11 De lo contrario k = 12
n = k
Hacer
' Obtener el valor del enésimo bit binario de sNlShu(m)
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 lt = 29 bits Entonces
text = 1
Salir Do
Finalizar si
t = t - 29 - bit
n = n - 1
Bucle hasta n lt 0
Si ext entonces salir Do
m = m 1
Bucle hasta falso
'Calcular los tres valores del calendario lunar
Dim cy, cm, cd p>
cy = 1921 m? 'El valor del año lunar
cm = k - n 1 'El valor del mes lunar
cd = t ?' valor del día lunar
Si k = 12 Entonces
Seleccione Case Val(sNlShu(m)) \ 65536 1 'Corregir el valor de cm
Caso Es = cm
cm = 1 - cm
Caso Es lt cm
cm = cm - 1
Selección final p>
End If
'Calcular texto chino
Dim ar (1 a 5) como cadena
m = ((cy - 4) Mod 60) Mod 10 'Valor del índice de Tiangan
n = ((cy - 4) Mod 60) Mod 12 'Valor del índice de las ramas terrestres y del zodíaco
Si cm lt; 1) = "Salto"
ar(1) = ar(1) amp; sNlMon(Abs( cm)) 'Mes lunar
ar(2) = sNlDay(cd) 'Día lunar
>
ar(3) = sTiGan(m) amp; sDiZhi(n) ?'tallos y ramas lunares
ar(4) = sSXiao(n) ?'zodíaco lunar
ar(5) = sZhouJ(Weekday(iDate, 2)) 'Caracteres chinos de la semana
'Resultados de salida de colocación (consejo: matriz ar(1 a 5)***5 elementos, puede se puede combinar libremente según sea necesario Resultado de salida)
iNlStr = ar(3) amp "Year Zodiac" amp; ; "Semana" amp; ar(5) 'Resultado de salida
Función final