IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème de lenteur


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 633
    Par défaut Problème de lenteur
    Bonjour,
    je dois vérifier à chaque saisi de dossier, dans une base de données fermée, si le dossier existe et si oui, s'il n'est pas traité par un autre.
    pour ce faire, j'ai écrit ce code qui fonctionne mais qui est très lent entre 20 et 35 secondes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Private Sub TbxNir_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    'RECHERCHE DU NIR
    Application.ScreenUpdating = False
        RcNir = TbxNir  'Sert à VerifNir()
    If TbxNir <> "Sans espace" Then
        'Vérif de la longueur du Nir
        If Len(TbxNir) < 18 Then
            MsgBox "Nir erroné : " & vbCrLf & vbCrLf & _
                "Nb de caractères insuffisant." & vbCrLf & "Merci", _
                vbCritical, "SARA - Recherche de NIR existant"
            TbxNir.SetFocus
            Exit Sub
        End If
        Call VérifNir
            If vNir = True Then 's'il existe
                LbNom.Visible = True
                TbxNom.Visible = True
                LbGeRa.Visible = True
                TbxGera.Visible = True
                TbxNom = sNom
                TbxGera = sGera
            Else
                MsgBox "Nir non trouvé." & vbCrLf & vbCrLf & "Merci" _
                 , vbInformation, "SARA - Recherche de NIR existant"
            End If
    Else
        If TbxNir = "" Then
            MsgBox "Veuillez saisir un Nir, merci", _
                vbInformation, "SARA - Recherche de NIR existant"
            TbxNir.SetFocus
            Exit Sub
        End If
    End If
    Application.DisplayAlerts = False
    End Sub
    Est-ce que quelqu'un peut me donner un "truc" pour accélérer la réponse.

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour mouftie

    à mon avis, c'est ta procédure VérifNir qui impacte la durée d'exécution, peux-tu nous la montrer ?

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    If vNir = True Then
    n'est vérifiable que si vNir est une variable booléenne accessible (et on n'en voit nulle part la déclaration) et que la procédure (on voit bien qu'il ne s'agit pas d'une fonction, mais d'une routine) en initialise la valeur.

    Comme je vois qu'il s'agit de déterminer une existence, je pense qu'il serait bien plus normal d'utiliser une fonction retournant une booléenne

  4. #4
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 633
    Par défaut
    Bonjour Joe et unparia
    Merci pour vos réponses
    Voici la procédure de vérif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    Public Var As Boolean, vNir As Boolean
    sub VérifNir()
    'RECHERCHE DU NIR DANS Recap
    'on ouvre Recap.xlsx
    Application.ScreenUpdating = False
    If RcNir = "Sans espace" Then Exit Sub
    Call OuThé   'procédure pour récupérer les Adresses répertoi
    '    RcNir = "2 59 01 01 321 654" 'TbxNir récupéré ds TbxNir_BeforeUpdate
        Dest = "SARA Recap.xlsx"
        Set WbSc = ThisWorkbook
        Set WbDest = Workbooks.Open(Filename:=Chem & "Admin\" & Dest)
        DerLg = Range("A" & Rows.Count).End(xlUp).Row
        Set Plg = Range("A2:A" & DerLg)
        Set FindNir = Plg.Find(RcNir, LookIn:=xlValues, LookAt:=xlWhole) ', LookAt:=xlPart
    'on vérifie que s'il existe ce n'est pas le GeRA connecté
    'Gera connecté
    GeraConn = WbSc.Sheets("Données").[E1]
    If Not FindNir Is Nothing Then  's'il existe
        vNir = True
        sNom = FindNir.Offset(0, 1)
        sGera = FindNir.Offset(0, 3)
        If sGera = GeraConn Then
            MsgBox "Vous êtes le gestionnaire de cet assuré." _
                & vbCrLf & "" _
                & vbCrLf & "Vous avez déjà effectué un ou plusieurs enregistrements." _
                & vbCrLf & "Pour le(s) consulter, allez dans le tableau de suivi et faites un filtre." _
                & vbCrLf & "" _
                , vbInformation Or vbDefaultButton1, "SARA - Nir existant"
    '        vNir = False   'Retiré car renvoie le mess Nir NT...
    End If
    Else
        vNir = False
    End If
        WbDest.Close True
    End Sub
    Unparia : je ne suis pas très à l'aise avec les fonctions...
    Merci de votre aide

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Déjà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Var As Boolean, vNir As Boolean '-->> si RcNir n'est pas déclarée également "globale/générale" ailleurs, ne sera pas accessible partout
    Call VérifNir ' === Appelée, donc, sans paramètre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sub VérifNir() '--->> exécutée, donc, sans paramètre
    '....
       If RcNir = "Sans espace" Then Exit Sub ' --->> ne connait pas RcNir

  6. #6
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 633
    Par défaut
    bonjour unparia,
    RcNir est une variable string qui récupère les saisies NIR des Textbox, déclarée en Public.
    Le pb, ne vient pas de là, RcNir est bien reconnu dans la fenêtre d'exécution.

  7. #7
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour tout le monde,

    Je vois :
    Peut-on voir le code de cette procédure?

    La seule "chose" qui apparaîtrai lente dans tout le code donné ici est l'ouverture du classeur SARA Recap.xlsx :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set WbDest = Workbooks.Open(Filename:=Chem & "Admin\" & Dest)
    Essaye donc en ayant ouvert préalablement ce fichier (dans Userform_Activate() par exemple).

  8. #8
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 633
    Par défaut
    Bonjour pijaku, merci de ta réponse
    Outhé est une procédure que j'utilise toujours pour récupérer les adresses afin de pouvoir transférer mes fichiers sur les réseaux sans problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub OuThé()
    Appl = ActiveWorkbook.Name     'Appl = Tri d_une Liste.xlsm
    ChemApp = ThisWorkbook.Path    'ChemApp = A:\# AutoFormMacro\UserForms
    Chem = Left(ChemApp, InStrRev(ChemApp, "\"))      'Chem = A:\# AutoFormMacro\
    End Sub
    tu dis :
    Essaye donc en ayant ouvert préalablement ce fichier (dans Userform_Activate() par exemple).
    Oui, je pense bien que le problème vient de là, mais "SARA Recap.xlsx" est utilisé soit en lecture soit en écriture par tous les utilisateurs, donc je ne peux pas le laisser ouvert.
    J'aurai pu également en rapporter une copie, mais la copie ne sera pas à jour des nouveaux enregistrements des collègues.

    N'y a t-il pas un moyen simple (je ne suis vraiment pas experte en VBA) de chercher dans un fichier fermé et de ne l'ouvrir que pour un nouvel enregistrement ?

    Merci de ton aide

  9. #9
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par mouftie Voir le message
    N'y a t-il pas un moyen simple (je ne suis vraiment pas experte en VBA) de chercher dans un fichier fermé et de ne l'ouvrir que pour un nouvel enregistrement ?
    Le seul moyen simple que je connaisse est d'utiliser une formule de calcul.

    Par exemple :
    On recherche :
    le contenu de la cellule B3
    dans le classeur : Classeur1.xlsx (classeur situé dans le répertoire : C:\Users\machin\Desktop\)
    dans la feuille : Feuil1
    dans la plage : A18 en première colonne (valeur située colonne A)
    On souhaite avoir en retour la valeur contenue dans la colonne C (3ème colonne de la plage)
    =RECHERCHEV(B3;'C:\Users\machin\Desktop\[Classeur1.xlsx]Feuil1'!$A$1:$D$8;3;FAUX)

    Après ce n'est peut-être pas adapté à ton besoin...
    A voir

  10. #10
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 633
    Par défaut
    Bonsoir Pijaku,
    Merci pour ta réponse ; elle n'est pas vraiment utilisable ici, parce c'est surtout les enregistrements fait par les autres utilisateurs que je cherche à connaître.

  11. #11
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 633
    Par défaut
    Bonjour à tous et merci pour vos aides.
    J'ai eu une illumination cette nuit...
    Dans mon fichier Récap, il a une formule qui crée des liens hypertextes (qui pouvaient servir à ouvrir le fichier mère)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =LIEN_HYPERTEXTE($A$2;$A$3&$E5)
    je l'ai supprimé, c'est miraculeux
    j'étais tellement persuadée que cela venait du réseau ou / et du code...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/06/2006, 11h59
  2. [Applet] Problème de lenteur d'un JTree
    Par Frac10 dans le forum Composants
    Réponses: 3
    Dernier message: 22/05/2006, 16h49
  3. [CR10][ODBC][XML] problème de lenteur
    Par capitainerotel dans le forum Connectivité
    Réponses: 4
    Dernier message: 09/05/2005, 18h58
  4. Optimiser MS SQL2000 car j'ai des problèmes de lenteurs
    Par djavaux dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 21/04/2004, 10h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo