Besoin d'aide pour macro [VBA] - VB/VBA/VBS - Programmation
Marsh Posté le 01-09-2009 à 12:00:08
A mon avis, le plus simple c'est de réorganiser ta feuille de données en ajoutant une colonne acces et en supprimant les lignes intermédiaires qui répetent les entêtes.
Ensuite tu selectionnes tout ton tableau, tu vas dans données/Rapport de tableaux croisés dynamique. suivant, suivant. Ensuite tu cliques sur disposition.
Tu fais glisser Nom, num carte, date création, date expiration, société sur Ligne, acces sur colonne et encore une fois acces sur Données.
Tu double cliques sur tous les champs de ligne un par un et tu coches "Aucun" pour sous totaux. Tu double cliques sur acces que tu as mis dans données et tu sélectionnes "Nombre" au lieu de "Sommes".
Ok, Terminer et voilà. Bon tu as des "1" au lieu des X et pas de case rouge mais une petite mise en forme conditionnelle t'arrangera ça.
Je te mets le fichier comme je l'ai traité ici :
http://cjoint.com/data/jbl0kjar3F.htm
(Pas sur que ça soit super clair mais les TCD ça a beau être de la merde pour ton cas ça me parait ce qu'il y a de plus simple.
Marsh Posté le 12-09-2009 à 14:35:34
Bonjour à tous,
Je me permets de solliciter votre aide à mon tour.
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
Marsh Posté le 31-08-2009 à 12:08:57
Bonjour,
J'ai actuellement un fichier excel qui contient plusieures lignes de noms (environ 1500). Certains noms apparaissent plusieurs fois.
Mon but est de créer un nouveau document Excel qui contiendrait cette liste de nom une seule fois, puis les colones apparentées à côté (une sorte de matrice en gros)
Ce n'est pas très clair comme ça, je pense que le mieux serait de regarder le fichier joint
La base est dans la "Sheet 1", tandis que le résultat que je souhaite obtenir est dans l'onglet "Résultat"
Fichier joint : http://cjoint.com/?iFmiDpzB0e
Si quelqu'un pouvait m'aider à développer une macro pour ça, cela m'éviterais un long travail fastidieux
N'ayant pas de connaissances en VBA, et ne sachant pas quoi taper comme recherche dans google, je m'en remet à vous
Merci !