importante aide sur vba (macro)

importante aide sur vba (macro) - VB/VBA/VBS - Programmation

Marsh Posté le 12-09-2009 à 14:42:57    

Bonjour à tous,
 
Je me permets de solliciter votre aide.
 
Voilà je suis un vrai novice en VBA et je dois faire une macro en VBA sous excel mais je n'y arrive pas et ça fait deux jours que je galère dessus.
 
Je vous explique mon problème:
 
J'ai un tableau avec quatre colonnes : Date, Progress, Lead time before meeting, Level of risk.
J'ai une date de meeting pour chaque étape.
 
Le but de ma manœuvre est la suivante: en fonction du temps restant avant le meeting ( date - date de meeting ) (ça correspond au Lead time before meeting) et de mon niveau de progression(progress) , je voudrais évaluer le niveau de risk (Level of risk).
 
Progress: valeur rentrée à la main
Date: valeur rentrée à la main
Lead time before meeting = date - date de meeting
 
Si la valeur dans Lead Time before meeting est inférieure -14 (inclus) et la valeur Progress comprise entre 0 (exclu) et 100 (exclu)
     Alors écrire "maitrisé" dans la colonne level.
Si la valeur dans Lead Time before meeting est inférieure à -14 (inclus) et la valeur Progress égale à 100
     Alors écrire "nul" dans la colonne level (sinon rien écrire dans level).
 
Si la valeur dans Lead time before meeting est comprise entre -14 (exclu) et -7 (exclu) et la valeur Progress comprise entre 0 (exclu) et 50 (inclus)
    Alors écrire "maitrisé" dans la colonne level.
Si la valeur dans Lead time before meeting est comprise entre -14 (exclu) et -7 (exclu) et la valeur Progress comprise entre 50 (exclu) et 100 (exclu)
    Alors écrire "bas" dans la colonne level.
Si la valeur dans Lead time before meeting est comprise entre -14 (exclu) et -7 (exclu) et la valeur Progress égale à 100.
    Alors écrire "nul" dans la colonne level (sinon rien écrire dans level).
 
Si la valeur dans Lead time before meeting est comprise entre -7 (inclu) et 0 (exclu) et la valeur Progress comprise entre 0 (exclu) et 50 (inclus)
    Alors écrire "très élevé" dans la colonne level.
Si la valeur dans Lead time before meeting est comprise entre -7 (inclu) et 0 (exclu) et la valeur Progress comprise entre 50 (exclu) et 75 (inclus)
    Alors écrire "élevé" dans la colonne level.
Si la valeur dans Lead time before meeting est comprise entre -7 (inclu) et 0 (exclu) et la valeur Progress comprise entre 75 (exclu) et 100 (exclu)
    Alors écrire "maitrisé" dans la colonne level.
Si la valeur dans Lead time before meeting est comprise entre -7 (inclu) et 0 (exclu) et la valeur Progress est égale à 100
    Alors écrire "nul" dans la colonne level (sinon rien écrire dans level).
 
Si la valeur dans Lead time before meeting est égale à 0 et la valeur Progress comprise entre 0 (exclu) et 100 (exclu)
    Alors écrire "overdue" dans la colonne level.
Si la valeur dans Lead time before meeting est égale à 0 et la valeur Progress est égale à 100
    Alors écrire "maitrisé" dans la colonne level (sinon rien écrire dans level).
 
Si la valeur dans Lead time before meeting est supérieure à  0 (exclu) et la valeur Progress est différente de " " (valeur vide)
    Alors écrire "overdue" dans la colonne level (sinon rien écrire dans level).
 
Je sais pas si cela, vous paraît clair. Je vous envoie le tableau que j'ai réalisé: http://cjoint.com/?jmnSktCYp8.
 
Sur le tableau, j'ai fait ce que je viens d'écrire mais avec la fonction "si" d'excel, uniquement. Mais comme je ne peux mettre plus de 7 fonctions "si" à la suite dans excel, j'ai dissocié les conditions pour Lead time before meeting variant de :
- l'infini à -14(inclus)
de -14 (exlu) à -7(inclus)
de -7(exclu) à 0(exclus)
pour = à 0
pour supérieur à 0 .
 
Mon but est de faire une seule macro qui pourrait réaliser ces différents tests et mettre le résultat de ces tests (nul, bas, maitrisé, élevé et très élevé) dans la colonne Level of risk.
 
La macro que j'ai développé est celle-ci mais elle ne marche pas.  
 
Vous pouvez me la corriger pour la faire fonctionner, s'il vous plaît. Merci.
 
 
Je vous colle la macro ici:
 
 
Sub macro()
 
 
 
'Pour Lead time before meeting inférieur ou égale à -14(inclus)
 
If ActiveSheet.Range("G23" ).Value <= -14 Then
    If ActiveSheet.Range("F23" )>0 And ActiveSheet.Range("F23" ) < 100 Then ActiveSheet.Range("H23" ).Value = "maitrisé"
Else
        If ActiveSheet.Range("F23" ) = 100 Then ActiveSheet.Range("H23" ).Value = "nul" Else ActiveSheet.Range("H23" ).Value = " "
End If
 
 
'Pour Lead time before meeting compris entre -14 (exclu) et -7 (exclu)
 
If ActiveSheet.Range("G23" ).Value > -14 And ActiveSheet.Range("G23" ).Value < -7 Then
    If ActiveSheet.Range("F23" ).Value > 0 And ActiveSheet.Range("F23" ).Value <= 50 Then ActiveSheet.Range("H23" ).Value = "maitrisé"
Else
        If ActiveSheet.Range("F23" ).Value > 50 And ActiveSheet.Range("F23" ).Value < 100 Then  ActiveSheet.Range(H23" ).Value = "bas"
            If ActiveSheet.Range("F23" ).Value = 100 Then ActiveSheet.Range("H23" ).Value = "nul" Else ActiveSheet.Range(H23" ).Value = " "
End If
 
 
'Pour Lead time before meeting compris entre -7 (inclus) et 0(exclu)
 
If ActiveSheet.Range("G23" ).Value > -7 And ActiveSheet.Range("G23" ).Value < 0 Then
    If ActiveSheet.Range("F23" ).Value > 0 And ActiveSheet.Range("F23" ).Value <= 50 Then ActiveSheet.Range("H23" ).Value = "très élevé"
Else
        If ActiveSheet.Range("F23" ).Value > 50 And ActiveSheet.Range("F23" ).Value <= 75 Then ActiveSheet.Range("H23" ).Value = "élevé"
            If ActiveSheet.Range("F23" ).Value > 75 And ActiveSheet.Range("F23" ).Value < 100 Then ActiveSheet.Range("H23" ).Value = "maitrisé"
                If ActiveSheet.Range("F23" ).Value = 100 Then ActiveSheet.Range("H23" ).Value = "nul" Else ActiveSheet.Range("H23" ).Value = " "
End If
 
 
'Pour Lead time before meeting égale à 0
 
If ActiveSheet.Range("G23" ).Value = 0 Then
    If ActiveSheet.Range("F23" ).Value > 0 And ActiveSheet.Range("F23" ).Value < 100 Then ActiveSheet.Range("H23" ).Value = "overdue"
Else
        If ActiveSheet.Range("F23" ).Value = 100 Then ActiveSheet.Range("H23" ).Value = "maitrisé" Else ActiveSheet.Range("H23" ).Value = " "
End If
 
 
'Pour Lead time before meeting supérieur à 0 (exclu)
 
If ActiveSheet.Range("G23" ).Value > 0 Then
    If ActiveSheet.Range("F23" ).Value <> " " Then ActiveSheet.Range("H23" ).Value = "overdue" Else ActiveSheet.Range("H23" ).Value = " "
End If
 
 
End Sub
 
http://cjoint.com/?jmnSktCYp8
 
Merci pour votre aide

Reply

Marsh Posté le 12-09-2009 à 14:42:57   

Reply

Marsh Posté le 14-09-2009 à 11:20:36    

Je te conseille de ne pas faire de macro et d'écrire directement une formule. Si la formule est trop compliquée, tu peux avoir des résultats partiels dans des colonnes cachées.  
L'avantage est que tu vois tout de suite le résultat et que cela calcule aussi beaucoup plus vite qu'une macro

Reply

Marsh Posté le 15-09-2009 à 16:04:51    

produvba a écrit :

Je te conseille de ne pas faire de macro et d'écrire directement une formule. Si la formule est trop compliquée, tu peux avoir des résultats partiels dans des colonnes cachées.  
L'avantage est que tu vois tout de suite le résultat et que cela calcule aussi beaucoup plus vite qu'une macro


Oui et non. Tout depend de sa version d'Excel. Car au dessus de 7 SI() imbriqué, faut avoir recours a une cellule connexe si<2007
 
 
 
Pourquoi elle ne marche pas ? Message d'erreur ? Probleme de renvoie du resultat ?
Soit plus precis quant au souci rencontré
 
Comme ca, a la louche, le souci majeur pour moi sont des If imbriqué à la rache dans des IF, mais sinon je ne tique pas sur qqchose de particulier.
Regarde du coté de ElseIf peut etre, ca sera plus lisible.
 
Utilise aussi les balises [cpp][/cpp] pour ton code


Message édité par SuppotDeSaTante le 15-09-2009 à 16:06:53

---------------
Soyez malin, louez entre voisins !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed