Temps de calcul trop long

Bonjour,

Je dois faire un tableur qui répertorie les dates de validité de formations, base de donnée extraite d'un logiciel interne.

J'utilise la commande "RECHERCHEVENS" via un VBA que j'ai récupérer sur internet mais avec mes 30 000 lignes de données pour l'instant, et ce nombre va augmenté chaque année, quand je lance le calcul ça prend 25/30 min.

Je voudrais savoir si il y avais moyen de simplifié le code VBA ou de faire une méthode de tris pour les formations pour simplifié le calcul sachant que pour la même formation il peux y avoir jusqu'à 4 nom possible.

je vous joint un doc miniature de mon travail actuel.(Je ne connais rien au VBA)

Dans l'attente de vous lire, Merci.

Bonjour,

Peux tu partager le code en dehors du fichier ?

Merci d'avance

Cordialement,
PARRISH

Bonjour je ne peux pas envoyer de lien pour l'instant je suis trop jeune sur le site

J'ai trouver une solution le voici

3code-vba.txt (7.13 Ko)

Il y a un icone de code quand vous ecrivez un message

Voici un exemple :

Function RECHERCHEVENS_OPT(ColonneValeur As Range, Critere1 As Variant, PlageRecherche1 As Variant, Critere2 As Variant, PlageRecherche2 As Variant, _
Optional Critere3 As Variant, Optional PlageRecherche3 As Variant, _
Optional Critere4 As Variant, Optional PlageRecherche4 As Variant, _
Optional Critere5 As Variant, Optional PlageRecherche5 As Variant) As Variant

    'Auteur : https://www.linkedin.com/in/spilerstheo/
    'Date : 01/2024
    'Version optimisée de la fonction RECHERCHEVENS

    Dim ws As Worksheet
    Dim dataArray As Variant
    Dim lastRow As Long, i As Long
    Dim criteres(1 To 5) As Variant
    Dim plages(1 To 5) As Range
    Dim nbCriteres As Integer

    ' Préparation des critères et des plages
    Set plages(1) = PlageRecherche1
    Set plages(2) = PlageRecherche2
    criteres(1) = Critere1
    criteres(2) = Critere2
    nbCriteres = 2

    If Not IsMissing(Critere3) Then
        Set plages(3) = PlageRecherche3
        criteres(3) = Critere3
        nbCriteres = 3
    End If
    ' Répéter pour Critere4 et Critere5 si nécessaire

    ' Vérification des critères vides
    For i = 1 To nbCriteres
        If criteres(i) = "" Then
            RECHERCHEVENS_OPT = "#VALEUR"
            Exit Function
        End If
    Next i

    ' Chargement des données dans un tableau
    Set ws = plages(1).Worksheet
    lastRow = ws.Cells(ws.Rows.Count, plages(1).Column).End(xlUp).Row
    dataArray = ws.Range(ws.Cells(1, plages(1).Column), ws.Cells(lastRow, plages(nbCriteres).Column))

    ' Parcours du tableau pour trouver les critères
    For i = LBound(dataArray, 1) To UBound(dataArray, 1)
        If dataArray(i, 1) = criteres(1) And dataArray(i, 2) = criteres(2) Then ' et ainsi de suite pour les autres critères
            ' Trouver la valeur correspondante dans ColonneValeur
            If IsError(ColonneValeur.Cells(i).Value) Then
                RECHERCHEVENS_OPT = "#N/A"
            Else
                RECHERCHEVENS_OPT = ColonneValeur.Cells(i).Value
                Exit Function
            End If
        End If
    Next i

    ' Si aucun résultat trouvé
    RECHERCHEVENS_OPT = "Pas de correspondance"
End Function

Je vous laisse tester le code voir si cela marche pour vous (pense à faire une copie de vos fichiers avant)

Cordialement,
Parrish

Bonjour manuïa et

Bonjour Parrish,

Pas le temps, ni le courage de chercher à comprendre le code (et tu ne dis pas clairement ce que tu attends comme résultats !?)
Mais avec un simple Tableau Croisé Dynamique, j'obtiens ce qui suit :

image

Pour des Noms-Prénoms identiques et une même formation, on affiche la date la plus "grande"

Parrishe, merci

J'ai essayé le code, Ca me met le message d'erreur #NOM?

Bonjour U. Milité

je dois à terme afficher les formations que tout le monde de mon service a à jour et avoir une note d'information des personnes avec des formations périmer ou bientôt périmer, et il fraudais que ce document puisse ce mettre à jour automatiquement à chaque nouvel extraction.

je viens de découvrir grâce à vous le tableau je ne comprend pas comment vous pouvez obtenir ce tableau aucun ne m'es proposer de ce style, du coup si le tableau suffit ce serais possible de faire un regroupement sous un même nom les formations normal et recyclage pour ceux qui ont les deux et de triés les personnes aussi?

Re-bonjour,

Voici la configuration utilisée pour la liste de champs du TCD :

image

On peut sans doute utiliser aussi Power Query ... Difficile d'être plus précis à ce stade (par exemple : comment distinguer les formations "normales" des "recyclages" ? Les secondes sont celles où le mot "recyclage" figure ? Faut-il distinguer les "SST" des "ABCD" ?, etc.)

Peux-tu créer un fichier, sur base de ton premier exemple, avec différents cas de figure en entrée et les résultats attendus (avec des explications pour quelques cas) ?

J'ai réussis à faire le tableau mais ça ne colle pas vraiment mais pourquoi pas je vais creuser l'idée.

J'ai fait dans le doc ci-joins un exemple de ce que l'on ma demandé de faire avec quelque explications si ce n'est pas claire reviens vers moi.

Je pense vraiment qu'il ce sont trompés de personne en me demandant ça
Cordialement, merci pour l'aide.

Bonjour,

Désolé, mais ce n'est pas encore très clair :

  • Où figure le "service", pour chacun (Magasins, Maintenance, etc.) ? Si l'info figure bien dans ton tableau de départ, ce champ peut figurer dans la zone de Filtre du TCD
  • Quand tu dis du tableau que "ça ne colle pas vraiment", précise ce qui manque (on n'est pas dans ta tête )
  • Au passage, si le code de la fonction personnalisée a été modifié, il faut utiliser la bonne syntaxe dans la feuille de calcul et donc, dans le cas présent =RECHERCHEVENS_OPT( ) au lieu de =RECHERCHEVENS( )
Rechercher des sujets similaires à "temps calcul trop long"