IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macro Discussion :

Simplifier un programme avec une macro


Sujet :

Macro

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Points : 99
    Points
    99
    Par défaut Simplifier un programme avec une macro
    Bonjour je voudrais savoir s'il est possible de simplifier ce programme avec une macro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    proc SQL;
    CREATE TABLE espace.PERIODE AS 
    SELECT CODEPORTEFEUILLE,NOMPORTEFEUILLE, DT_DEB_VALIDITE,DT_FIN_VALIDITE,LASTNAME,SIT_ACT
    ,CASE When DT_FIN_VALIDITE is not null then year(datepart(DT_FIN_VALIDITE))-year(datepart(DT_DEB_VALIDITE))
    else year(date())-year(datepart(DT_DEB_VALIDITE)) End as duree
    ,COUNT(LASTNAME) AS periode
    ,SUM((LASTNAME LIKE 'Sec%') ) AS nbvac
    ,calculated periode - calculated nbvac AS nbcouv
    FROM espace.PERIODE
    GROUP BY CODEPORTEFEUILLE;
    quit;
     
    proc means data=espace.PERIODE mean sum;
    var duree;
    class CODEPORTEFEUILLE SIT_ACT;
    ods output summary=espace.periode_indicateur;
    run;
    proc sort data=espace.periode_indicateur;
    by CODEPORTEFEUILLE;
    run;
    data espace.periode_indicateur;
    set espace.periode_indicateur;
    col1=SIT_ACT||'_Mean';
    col2=SIT_ACT||'_Sum';
    run;
    proc transpose data=espace.periode_indicateur out=espace.periode_indicateurs1 (DROP=_name_ _label_);
    ID col1;
    by CODEPORTEFEUILLE;
    VAR duree_Mean;
    run;
    proc transpose data=espace.periode_indicateur out=espace.periode_indicateurs2 (DROP=_name_ _label_);
    ID col2;
    by CODEPORTEFEUILLE;
    VAR duree_Sum;
    run;
    data espace.periode;
    merge espace.periode:;
    run;
    data espace.periode;
    merge espace.periode (drop=NObs col:);
    run;


    merci d'avance

  2. #2
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Se serait mieux que tu comences à réflechir par toi même et demander de l'aide ou poster la log si jamais t'es bloqué. Je te rappelle que les personnes qui te viennent en aide bossent aussi tout comme toi...

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Points : 99
    Points
    99
    Par défaut
    C'est possible de mettre tout ça dans une proc sql avec un UNION ou un INTERSECT???

    si je fais ça ça m'éliminerai la proc mean et tout ce qui s'en suit

    le probème c'est ça ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    proc SQL;
    CREATE TABLE espace.PERIODE AS 
    SELECT CODEPORTEFEUILLE,NOMPORTEFEUILLE, DT_DEB_VALIDITE,DT_FIN_VALIDITE,LASTNAME,SIT_ACT
    ,CASE When DT_FIN_VALIDITE is not null then year(datepart(DT_FIN_VALIDITE))-year(datepart(DT_DEB_VALIDITE))
    else year(date())-year(datepart(DT_DEB_VALIDITE)) End as duree
    ,COUNT(LASTNAME) AS periode
    ,SUM((LASTNAME LIKE 'Sec%') ) AS nbvac
    ,calculated periode - calculated nbvac AS nbcouv
    FROM espace.PERIODE
    GROUP BY CODEPORTEFEUILLE
    Intersect
    SELECT CODEPORTEFEUILLE,NOMPORTEFEUILLE,SIT_ACT,avg(duree) as dureeMoy,sum(duree) as dureeSum
    FROM espace.PERIODE
    GROUP BY CODEPORTEFEUILLE,SIT_ACT;
    quit;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    WARNING: Une table a été agrandie avec aucune colonne pour effectuer l'opération INTERSECT.
    ERROR: La fonction DATEPART requiert une expression numérique comme argument 1.
    ERROR: La fonction YEAR requiert une expression numérique comme argument 1.
    ERROR: La fonction DATEPART requiert une expression numérique comme argument 1.
    ERROR: La fonction YEAR requiert une expression numérique comme argument 1.
    ERROR: L'expression utilisant soustraction (-) requiert un type numérique.
    ERROR: La fonction DATEPART requiert une expression numérique comme argument 1.
    ERROR: La fonction YEAR requiert une expression numérique comme argument 1.
    ERROR: L'expression utilisant soustraction (-) requiert un type numérique.
    ERROR: La fonction de synthèse AVG requiert un argument numérique.
    ERROR: La fonction de synthèse SUM requiert un argument numérique.
    ERROR: sqlaggr : un nom de fonction, un nom INTO :, ou un nom CALCULATED est utilisé en tant qu'argument d'une fonction de synthèse.
    ERROR: sqlaggr : un nom de fonction, un nom INTO :, ou un nom CALCULATED est utilisé en tant qu'argument d'une fonction de synthèse.
    ERROR: Les colonnes suivantes n'ont pas été trouvées dans les tables : DT_DEB_VALIDITE, DT_FIN_VALIDITE, LASTNAME.
    ERROR: Les colonnes suivantes n'ont pas été trouvées en tant que références CALCULEES dans la requête immédiate : duree.
    (ps: j'ai mm utilisé l'option corresponding dans mon intersect);

  4. #4
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Tu travailles tjs sur la même table, donc tu peux calculer les deux indicateurs dans une même proc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    proc SQL;
    CREATE TABLE espace.PERIODE AS 
    SELECT CODEPORTEFEUILLE,NOMPORTEFEUILLE, DT_DEB_VALIDITE,DT_FIN_VALIDITE,LASTNAME,SIT_ACT
    ,CASE When DT_FIN_VALIDITE IS NOT NULL then year(datepart(DT_FIN_VALIDITE))-year(datepart(DT_DEB_VALIDITE))
    else year(date())-year(datepart(DT_DEB_VALIDITE)) End AS duree
    ,COUNT(LASTNAME) AS periode
    ,SUM((LASTNAME LIKE 'Sec%') ) AS nbvac
    ,calculated periode - calculated nbvac AS nbcouv,avg(duree) AS dureeMoy,sum(duree) AS dureeSum
    FROM espace.PERIODE
    GROUP BY CODEPORTEFEUILLE;
    Pourquoi je t'aide en fait ?

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Points : 99
    Points
    99
    Par défaut
    ben le problème c'est que je dois ressortir un indicateur pour chaque portefeuille, et un indicateur pour chaque portefeuille selon la situation actuelle donc au final je fini par enlever un critère.

    juste à titre perso, je voudrais savoir est ce que c'est possible d'utiliser l'opérateur pivot dans une proc SQL???

  6. #6
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    J'ai pas tout compris
    Qu'est ce qui te dérange dans ton code? ça fonctionne ou pas?

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Points : 99
    Points
    99
    Par défaut
    c'est ça qui me gene dans ton instruction c'est ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY CODEPORTEFEUILLE;
    ces variables avg(duree) AS dureeMoy,sum(duree) AS dureeSum

    doivent être calculer de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY CODEPORTEFEUILLE,SIT_ACT;

  8. #8
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Au tant pour moi, c'est bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY CODEPORTEFEUILLE,SIT_ACT;
    Si ça ne répond pas à ton pb,faudrait que tu postes un échantillon de ton fichier.
    Et j'aimerais savoir:
    1) Ce que tu souhaites obtenir comme résultat
    2) si ton programme initial fonctionne
    3) Ce que tu veux optimiser ou automatiser

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Points : 99
    Points
    99
    Par défaut
    voila en fait ce que je veux,

    je veux modifier mon premier tableau de manière à ce qu'il ressemble au deuxieme,



    et cela me coute tout ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    proc transpose DATA=espace.periode_indicateur out=espace.periode_indicateurs1 (DROP=_name_ _label_);
    ID col1;
    BY CODEPORTEFEUILLE;
    VAR duree_Mean;
    run;
    proc transpose DATA=espace.periode_indicateur out=espace.periode_indicateurs2 (DROP=_name_ _label_);
    ID col2;
    BY CODEPORTEFEUILLE;
    VAR duree_Sum;
    run;
    DATA espace.periode;
    merge espace.periode:;
    run;
    DATA espace.periode;
    merge espace.periode (DROP=NObs col:);
    run;

  10. #10
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Je ne trouve pas ça trop pour aboutir au résultat escompté.
    Si vraiment tu veux passer autrement, poste un échantillon mais je regarderai que mercredi. Par contre je ne comprends pas ta dernière étape (une merge nécessite deux tables au moins), si c'est pour droper, tu peux le faire juste au dessus.

  11. #11
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Points : 99
    Points
    99
    Par défaut
    autant pour moi c'était un set

  12. #12
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    et un merge va avec BY

  13. #13
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Points : 99
    Points
    99
    Par défaut
    oui effectivement sinon pour résoudre mon problème avec la proc transpose j'ai fait une boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %do i=1 %TO 2;
    proc transpose DATA=espace.periode out=espace.periode&i(DROP=_name_ _label_) LET prefix=duree&i;
    ID SIT_ACT;
    BY CODEPORTEFEUILLE;
    VAR duree&i;
    run;
    %end;
    s'il y a mieux je suis preneur

  14. #14
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    y a pas mieux je pense...

  15. #15
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Points : 99
    Points
    99
    Par défaut
    Bon voila le programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    %macro test;
     
    proc SQL;
    CREATE TABLE espace.PERIODE AS 
    SELECT CODEPORTEFEUILLE,NOMPORTEFEUILLE, DT_DEB_VALIDITE,DT_FIN_VALIDITE,LASTNAME,SIT_ACT
    ,CASE When DT_FIN_VALIDITE is not null then year(datepart(DT_FIN_VALIDITE))-year(datepart(DT_DEB_VALIDITE))
    else year(date())-year(datepart(DT_DEB_VALIDITE)) End as duree
    ,avg(calculated duree) AS duree1
    ,sum(calculated duree) AS duree2
    ,COUNT(CODEPORTEFEUILLE) AS duree3
    FROM espace.PERIODE
    GROUP BY CODEPORTEFEUILLE,SIT_ACT;
    quit;
     
    %do i=1 %TO 3;
    proc transpose DATA=espace.periode out=espace.periode&i(DROP=_name_ _label_) LET prefix=duree&i;
    ID SIT_ACT;
    BY CODEPORTEFEUILLE;
    VAR duree&i;
    run;
    data espace.periode;
    set espace.periode (drop=duree&i);
    run;
    %end;
     
    proc sort data=espace.periode;
    by CODEPORTEFEUILLE DT_DEB_VALIDITE;
    run;
     
    data espace.PERIODE;
    set espace.PERIODE;
    by CODEPORTEFEUILLE DT_DEB_VALIDITE;
    if last.CODEPORTEFEUILLE;
    run;
     
    data espace.periode;
    merge espace.periode:;
    by CODEPORTEFEUILLE;
    dureetot=duree3couverture+duree3vacance;
    run;
     
    %mend;
    ce qui m'embête c'est de faire des tables intermediaires

Discussions similaires

  1. tableau dynamique excel crée avec une macro
    Par alex_95 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 20/03/2006, 12h01
  2. [Excel]Faire une somme avec une macro
    Par Chlo dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 13/01/2006, 19h53
  3. Connaître la taille d'un module avec une macro VBA ou autre
    Par beegees dans le forum Général VBA
    Réponses: 15
    Dernier message: 22/11/2005, 09h47
  4. Réponses: 7
    Dernier message: 22/09/2005, 10h09
  5. [VBA Excel] ecrire le caractere " avec une macro
    Par oktopuces dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/09/2005, 22h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo