Parcourir une liste d'individus dans un tableau Excel

Bonsoir,

D'avance merci à ceux qui répondront à mon message.

J'ai un tableau Excel dans lequel je contrôle la réduction Fillon.

(tableau issue de ma formation et non du boulot donc pas confidentiel).

Aujourd'hui cela reste un contrôle limité.

Je souhaite donc élargir ce contrôle à une population de 300 individus.

Objectif recherché :

Il faudrait qu'une macro parcoure une liste de salariés dans un tableau excel.

Le résultat de ces enchaînements de calcul doit être reporté dans un onglet pour chaque salariés.

Structure du fichier :

J'ai 4 onglets :

  • un onglet de données
  • un onglet Analyse, dans lequel les données sont calculées
  • un onglet : liste de salariés
  • un onglet résultat

La liste de salariés doit défiler dans la cellule B2 de l'onglet Analyse surlignée en jaune.

Le résultat de ce calcul en cellule X21 de l'onglet Analyse surlignée en bleu doit être reporté dans l'onglet Résultat en reprenant la liste des salariés.

J'espère avoir été complet.

Encore merci

Bonsoir ccss

En réponse à ta question :

La liste de salariés doit défiler dans la cellule B2 de l'onglet Analyse surlignée en jaune.

1) Sélectionnes la colonne C dans l'onglet "Liste salariés"

2) Dans l'onglet "Formule" sélectionnes "Gestionnaire de noms"

3) Cliques sur "Nouveau"

4) Donne un Nom à ta liste par exemple "Liste_Salariés"

5) Dans l'ongle "Analyse" sélectionnes la cellule B2

6) Sélectionnes l'onglet "Données" et dans le sous-onglet sélectionnes "Outils de données"

7) Sélectionnes "Validation de données"

8) A l'ouverture du formulaire sélectionne l'onglet "Options

9) Choisis "Liste" dans "Autoriser"

10) et dans "Sources" colle "Liste_Salariés"

Maintenant tu as une liste déroulante correspond à celle inscrite dans l'onglet "Liste salariés"

Bonsoir et1000lio et merci pour le retour,

Créer une liste déroulante m'oblige à sélectionner salariés par salariés alors qu'un programme pourrait parcourir la liste rapidement et me ramener les résultats.

je ne sais pas si je m'exprime correctement

Bonjour,

l'idée est là, mais calculs sur feuille et vba ne font pas toujours bon ménage.

Ils ne sont pas synchronisés et il arrive, s'il y a des formules lourdes, que vba récupère une valeur non encore évaluée...

J'ai tenté de le pousser à attendre avec Application.CalculationState = xlDone mais je n'ai pas assez de recul pour affirmer que c'est fiable à 100%.

Bon, on peut supposer que oui, et tes formules ne sont pas si terribles. Fait quand des contrôles par sondage.

eric

Bonsoir Eric,

Pourrais tu me joindre le fichier avec ta macro ?

Merci

Ah, mais c'est qu'il a des exigences en plus

Bon, ok

c'est génial ce que tu as fait !!

précédemment tu m'indiquais que le fichier n'était pas efficient (des formules brouillons).

tu peux me développer ta critique

merci

Tes formules ne sont pas en cause à partir du moment où elles sont nécessaires et optimisées.

Les formules et vba mènent leur vie indépendamment.

Par exemple tu écris une valeur sur la feuille en vba, tu as beaucoup de formules lourdes (lentes comme des gros sommeprod) et la feuille met 1s à se recalculer.

Seulement vba lui a continué et récupère une valeur 0.001s plus tard alors que le bon résultat n'est pas encore là.

C'est pourquoi c'est déconseillé de mélanger tout ça et de faire tous les calculs en vba quand tu es dans cette situation.

La boucle

Do Until Application.CalculationState = xlDone
    DoEvents
Loop

est sensée tourner tant qu'il reste des calculs en suspend pour récupérer la bonne valeur.

eric

Encore merci

J'ai regardé un peu ton codage.

Il y a un passage, ci-dessous, que je ne comprends pas.

Le programme Dictionnary est utilisé pour garder en mémoire les matricules mais après je ne comprends pas l'enchaînement.

Set dict = CreateObject("Scripting.Dictionary")

With shD

datas = .[D2].Resize(.Cells(Rows.Count, 2).End(xlUp).Row - 1, 3).Value

End With

For lig = 1 To UBound(datas)

If Not dict.exists(datas(lig, 1)) Then dict(datas(lig, 1)) = datas(lig, 2) & "µ" & datas(lig, 3)

Next lig

ReDim result(1 To dict.Count, 1 To 4)

lig = 0

Liste sans doublon oui.

J'en profite pour y stocker prénom et nom qui serviront plus tard, ça m'évite de devoir aller les retrouver dans le tableau ou sur la feuille.

Je les sépare ensuite sur le caractère µ (ça peut être n'importe quel caractère non utilisé dans un nom) avec split

Bonjour Eric,

En fait pour la liste de salariés, je souhaitais m'appuyer sur l'onglet "liste salariés" de sorte que je puisse opérer une sélection de salariés.

Du coup j'ai tenté de modifier la partie du programme ci dessus.

J'ai défini l'onglet shE et j'ai tenté de remplacé shD dans le programme ci dessous.

Mais ça colle les données un peu n'importe où.

Set dict = CreateObject("Scripting.Dictionary")

With shE

datas = .[C1].Resize(.Cells(Rows.Count, 2).End(xlUp).Row - 1, 3).Value

End With

For lig = 1 To UBound(datas)

If Not dict.exists(datas(lig, 1)) Then dict(datas(lig, 1)) = datas(lig, 2) & "µ" & datas(lig, 3)

Next lig

ReDim result(1 To dict.Count, 1 To 4)

lig = 0

Bonjour,

avec les salariés voulus à partir de 'Liste salariés'!C1:E1

Sub fillon()
    Dim datas
    Dim shD As Worksheet, shA As Worksheet
    Dim lig As Long

    Set shD = Worksheets("Liste salariés")
    Set shA = Worksheets("Analyse")
    With shD
        datas = .[C1].Resize(.Cells(Rows.Count, 3).End(xlUp).Row, 4).Value
    End With
    ReDim result(1 To UBound(datas, 1), 1 To 4)
    For lig = 1 To UBound(datas)
        With shA
            .[B2].Value = datas(lig, 1)
            Do Until Application.CalculationState = xlDone
                DoEvents
            Loop
            datas(lig, 4) = .[X21]
        End With
    Next lig
    [A1].CurrentRegion.Offset(1).ClearContents
    [A2].Resize(UBound(datas, 1), 4) = datas
End Sub

eric

Rechercher des sujets similaires à "parcourir liste individus tableau"