Cómo utilizar funciones en EXCEL para convertir fechas del calendario gregoriano a fechas del calendario lunar
Texto original: Internet
Revisado: A Yong 2005/1/12
//Definición de datos lunares// p>
Primero, restaure la función H2B a una cadena de longitud 18, que se define de la siguiente manera:
Los primeros 12 bytes representan el 1-65438 de febrero: 1 es el mes grande, 0 es el mes pequeño; comprimido en diez hexadecimales (1-3 dígitos)
13 es un mes bisiesto, 1 es un mes grande de 30 días, 0 es un mes pequeño de 29 días (4 dígitos) p>
El 14 El bit es el mes del mes bisiesto. 0 si no es un mes bisiesto; en caso contrario, indica el mes (5 dígitos).
Los últimos cuatro dígitos son la fecha del calendario gregoriano del Año Nuevo Lunar, por ejemplo, 0131 representa 65438 31 de octubre; convierta el valor a hexadecimal (6-7 dígitos)
Luna; constante (1899~2100, ***202)
Private Const ylData = "AB500D2, 4BD0883," _
amp "4AE00DB, A5700D0, 54D0581, D2600D8, D9500CC, 655147D, 56A00D5, 9AD00CA, 55D027A, 4AE00D2, "_
amp" A5B0682, A4D00DA, D2500CE, D25157E, B5500D6, 56A00CC, ADA027B, 95B00D3, 49717C9, 49B00DC, "
amplificador" 0D0, B4B0580, 6A500D8, 6D400CD, AB5147C, 2B600D5, 95700CA, 52F027B, 49700D2, 6560682, "_
&" D4A00D9, EA500CE, 6A9157E, 5AD00D6, B600CC, 86E137C,92E00D3,C8D1783,C9500DB, D4A00D0," _
amp" D8A167F, B5500D7, 56A00CD, A5B147D, 25D00D5, 92D00CA, D2B027A, A9500D2, B550781, 6CA00D9, " _
amp" B5500CE, 4DA00D6, A 5B00CB, 457037C, 52B00D4, A9A0883, E9500DA, 6AA00D0, AEA0680, "_
amp" AB500D7, 4B600CD, AAE047D, A5700D5, 52600CA, F260379, D9500D1, 50782, 56A00D9, 96D0 0CE," _
amplificador" 4DD057F, 4AD00D7, A4D00CB, D4D047B, D2500D3, D550883, B5400DA, B6A00CF, 95A1680, 95B00D8, "_
amplificador" 49B00CD, A97047D, A4B00D5, ACA, 6A 500CC, 6D400D1, AF40681, AB600D9, 93700CE, 4AF057F, "_
amp" 49700D7, 64B00CC, 74A037B, EA500D2, 6B50883, 5AC00DB, AB600CF, 96D0580, 92E00D8, 600CD, "_
amplificador" D95047C, D4A00 D4, DA500C9, 755027A, 56A00D1, ABB0781, 25D00DA, 92D00CF, CAB057E, A9500D6, "_amp" B4A00CB, BAA047B, B5500D2, 55D0983, BA00DB, A5B00D0, 5171680, 52B00D8, A9300CD,795047D," _
&
6D00D3, 4AB0B83, 4AD00DB, A4D00D0, D0B1680, D2500D7, D5200CC, DD4057C, B5A00D4, 56D00C9, 55B027A, 49B00D2, A570782, A4B00D9, AA500CE, B25 157E,6D200D6,ADA00CA,4B6137B," _
amp"93700D3 , 49F08C9, 49700DB, 64B00D0, 68A1680, EA500D7, 6AA00CC, A6C147C, AAE00D4, 92E00CA,"_
amp" D2E0379, C9600D1, D550781, D4A 00D9, DA400CD, 5D5057E, 56A00D6, A6C00CB, 55D047B, 52D00D3 , "_
amp" A9B0883, A9500DB, B4A00CF, B6A067F, AD500D7, 55A00CD, ABA047C, A5A00D4, 52B00CA, B2703 7A, "_
AMP" 69300D1, 7330781, 6A00D9, 6A00D9, 6A00D9, 6A00D9, 6A00DEM AD500CE, 4B5157E, 4B600D6, A5700CB, 54E047C, D1600D2, E960882, "_
ampD5200DA, DAA00CF, 6AA167F, 56D00D7, 4AE0 0CD, A9D047D, A2D00D4, C9, F250279, D5200D1
Private Const ylMd0 =Nivel, Nivel 2, Nivel 3, Nivel 4, Nivel 5, Nivel 6, Nivel 7, Nivel 8, Nivel 9, Nivel 11, Nivel 12, Nivel 345"
amp"16, 789, 21, 22, 23, 24, 25, 26, 27, 28, 2930"
Private Const ylMn0 = "Cera de invierno positiva".
Privado Const ylTianGan0 = "A, B, P, D, E, H, N, N".
Privado Const ylDiZhi0 = "Zi Chou Mao Yin Chen se ha instalado en Xu Hai al mediodía"
Privado Const ylShu0 = "Rata, Buey, Tigre, Conejo, Dragón, Serpiente, Caballo , Oveja, mono, gallina, perro y cerdo"
Fecha del calendario solar al calendario lunar
Función GetYLDate(ByVal strDate As String) como cadena
Ir a aErr cuando ocurre un error
Si no es IsDate(strDate), salga de la función
Dim setDate es la fecha, tYear es el número entero, tMonth es el número entero, tDay es el número entero
setDate = CDate (strDate)
tYear = Año(setDate):tMonth = Month(setDate):tDay = Día(setDate)
Salir si no es válido y tiene una cita.
Si tYear gt2100 o tYear lt1900 entonces salga de la función
Dim daList() es cadena * 18, conDate es fecha, thisMonths es cadena
Dim AddYear es un número entero, AddMonth es un número entero, AddDay es un número entero, getDay es un número entero
Dim YLyear es una cadena, YLShuXing es una cadena
Dim dd0 es una cadena, mm0 es un cadena, ganzhi (0 a 59) es una cadena * 2
Dim RunYue es un valor booleano, RunYue1 es un número entero, mDays es un número entero, I es un número entero
Cargar lunar datos del calendario dentro de 2 años.
ReDim daList(tAño - 1 a tAño)
daList(tAño-1)= H2B(Mid(ylData, (tAño - 1900) * 8 1, 7)) p>
daList(tAño) = H2B(Mid(ylData, (tAño-1900 1)* 8 1, 7))
AgregarAño = tAño
initYL: p>
p>
agregar mes = CInt(Mid(daList(AddYear), 15, 2))
AddDay = CInt(Mid(daList(AddYear), 17, 2))
Condate = dateserial (addyear, addmonth, addday) 'Fecha del Año Nuevo Lunar.
Getday = dateiff ("d",condate,setdate) 1 'Diferencia de día.
Si getDay lt1 entonces AddYear = AddYear - 1: vaya a initYL
thisMonths = Left(daList(AddYear), 14)
ejecute yue 1 = Val (&H "&pair(thisMonths, 1))'Mes bisiesto
Si ejecuta yue 1 > 0 Entonces 'Hay un mes bisiesto.
thisMonths = Left(thisMonths, ejecuta yue 1 ) amp; mitad de mes (este mes, 13, 1). Mitad de mes (este mes, RunYue1 1)
Terminará si...
thisMonths = Left( thisMeses, 13)
Para i = 1 a 13 'Calcule el número de días.
mDays = 29 CInt(Mid(thisMonths, I, 1))
Si getDay gtentonces cuántos días
getDay = getDay - mDays
p>
Otro
Si ejecuta yue 1 gt; entonces 0
Si i = RunYue1 1, entonces RunYue = True
Si i gtRunYue1 entonces i = i - 1
Terminará si...
AddMonth = i
AddDay = getDay
Salir por. ..
p>Terminará si...
Entonces
dd0 = Mid(ylMd0, (AddDay - 1) * 2 1, 2)
MM0 = mid (ylmn0, addmonth, 1) "mes"
Para i = 0 a 59
Tallos y ramas (i) = Mid(ylTianGan0 , (i Mod 10) 1, 1) Mid(ylDiZhi0, (i Mod 12) 1
Siguiente yo
YLyear = ganzhi((AddYear - 4) Mod 60) p>
YLShuXing = Mid( ylShu0, ((AddYear - 4) Mod 12) 1, 1)
Si Runyue entonces mm0 = " salto " ; "Año Nuevo Lunar" ; YLyear amp" ("ampYLShuXing amp")año"; mm0 ampdd0
aErr:
Fin de función
Fecha lunar a gregoriana
SecondMonth es verdadero, luego se muestra la fecha cuando tMonth es un mes bisiesto y se toma el segundo mes.
La función GetDate (ByVal tYear es un número entero, tMonth es un número entero. , tDay es un número entero, secondMonth opcional es booleano = False) es una cadena
Ir a aErr en caso de error
Si tYear gt2100 o tYear lt1899 o tMonth gt12 o tMonth lt1 o tDay. gt30 o tDay lt1 y luego salga de la función
Dim thisMonths es String, ylNewYear es la fecha, toMonth es el número entero
Dim mDays es el número entero, RunYue1 es el número entero, I es el número entero
thisMonths = H2B(Mid(ylData, (tYear - 1899) * 8 1, 7))
Si tDay gt entonces sal de la función
Yl new año = dateerial (t año, cint (mediados (este mes, 15, 2)), cint (mediados (este mes, 17, 2))' fecha del Año Nuevo Lunar.
thisMonths = Left(thisMonths, 14)
ejecute yue 1 = Val(&H "ampright(thisMonths,1))'Mes bisiesto
toMonth = tMonth - 1
Si ejecuta yue 1 gt; 0 Entonces 'Hay un mes bisiesto.
thisMonths = Left(thisMonths, run yue 1) & mid-month (este mes, 13, 1). A mitad de mes (este mes, RunYue1 1)
Si tMonth gtrun yue 1 O (segundo mes y t mes = ejecutar yue 1) entonces toMonth = tMonth
Si... terminará p>
thisMonths = Left(thisMonths, 13)
mDays = 0
Para i = 1 al mes
mDays = mDays 29 CInt(Mid (este mes, I, 1))
Entonces
mDays = mDays tDay
GetDate = yl año nuevo mDays-1
aErr:
Finalizar función
Restaurar caracteres lunares comprimidos
Función privada H2B (ByVal strHex As String) como cadena
Dim i es un número entero, i1 es un número entero, tmpV es una cadena
const hStr = " 0123456789 abcdef "
const bStr = " 00000001001000101000101010101011111100065438
tmpV = UCase(Left (strHex, 3))
Hex a Binario
Para i = 1 a Len(tmpV)
i1 = InStr(hStr, Mid ( tmpV, I, 1))
H2B = H2B amp Mid(bStr, (i1 - 1) * 4 1, 4)
Entonces
H2B = H2B amp; valor medio (strHex, 4, 2)
Hex a decimal
H2B = H2B amp; 0 amp; strHex, 2)))
Función final