Tableau et doublons en VBA

Résolu/Fermé
SleepyAshes Messages postés 34 Date d'inscription mardi 31 mai 2016 Statut Membre Dernière intervention 29 juin 2017 - Modifié par SleepyAshes le 6/06/2016 à 14:24
SleepyAshes Messages postés 34 Date d'inscription mardi 31 mai 2016 Statut Membre Dernière intervention 29 juin 2017 - 7 juin 2016 à 09:34
Bonjour à la communauté,

Je suis vraiment un débutant en VBA et je me retrouve bloqué dans un exercice donné par un ami.

Voilà la consigne:

Dans une feuille excel se trouve plusieurs nom de personnes travaillant pour X entreprise. Quelques colonnes plus loin se trouve le nombre de jour où ils ont travaillé. Le truc c'est que les noms se répète un nombre x de fois mais il y a au total 15 personnes seulement (les lignes allant jusqu'à 890 dont la première ligne sert d'entête). J'aimerais donc avec une macro créé une liste qui m'affiche seulement 1 seule fois UNE SEULE PERSONNE mais qui fasse la somme de ses journées de travail. Si le résultat pouvait se trouver en cellule E2 ce serait parfait Il suffirait que la macro fonctionne que pour un seul nom (Olivier par exemple)


Merci d'avance :)
A voir également:

1 réponse

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
6 juin 2016 à 16:47
Bojour SleepyAshes, bonjour le forum,

Comment peux-tu être aussi vague puis demander de renvoyer le résultat en E2 ! La méthode dépend complètement de la disposition des données...

Le code ci-dessous fonctionne si les noms sont en colonne A les jours en colonne C et la colonne B contient des données :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable O (Onglet)
Dim I As Long 'déclare la variable O (Onglet)
Dim TP As Variant 'déclare la variable TP (Tableau Temporaire)
Dim TJ() As Variant 'déclare la variable TJ (Tableau des Jours)

Set O = Worksheets("Feuil1") 'définit l'onglet O (a adapter)
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV (à adapter)
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données de la première colonne du tableau ds valeur TV
Next I 'prochaine ligne de la boucle
TP = D.keys 'récupère dans le tableau temporaire TP la liste des éléments du dictionnaire D sans doublon
ReDim TJ(UBound(TP)) 'redimensionne le tableau des jours TJ (autant de lignes que TP)
For I = 0 To UBound(TP) 'boucle 1 : sur toues les éléments du tableau TP
    For J = 2 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes du tableau des valeurs TV (en partant de la seconde)
        If TV(J, 1) = TP(I) Then TJ(I) = TJ(I) + TV(J, 3) 'si la donnée ligne I, colonne 1 de TV est égale à l'élément de TP, fait la somme dans le tableau TJ
    Next J 'prochaine ligne de la boucle 2
Next I 'prochain élément de la boucle 1
Range("E2").Resize(UBound(TP) + 1, 1) = Application.Transpose(TP) 'renvoie dans E2 redimensionné le tableau TP transposé
Range("F2").Resize(UBound(TP) + 1, 1) = Application.Transpose(TJ) 'renvoie dans F2 redimensionnée le tableau TJ transposé
End Sub


Le résultat s'affiche dans les colonnes E et F à partir de la ligne 2.

Tu adapteras...


0
SleepyAshes Messages postés 34 Date d'inscription mardi 31 mai 2016 Statut Membre Dernière intervention 29 juin 2017
6 juin 2016 à 16:50
Merci pour ton aide :)
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
Modifié par pijaku le 7/06/2016 à 09:06
Bonjour vous deux,

Une petite variante de la méthode de ThauTheme (salutations) :

Option Explicit

Sub NbJours()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionary)
Dim I As Long 'déclare la variable I (incrémentation indice tableau)

    Set O = Worksheets("Feuil1") 'définit l'onglet O (a adapter)
    TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV (à adapter)
    Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
    For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
        D(TV(I, 1)) = D(TV(I, 1)) + TV(I, 3) 'alimente le dictionnaire D avec les sommes de jours
    Next I
  Range("E2").Resize(D.Count, 1) = Application.Transpose(D.keys)
  Range("F2").Resize(D.Count, 1) = Application.Transpose(D.items)
End Sub


EDIT : Si tu veux en E2 la somme des jours pour Olivier, il suffit d'une formule, pas besoin de VBA.
Avec les prénoms en colonne A et les jours en colonne C, saisir en E2 :
=SOMMEPROD((A2:A2000="Olivier")*(C2:C2000))
0
SleepyAshes Messages postés 34 Date d'inscription mardi 31 mai 2016 Statut Membre Dernière intervention 29 juin 2017
7 juin 2016 à 09:34
Merci pour votre aide! J'espère pouvoir de nouveau m'en remettre à vous chers passionnées et vous remercie de m'aider à progresser! :)

Bonne journée
0