Ver Mensaje Individual
  #1 (permalink)  
Antiguo 11/06/2009, 04:34
Zrig
 
Fecha de Ingreso: junio-2009
Mensajes: 2
Antigüedad: 15 años, 6 meses
Puntos: 0
Pregunta Macro para pasar una fecha a Excel

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
  1. #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
  1. #define ano(fecha) int(1900+(fecha-1)/365.25)
Código c++:
Ver original
  1. int mes(int fecha){
  2.     // devuelve el mes correspondiente a esta fecha
  3.     // primero recalcula la fecha quitándole la cantidad correspondiente a los cuatrienios
  4.     int nfecha = fecha-int((fecha-1)/1461)*1461;
  5.     // si está en el cuarto año del cuatrienio
  6.     if(nfecha > 1461-365)   nfecha-=(1461-365);
  7.     // si está en el tercer año
  8.     else if(nfecha > 1461-365-365)  nfecha-=(1461-365-365);
  9.     // si está en el segundo año
  10.     else if(nfecha > 1461-365-365-365)  nfecha-=(1461-365-365-365);
  11.     int dmes[]={0.,31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31.};
  12.     bool bisiesto = (int(4*(fecha-1)/1461)%4 == 0);
  13.     if(bisiesto)    dmes[2] = 29.;
  14.     for(int i=1;i<13;i++){
  15.         dmes[i] += dmes[i-1];
  16.         if(dmes[i] >= nfecha)
  17.             return(i);
  18.     }
  19.     MessageBox(0,"error en el mes","error",0);
  20.     return(0);
  21. }
Código c++:
Ver original
  1. int dia(int fecha){
  2.     // devuelve el dia correspondiente a esta fecha
  3.     // primero recalcula la fecha quitándole la cantidad correspondiente a los cuatrienios
  4.     int nfecha = fecha-int((fecha-1)/1461)*1461;
  5.     // si está en el cuarto año del cuatrienio
  6.     if(nfecha > 1461-365)   nfecha-=(1461-365);
  7.     // si está en el tercer año
  8.     else if(nfecha > 1461-365-365)  nfecha-=(1461-365-365);
  9.     // si está en el segundo año
  10.     else if(nfecha > 1461-365-365-365)  nfecha-=(1461-365-365-365);
  11.     float dmes[]={0.,31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31.};
  12.     bool bisiesto = (int(4*(fecha-1)/1461)%4 == 0);
  13.     if(bisiesto)    dmes[2] = 29.;
  14.     for(int i=1;i<13;i++){
  15.         dmes[i] += dmes[i-1];
  16.         if(dmes[i] >= nfecha)
  17.             return(nfecha - dmes[i-1]);
  18.     }
  19.     MessageBox(0,"error en el día","error",0);
  20.     return(0);
  21. }