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 :

Erreur 1004 avec la fonction Find [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut Erreur 1004 avec la fonction Find
    Bonjour.

    J'ai créé une fonction qui permet de rechercher si une ligne contient une valeur dans une certaine colonne (on précise l'index de la colonne, le nom de la feuille et le texte à rechercher) :
    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
    Function rechercherLigne(c As Integer, sheet As String, texte As String) As Long
        On Error GoTo errorHandler
     
        Dim VariableAdresse As Range
        Set VariableAdresse = Sheets(sheet).Columns(c).Find(what:=texte)
        If VariableAdresse Is Nothing Then
            Debug.Print "Erreur la ligne '" & texte & "' n'a pas été trouvé."
            rechercherLigne = -1
        Else
            rechercherLigne = VariableAdresse.row
        End If
     
        Exit Function
    errorHandler:
        MsgBox "Erreur dans recercherLigne " & Err.Number & vbLf & Err.Description
    End Function
    Parfois j'ai un message d'erreur 1004, alors que la valeur existe. (l'erreur doit se produire quand une autre Macro copie des colonnes qui contiennent des cellules qui contiennent des appelles à des fonctions qui appellent la Macro qui plante).
    Edit : Quand je fais Ctrl+Alt+Maj+F9 je n'ai pas de problème.

    Du coup j'ai fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    On Error Resume Next
    Set VariableAdresse = Sheets(sheet).Columns(c).Find(what:=texte)
    On Error GoTo 0
    Et là ça ne plante plus, mais la ligne n'est pas trouvé.

    Si vous avez la moindre idée de l'origine du problème merci de m'en faire part.
    Au revoir.
    Keith Flint 1969 - 2019

  2. #2
    Membre confirmé
    Homme Profil pro
    Responsable des études(en disponibilité)
    Inscrit en
    Juin 2007
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable des études(en disponibilité)
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 365
    Points : 631
    Points
    631
    Par défaut
    peu être arrêter les macro événementielles

    pendant le déroulement de la macro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sub tamacro()
     
    Application.EnableEvents = False 
     
    ton code
     
    Application.EnableEvents = True
     
    end sub

  3. #3
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Si tu veux avoir une change de résoudre ton problème, enfin déjà de le comprendre, il faut supprimer (provisoirement) ta gestion d'erreur On Error Goto... Comme ça la macro sera en breack sur la ligne qui pose problème et tu pourras regarder la valeur de tes variables à ce moment.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  4. #4
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Comme dit Qwazerty, supprimer le gestionnaire et préciser aussi si la recherche doit être faite dans les valeurs ou les formules (résultat) et si la recherche est partielle ou exacte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Function rechercherLigne(c As Integer, sheet As String, texte As String) As Long
     
        Dim Cel As Range
     
        Set Cel = Sheets(sheet).Columns(c).Find(texte, , xlValues, xlWhole)
     
        If Cel Is Nothing Then rechercherLigne = -1 Else rechercherLigne = Cel.Row
     
    End Function
    Vérifier aussi si le nom de la feuille passé en argument est correctement orthographié, que le numéro de colonne ne soit pas inférieur à 1

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    comme ça a l'air un peu aléatoire, à la place de supprimer le contrôle d'erreur tu peux le compléter avec :
    Lorsque l'erreur survient tu fais en pas à pas avec F8 ce qui te renverra exécuter la ligne en erreur.
    eric

    PS : dans ton .Find précise les paramètres LookAt et LookIn.
    Sinon vba reprend ceux utilisés par la dernière recherche manuelle, et ce ne sera peut-être pas ceux que tu veux (recherche complète ou partielle, dans la valeur ou la formule)
    eric

  6. #6
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    Citation Envoyé par a_diard Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.EnableEvents = False 
    ton code
    Application.EnableEvents = True
    Je crois que j'ai déjà coupé les événements parce que le Worksheet_Change n'est pas appelé sur la feuille qui contient l'appelle de la macro.
    Mais j'ai quand même essayé de les désactiver et rien n'a changé.

    Citation Envoyé par Qwazerty Voir le message
    il faut supprimer (provisoirement) ta gestion d'erreur On Error Goto... Comme ça la macro sera en breack sur la ligne qui pose problème et tu pourras regarder la valeur de tes variables à ce moment.
    À la base je n'avais pas de gestion d'erreur dans cette fonction parce que n'avais pas testé le scénario qui fait planter la fonction find.

    Dans une cellule j'ai la formule :
    MonCalcul est une macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function MonCalcul(cell As Range)
       'Traitement
    End Function
    MonCalcul peut appeler rechercherLigne, avec le bon nom de feuille, le bon index de colonne et la bonne valeur => find plante ! (erreur 1004)

    Citation Envoyé par Theze Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Cel = Sheets(sheet).Columns(c).Find(texte, , xlValues, xlWhole)
    Là j'ai mis ça, mais ça ne change rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(sheet).Columns(c).Find(what:=texte, LookIn:=xlValues, LookAt:=xlWhole)
    Citation Envoyé par Theze Voir le message
    Vérifier aussi si le nom de la feuille passé en argument est correctement orthographié, que le numéro de colonne ne soit pas inférieur à 1
    C'est ça qui est étrange, les 3 variables sont correct, et en autres circonstances ça fonctionne.
    Quand je fais CTRL + ALT + MAJ + F9 ça fonctionne.

    J'ai une macro qui copie une colonne et la vide.
    La colonne copié contient des cellules qui vont appeler ma macro de calcul qui, selon les valeurs dans la colonne, va appeler ma fonction de recherche qui va planté.
    Donc à la base les calculs fonctionnent (les bonnes valeurs sont présentes), je copie la colonne et là ça plante et toutes les valeurs sont 0.00, je fais Ctrl+Alt+Maj+F9 et les résultats reviennent.

    Il faut que je regarde en détail ce que je fais pour copier les colonnes je trouverai peut être quelque chose.

    Citation Envoyé par eriiic Voir le message
    à la place de supprimer le contrôle d'erreur tu peux le compléter avec :
    PS : dans ton .Find précise les paramètres LookAt et LookIn.
    Sinon vba reprend ceux utilisés par la dernière recherche manuelle, et ce ne sera peut-être pas ceux que tu veux (recherche complète ou partielle, dans la valeur ou la formule)
    eric
    Je vais aller essayer ça merci.

    ===
    Merci pour toutes vos réponses c'est sympa
    J’espère que je vais rapidement résoudre le problème grâce à votre aide.
    Keith Flint 1969 - 2019

  7. #7
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    Désolé, double poste, mais j'ai un peu plus d'informations à partager.
    Juste avant que ça relance la macro de calcul on fait un peu près ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    ws.Activate
    ws.Columns(col).Select
    Selection.Copy
    Selection.EntireColumn.Insert
    Selection.ClearContents
    Selection.ClearComments
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    C'est la ligne "Selection.EntireColumn.Insert" qui fait planter le truc.

    Et sinon j'ai testé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         With Sheets(sheet).Columns(c)
            On Error Resume Next
                Set VariableAdresse = .Find(what:=texte, LookIn:=xlValues, LookAt:=xlWhole)
            On Error GoTo 0
        End With
    Mais ça ne change rien du tout.
    Keith Flint 1969 - 2019

  8. #8
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Ryu2000 Voir le message
    Et sinon j'ai testé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         With Sheets(sheet).Columns(c)
            On Error Resume Next
                Set VariableAdresse = .Find(what:=texte, LookIn:=xlValues, LookAt:=xlWhole)
            On Error GoTo 0
        End With
    Je ne vois pas trop l'intérêt de mettre un On Error avant le Find.
    Contrairement aux fonctions Excel comme EQUIV(), Find génère rarement une erreur.
    Si elle ne trouve rien, elle renvoie... rien. C'est-à-dire, en terme VBA, Nothing.

    Il serait donc plus juste d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Set VariableAdresse = Sheets(sheet).Columns(c).Find(what:=texte, LookIn:=xlValues, LookAt:=xlWhole)
        If Not VariableAdresse Is Nothing Then
    Pour l'autre code, laisse tomber les Select/Selection/Activate
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ws.Columns(col).Copy
    ws.Columns(col)..Insert
    ws.Columns(col).ClearContents
    ws.Columns(col).ClearComments
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  9. #9
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Je ne vois pas trop l'intérêt de mettre un On Error avant le Find.
    Contrairement aux fonctions Excel comme EQUIV(), Find génère rarement une erreur.
    Si elle ne trouve rien, elle renvoie... rien. C'est-à-dire, en terme VBA, Nothing.
    Non mais justement moi j'ai un scénario qui fait que Find génère une erreur 1004 à tous les coups !
    Ça n'est pas commun.

    Citation Envoyé par Menhir Voir le message
    Pour l'autre code, laisse tomber les Select/Selection/Activate
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ws.Columns(col).Copy
    Columns(col)..Insert
    Columns(col).ClearContents
    Columns(col).ClearComments
    D'accord, je vais essayer, merci.
    Keith Flint 1969 - 2019

  10. #10
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    En relisant mon message, je me suis aperçu que j'ai oublié les ws. devant les Columns.
    J'ai édité mon message pour le corriger.

    Citation Envoyé par Ryu2000 Voir le message
    Non mais justement moi j'ai un scénario qui fait que Find génère une erreur 1004 à tous les coups !
    Ça n'est pas commun.
    Je te conseille de comprendre pourquoi cette erreur est générée et d'y remédier.
    Ce sera plus convenable que d'utilisé un On Error.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    l'erreur doit se produire quand une autre Macro copie des colonnes qui contiennent des cellules qui contiennent des appelles à des fonctions qui appellent la Macro qui plante
    tu pourrais tenter de suspendre les calculs dans cette macro et de les rétablir à la fin.
    eric

  12. #12
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Je te conseille de comprendre pourquoi cette erreur est générée et d'y remédier.
    Ce sera plus convenable que d'utilisé un On Error.
    Oui, c'est le but du topic en fait.
    Je cherche à trouver la source du problème, parce que ce n'est pas normal que find plante. Quand je copie des colonnes tous les résultats disparaissent et je suis obligé de faire Ctrl + Maj + Alt + F9.

    Je copie 2 colonnes et je les colles à côté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ws.Range(ws.Columns(col), ws.Columns(col + 1).Copy
    ws.Columns(col + 2).Insert
    Le problème c'est qu'après je parcours chaque cellule pour garder les cellules qui contiennent des formules :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ws.Range(ws.Cells(18, col), ws.Cells(800, col)).Select
    For Each supContenuCellule In Selection
       If Not supContenuCellule.HasFormula Then
          If Not supContenuCellule.Hyperlinks.Count > 0 Then
             supContenuCellule.ClearContents
          End If
       End If
    Next supContenuCellule
    Sauf que le Select plante, surement parce que je n'ai pas fais d'activate.

    De toute façon, ça ne change pas le problème même en faisant l'insert sans activate et select, ça fait planter Find...
    Keith Flint 1969 - 2019

  13. #13
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    Citation Envoyé par eriiic Voir le message
    tu pourrais tenter de suspendre les calculs dans cette macro et de les rétablir à la fin.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.Calculation = xlCalculationManual
    ' Traitement
    Application.Calculation = xlCalculationAutomatic


    Apparemment ça marche ! (peut être que je m'emballe vite, il y a d'autres problèmes dans le code maintenant, et j'ai pas encore totalement testé)
    Comment j'ai pu louper ça ? J'ai besoin de vacances j'arrive plus à prendre de recul.

    Merci, je vais mettre le topic en résolu, dès que tout fonctionnera correctement.
    Keith Flint 1969 - 2019

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

Discussions similaires

  1. Erreur avec le fonction "Find"
    Par tribaleur dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/06/2009, 11h48
  2. erreur LNK2019 avec des fonctions communes.
    Par FamiDoo dans le forum Visual C++
    Réponses: 9
    Dernier message: 31/07/2006, 10h32
  3. [VBA-E]Problème avec la fonction Find
    Par Mirx1 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 27/04/2006, 18h43
  4. [VBA][EXCEL]Erreur '1004' avec "Application.Run"
    Par Ania dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/01/2006, 10h50
  5. [Excel] Erreur 1004 avec un search
    Par Rakham dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/12/2005, 13h54

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