Hola. Quiero crear una macro o una función que me permita pasar una fecha Excel a número y viceversa.
Para Excel, el número 1 es el 1 de enero de 1900, el 2 es el 2 de enero de 1900 y así sucesivamente.
Hoy 11 de junio de 2009 es el número 39975.
Ya he creado la macro que me pasa una fecha a número. Es la siguiente:
Código c++:
Ver original#define FechaExcel(anno,mes,dia,hora,minuto) (((anno)-1900)*365.25+((anno)%4==0?0:1)+int((mes)*30.5)-30+((mes)>2?((anno)%4==0?-1:-2):0)+(((mes)-9)*((mes)-11)==0 ?1:0)+float(dia)+float(hora)/24.+float(minuto)/1440.)
Para pasar del número a la fecha he creado un macro y dos funciones, que describo abajo. Mi pregunta es si alguien sabe si este trabajo ya está hecho y si no, si es correcto lo que he escrito y si es posible simplificarlo:
Código c++:
Ver original#define ano(fecha) int(1900+(fecha-1)/365.25)
Código c++:
Ver originalint mes(int fecha){
// devuelve el mes correspondiente a esta fecha
// primero recalcula la fecha quitándole la cantidad correspondiente a los cuatrienios
int nfecha = fecha-int((fecha-1)/1461)*1461;
// si está en el cuarto año del cuatrienio
if(nfecha > 1461-365) nfecha-=(1461-365);
// si está en el tercer año
else if(nfecha > 1461-365-365) nfecha-=(1461-365-365);
// si está en el segundo año
else if(nfecha > 1461-365-365-365) nfecha-=(1461-365-365-365);
int dmes[]={0.,31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31.};
bool bisiesto = (int(4*(fecha-1)/1461)%4 == 0);
if(bisiesto) dmes[2] = 29.;
for(int i=1;i<13;i++){
dmes[i] += dmes[i-1];
if(dmes[i] >= nfecha)
return(i);
}
MessageBox(0,"error en el mes","error",0);
return(0);
}
Código c++:
Ver originalint dia(int fecha){
// devuelve el dia correspondiente a esta fecha
// primero recalcula la fecha quitándole la cantidad correspondiente a los cuatrienios
int nfecha = fecha-int((fecha-1)/1461)*1461;
// si está en el cuarto año del cuatrienio
if(nfecha > 1461-365) nfecha-=(1461-365);
// si está en el tercer año
else if(nfecha > 1461-365-365) nfecha-=(1461-365-365);
// si está en el segundo año
else if(nfecha > 1461-365-365-365) nfecha-=(1461-365-365-365);
float dmes[]={0.,31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31.};
bool bisiesto = (int(4*(fecha-1)/1461)%4 == 0);
if(bisiesto) dmes[2] = 29.;
for(int i=1;i<13;i++){
dmes[i] += dmes[i-1];
if(dmes[i] >= nfecha)
return(nfecha - dmes[i-1]);
}
MessageBox(0,"error en el día","error",0);
return(0);
}