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 sur une boucle simple


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Points : 36
    Points
    36
    Par défaut Erreur 1004 sur une boucle simple
    Bonjour.

    J'ai un petit souci entre 2 versions d'un code, et malheureusement c'est celle qui me plaît le plus qui plante...

    Voici la version qui marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     For Each cell In Sheets("Projects").Range("J2:J" & dernLigneP)
        If Left(cell.Value, 2) = "PM" Or Left(cell.Value, 2) = "Pm" Or Left(cell.Value, 2) = "pm" Then cell.EntireRow.Hidden = True
     Next cell
    Et voici la version qui plante à la 1re ligne. iProjFinancialbudgetcode est une constante, et dernLigneP la dernière ligne de la feuille, déclarée en integer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        For Each cell In Sheets("Projects").Range(Cells(2, iProjFinancialbudgetcode), Cells(dernLigneP, iProjFinancialbudgetcode)).Cells ' Ca plante aussi sans le .Cells
            If Left(cell.Value, 2) = "PM" Or Left(cell.Value, 2) = "Pm" Or Left(cell.Value, 2) = "pm" Then cell.EntireRow.Hidden = True
        Next cell
    Avez-vous une idée pour comprendre mon erreur SVP ?

  2. #2
    Membre averti Avatar de mordrhim
    Inscrit en
    Avril 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 270
    Points : 314
    Points
    314
    Par défaut
    tes constantes

    elle sont initialisées, ou ? C'est des constantes de projet, de module ? elles sont publiques ? privées ?

    pour faire un petit test met un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        MsgBox ("iProjFinancialbudgetcode :" & iProjFinancialbudgetcode & ",dernLigneP : " & dernLigneP)
    juste avant le for.

    s'il ne donne pas iProjFinancialbudgetcode : X,dernLigneP : Y une de tes variables n'est pas bien initialisée

    (chez moi la commande fonctionne bien, sauf si une des deux variable est nulle ou non initialisée, ce qui me donne une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur d'execution '1004': Erreur définie par l'application ou par l'objet

  3. #3
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    t'a essayé tout betement de mettre ta variable en long plutot qu'en integer ?

    A mon avis, c'est aussi ton .cells a la fin qui fait plantouiller. Ça te fait la meme erreur quand tu le met pas ?
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  4. #4
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Petite astuce sur un autre partie de ton code.
    Afin d'éviter les or dansnun if pour contrôle de la saisie.
    Il suffit de tester le texte en Majuscule (idem si tu prefère les minuscule)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    If Ucase(Left(cell.Value, 2)) = "PM" Then cell.EntireRow.Hidden = True
    Pour ton problème, ton code fonctionne si l'on met directement des valeurs plutôt que les variables. Regardes du coté des variables
    Jérôme

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Points : 36
    Points
    36
    Par défaut
    Merci pour vos feeedbacks.

    Alors, ma constante et ma variable sont déclarées de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Const iProjFinancialbudgetcode As Integer = 10
    ' et 
    dernLigneP = Sheets("Projects").Range("A1").CurrentRegion.Rows.Count
    La constante est déclarée dans le même module que le code ci-dessus, et dernLigneP est décvlarée comme Integer. A priori les Integer suffisent, le décompte se faisant sur des numéros de lignes et de colonnes, et non sur le nombre de cellules d'une plage, d'antant que je teste sur des jeux de données restreints (genre 100 lignes au max...).
    Et si j'espionne les valeurs de iProjFinancialbudgetcode et dernLigneP, elles sont bien présentes et définies.

    > Illight : même sans le .Cells à la fin, le plantage reste le même.

    > Jfontaine : merci pour l'astuce, j'implémente de suite !

  6. #6
    Membre chevronné Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Points : 1 900
    Points
    1 900
    Par défaut
    bonjour à tous

    As tu defini cell

    dim cell as range
    @ te lire
    Wilfried

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Points : 36
    Points
    36
    Par défaut
    Oui, tout à fait.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Points : 36
    Points
    36
    Par défaut
    Bon je creuse toujours mais sans succès.
    Pour info, le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each cell In Sheets("Projects").Range(Cells(2, 38), Cells(23, 38))
    plante aussi, bien que j'aie remplacé les variables par leurs valeurs littérales.

    Y'a plus que cell qui puisse être source d'erreur, alors qu'il est déclaré en tant que Range.

    Des idées ? Moi, ça commence à me ...

  9. #9
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    Billets dans le blog
    131
    Par défaut
    Bonjour

    C'est parce que tu ne précises pas que Cells(...) fait partie de ta feuille. Sans cette précision, les Cells(...) que tu définis appartiennent à la feuille active alors que ton code les attribue à la feuille "Projects"...

    Avec le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For Each Cell In Worksheets("Projects").Range(Worksheets("Projects").Cells(2, iProjFinancialbudgetcode), Worksheets("Projects").Cells(DernLigneP, iProjFinancialbudgetcode))
    cela fonctionnera. Mais c'est un peu lourd au niveau syntaxe.

    Je te conseille donc d'utiliser un objet Worksheet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Dim Feuille As Worksheet
        Set Feuille = Worksheets("Projects")
        For Each Cell In Feuille.Range(Feuille.Cells(2, iProjFinancialbudgetcode), Feuille.Cells(DernLigneP, iProjFinancialbudgetcode))
    pour rendre ton code plus lisible.

    Ok?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Membre chevronné Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Points : 1 900
    Points
    1 900
    Par défaut
    re: bonjour à tous

    Il ressort avec une erreur 1004, non pas avec une mauvaise plage choisie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each cell In Sheets("Projects").Range(Cells(2, 38), Cells(23, 38))
    je ne comprends pas trop ton code m'enfin essaye ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each cell In Sheets("Projects").Range(Cells(2, 38).Address & ":" & Cells(23, 38).address)
    sinon, si dans tes 2 cellules tu vas chercher des adresses
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each cell In Sheets("Projects").Range(Cells(2, 38).value & ":" & Cells(23, 38).value)
    dis nous
    Wilfried

  11. #11
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    Billets dans le blog
    131
    Par défaut
    Bonjour Wilfried

    Il ressort avec une erreur 1004 parce que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    worksheets("Projects").range(cells(...))
    utilise une référence à la feuille "Projects"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets("Projects").range
    ET une référence à la feuille active
    Ce n'est donc pas un problème de "mauvaise plage choisie", c'est que VBA sera dans l'impossibilité de déterminer l'objet Range lorsque la feuille Projects n'est pas la feuille active.
    Donc, lorsque Projects est la feuille active, pas de problème. Mais dès que Projects n'est plus la feuille active, VBA se plante puisqu'il essaie de définir au sein d'une feuille des cellules qui ne lui appartiennent pas. C'est pour cela qu'il faut préciser que l'on travaille avec un objet Cells() de la feuille Projects.

    Ton code fonctionne effectivement car tu utilises l'adresse d'une cellule de la feuille active. Mais c'est un peu "tordu", si tu me permets l'expression.

    De plus, ton code ne fonctionnera plus lorsque la feuille active sera une feuille graphique et plus une feuille de calcul, puisqu'il fera référence à un objet Cells() d'une feuille qui n'en possède pas.

    J'ai posté précédemment une solution qui fonctionne.
    La seule façon de procéder est de rattacher l'objet Cells() à la feuille Projects, et la solution la plus élégante et la plus lisible est d'utiliser un objet WorkSheet.

    Ok?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Pour préciser encore.

    Il n'est pas nécessaire de dire à quelle feuille l'étendue (Range) va se référer puisqu'on va déterminer la feuille de chaque cellule.

    Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each Cell In Range(Worksheets("Projects").Cells(2, iProjFinancialbudgetcode), Worksheets("Projects").Cells(DernLigneP, iProjFinancialbudgetcode))
    Ou mieux (salut, Pierre):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim Feuille As Worksheet
    Set Feuille = Worksheets("Projects")
    For Each Cell In Range(Feuille.Cells(2, iProjFinancialbudgetcode), Feuille.Cells(DernLigneP, iProjFinancialbudgetcode))
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  13. #13
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    Billets dans le blog
    131
    Par défaut
    Bonjour Alain, J'espère que tu vas bien...

    Tu as raison, la précision avant le Range est superflue.

    Bonnes vacances, si tu en prends...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. [XL-2010] erreur 1004 sur une boucle
    Par bastien dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/05/2013, 09h07
  2. [XL-2003] erreur 1004 sur une instruction (VB)
    Par Adweuz dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/04/2011, 12h06
  3. erreur 1004 sur une méthode select
    Par lollo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2008, 19h21
  4. erreur 1010 sur une boucle qui parcoure un tableau
    Par pakkun dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 14/10/2008, 15h55
  5. [VB-E] Erreur 1004 dans une boucle For
    Par lycaon dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 02/11/2006, 22h41

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