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 :

macro avec .find qui fonctionne pas à pas mais pas en mode normal


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    /
    Inscrit en
    Janvier 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : /
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2022
    Messages : 2
    Par défaut macro avec .find qui fonctionne pas à pas mais pas en mode normal
    Bonjour à tous.

    Je suis coincé par quelque chose que je ne comprends pas.

    J'ai regardé comment fonctionne .find et je remercie le forum pour les informations précieuses.

    Je sais ce bout de code n'est pas optimisé, ni bien rédigé (pique même très probablement les yeux ), j'ai de plus remplacé les is nothing par des "" ou pas non, mais mon problème existait aussi bien avec la rédaction is nothing (je la reprendrai comme cela par la suite).

    Pour vous expliquer un peu plus le problème.

    J'ai un userform et une base de données. Je veux via une textbox saisir la donnée que je cherche, et que les résultats trouvés sur les différentes lignes ainsi que les données des colonnes sur ces mêmes lignes soient inscrit dans une listbox.

    Quand je déroule pas à pas via F8 le code, tout se passe très bien et j'ai les résultats attendus qui s'écrivent.

    Malheureusement quand je lance le userform sans passer par un point d’arrêt ou par le pas à pas ça bug!

    Je ne comprends pas pourquoi.

    A toute fin utile voici le code rédigé dans le userform

    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
    37
    38
    39
    40
    41
    42
    43
    44
     
     
    Private Sub rec_Click()
     
    Dim trouvecellule As Range
    Dim premadresse As String
    Dim myarray7(5000, 5) As Variant
    h = 0
     
    With Worksheets("feuil1").Range("D2:D5000")
     
    Set trouvecellule = .Find(reparnom.Value)
     
    If trouvecellule <> "" Then
         premadresse = trouvecellule.Address 
     
    End If
     
      Do Until trouvecellule = ""
     
         t = trouvecellule.Row
         myarray7(h, 0) = Cells(t, 4)
         myarray7(h, 1) = Cells(t, 5)
         myarray7(h, 2) = Cells(t, 6)
         myarray7(h, 3) = Cells(t, 8)
         myarray7(h, 4) = t
         Set trouvecellule =Range("D1:D5000").FindNext(after:=trouvecellule)
     
      If trouvecellule.Address = premadresse Then
     
             GoTo 2
     
         End If
         h = h + 1
     
    Loop
    End With
     
    2 resu.ColumnCount = 5
    resu.ColumnWidths = "60;280;200;320,15"
       resu.List() = myarray7
     
     
    End Sub
    Merci à vous tous pour votre aide et très bonne soirée.

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Dans cette ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resu.ColumnWidths = "60;280;200;320,15"
    il faut remplacer la virgule par un point et les points virgules par des virgules.

    puis votre code modifié mais non testé:
    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
    Private Sub rec_Click()
        Dim TrouveCellule As Range
        Dim PremAdresse As String
        Dim Myarray7(5000, 5) As Variant
        h = 0
        With Worksheets("feuil1").Range("D2:D5000")
            Set TrouveCellule = .Find(reparnom.Value, lookat:=xlWhole)
            If Not TrouveCellule Is Nothing Then
                PremAdresse = TrouveCellule.Address
                Do
                    t = TrouveCellule.Row
                    Myarray7(h, 0) = Cells(t, 4)
                    Myarray7(h, 1) = Cells(t, 5)
                    Myarray7(h, 2) = Cells(t, 6)
                    Myarray7(h, 3) = Cells(t, 8)
                    Myarray7(h, 4) = t
                    Set TrouveCellule = .FindNext(TrouveCellule)
                    h = h + 1
                Loop While Not TrouveCellule Is Nothing And TrouveCellule.Address <> PremAdresse
            End If
        End With
        resu.ColumnCount = 5
        resu.ColumnWidths = "60,280,200,320.15"
        resu.List() = Myarray7
    End Sub
    Cdlt

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    /
    Inscrit en
    Janvier 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : /
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2022
    Messages : 2
    Par défaut
    Bonjour,
    Merci pour votre retour.
    Une avancée car ça ne plante plus mais il reste un problème toujours pas à pas vs exécution normale.
    En pas à pas par F8 les données remontent et s'écrivent bien dans la listbox.
    En revanche en mode exécution seule la valeur issue de la ligne suivante remonte.

    Les valeurs stockées dans myarray7(h,0) jusqu'à (h,3) restent désespérément vides. Comme si le = n'était pas lu car la valeur de cells (t,4)... sont bien remontées et bien les bonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Myarray7(h, 0) = Cells(t, 4)
                    Myarray7(h, 1) = Cells(t, 5)
                    Myarray7(h, 2) = Cells(t, 6)
                    Myarray7(h, 3) = Cells(t, 8)
                    Myarray7(h, 4) = t
    En pas à pas pas de problème les valeurs stockées dans myarray7(h,0) jusqu'à (h,3) le = est bien appliqué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Myarray7(h, 0) = Cells(t, 4)
                    Myarray7(h, 1) = Cells(t, 5)
                    Myarray7(h, 2) = Cells(t, 6)
                    Myarray7(h, 3) = Cells(t, 8)
                    Myarray7(h, 4) = t
    Première fois que je vois cela...

    Merci à vous

    Cdlt

  4. #4
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Je vois aussi que vous déclarez la listbox avec 5 colonnes, mais il n'y a que 4 largeurs de colonnes paramétrées. j'ai fait un test en mettant en remarque cette ligne et ça fonctionne, regardez de ce côté là.

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    hello,
    j'ai fait un test de performance en utilsant trois méthodes différentes sur une colonne de 5000 éléments comportant des fruits tirés aléatoirement parmi 18 fruits.
    Les 3 méthodes sont :
    1 - Par Find
    2 - Par Match
    3 - Par Tableau de variants

    Nom : testRecherche.PNG
Affichages : 130
Taille : 56,8 Ko

    Voici les résultats :
    =========================================================
    RechercheFind : Trouvés : 305 Temps : 91,4669000012509 ms
    Remplissage Liste : 4,93780000033439 ms
    =========================================================
    RechercheMatch : Trouvés : 305 Temps : 9,10300000032294 ms
    Remplissage Liste : 4,80890000108047 ms
    =========================================================
    RechercheVarTab : Trouvés : 305 Temps : 7,35640000129933 ms
    Remplissage Liste : 3,55789999957778 ms
    =========================================================
    A noter que la méthode Find n'utilise pas tout à fait celle de Avocatier car celle-ci plante lorsqu'il n'y pas de résultat.
    Le Remplissage de la listbox est un peu plus rapide dans la dernière méthode car seulement les résultats remplissent la listBox.

    Si cela intéresse des personnes d'avoir le code ou le classeur de test, je peux le mettre à disposition ici.

    Il est à noter que pour l'opération demandée on peut aussi utiliser un filtre.

    Ami calmant, J.P

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur VBA

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Par défaut
    Hello jurassic pork,

    Merci pour ton Chronométrage... je ne pensais pas que Find était si lent, j'éviterai de l'utiliser pour mes grands listings

    Ton message m'intrigue...

    Je connais la méthode avec Find ainsi que celle avec un tableau de variant.
    Par contre avec Match je ne comprend pas comment tu utilises cette fonction. Match permet de retrouver 1 seul enregistrement (un peu comme RechercheV). comment procèdes-tu pour utiliser cette fonction et retrouver plusieurs enregistrement ?

    Merci d'avance pour ta réponse.

Discussions similaires

  1. [MySQL] Requête qui fonctionne en dur mais pas avec des variables
    Par matthieu24 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 11/12/2017, 07h37
  2. Diaporama qui fonctionne pas en mode site variable %.
    Par Marc31 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 10/03/2017, 12h16
  3. [MySQL] requête avec sous requete qui fonctionne sur PhpMyAdmin mais pas avec un script PHP
    Par Park033 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 18/02/2017, 22h18
  4. [LibreOffice][Tableur] Une macro qui fonctionne sous Linux mais pas sous windows
    Par ludox62 dans le forum OpenOffice & LibreOffice
    Réponses: 3
    Dernier message: 07/01/2014, 21h26
  5. Réponses: 0
    Dernier message: 24/06/2010, 15h10

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