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 avec boucle "for each" :objet requis


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 71
    Par défaut Problème avec boucle "for each" :objet requis
    Bonjour tout le monde!

    J'ai écrit une boucle "for each" qui ne fonctionne pas pour l'erreur "objet requis"
    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
        Dim pm as Variant
        Dim assol as Integer
        Dim j As Range, i as Integer
        Set f = Sheets("feuil1")
     
            For i = 1 To UBound(pm, 1)
                For v = 2 To UBound(pm, 2)
     
                    If pm(1, v).Value = f.Range(incult(i)).Value And pm(i, 0).Value = f.Range("A1:A" & f.[A65000].End(xlUp).Row) Then
                    assol = assol + incult(i).Value
                    End If
     
                    pm(i, v).Value = assol
     
                Next v
            Next i
    *incult est défini plus haut par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        incult = .Range(.Cells(2, cl), .Cells(.Cells(Rows.Count, cl).End(xlUp).Row, cl))
    une colonne de données située sur une autre feuille.

    *pm est défini plus haut dans le code par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Set f = Sheets("données")
        f.UsedRange.Select
        Set pm = Selection
     
        ReDim pm(i, d)
    Si quelqu'un voit quel est mon problème alors beaucoup!

  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,

    y'a pas mal de choses qui interpellent.

    pour commencer, je ne vois aucune boucle for each

    ensuite, tu commets deux légèretés incompatibles au début de ta procédure :

    1) Déclarer une variable pm en tant que Variant
    2) Utiliser l'instruction Set pour instancier ta variable sur la Selection active : ta variable est un tableaux de Ranges et pas un tableau des .Values de ta Selection

    Ainsi, si tu testes une valeur du tableau, tu obtient bien la valeur de la cellule :msgbox pm(1,1) te donnera bien la valeur de la première cellule de la Selection active. Mais cela n'est possible qu'en raison de la souplesse de VBA, qui prend implicitement la propriété .Value pour te l'afficher.

    D'ailleurs, tu ne pourrais même pas tester pm(1,1) ... puisque juste après avoir instancié ton tableau de Range, voilà que tu lui Redim la carapace, sans ajouter l'instruction Preserve .... qui, permettant de ne pas écraser les données déjà présentes, n'autorise cette conservation que sur la dernière dimension du tableau. Te voilà coincé quoi qu'il arrive.

    Et, je te laisse le soin de tester, je pense que c'est ta première boucle For/Next qui n'apprécie pas de boucler sur un tableau de range n'en contenant aucun ?

    Si c'est bien ça, il ne reste qu'à :

    - Redimensionner en amont la portion de la selection qu'il faut mettre dans ton tableau, plutôt que de redimensionner à postériori ton tableau
    - Ne pas INSTANCIER ton Variant sur la matrice Selection, mais lui affecter le .Value

    ( à noter que tu peux déclarer ta variable "dim pm()" au passage)


    Si c'est pas ça, il va falloir nous en dire plus, notamment la ligne exacte où ça plante et la procédure COMPLETE et pas en plusieurs morceaux dans le désordre

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 71
    Par défaut
    Bonjour!

    C'est sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If pm(1, v).Value = f.Range(incult(i)).Value And pm(i, 0).Value = f.Range("A1:A" & f.[A65000].End(xlUp).Row) Then
    que ça bug (objet requis)!
    Effectivement j'ai fait une erreur en mettant "for each" je suis encore pas très à l'aise avec VBA!
    Je vais revoir le code avec tes commentaires et voir si ça fonctionne!


  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    incult est un tableau il ne dispose pas de la propriété value!

    Intéresses toi aux variables tableau et range, tu ne fais pas le distinguo!

    incult = .Range(.Cells(2, cl), .Cells(.Cells(Rows.Count, cl).End(xlUp).Row, cl))

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 71
    Par défaut
    Rebonjour,

    Je n'ai toujours pas réussi mais j'aimerais savoir si le code suivant permets de continuer:
    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
    Dim pl(), pm(), pn(), po()
    Dim j As Integer, assol As Integer
    Dim w As Variant, z As Variant
    assol = 0
     
     
    Set f = Sheets("données")
    f.UsedRange.Select
    pl = Selection.Value
     
    Set f = Sheets("données")
    f.Range("C1", Range("C1").End(xlToRight)).Select
    pm = Selection.Value
     
    f.Range("A2", Range("A2").End(xlDown)).Select
    pn = Selection.Value
     
     
    Set f = Sheets("feuil2")
    Range("A1", Range("A1").End(xlDown)).Select
    po = Selection.Value
    En fait j'aimerais savoir est-ce que je peux utiliser maintenant les données contenues dans pl() pm() et pn() dans des boucles "for" pour les comparer et compléter le tableau TabTot?

    Merci d'avance!

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Oui tu peux utiliser tes variables tableau!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim pl(), pm(), pn(), po()
    Dim j As Integer, assol As Integer
    Dim w As Variant, z As Variant
    assol = 0
    With Sheets("données")
            pl = .UsedRange.Value
            pm=.Range("C1", Range("C1").End(xlToRight)).Value
            pn=.Range("A2", Range("A2").End(xlDown)).Value
    End With
    po= Sheets("feuil2").Range("A1", Range("A1").End(xlDown)).Value

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 71
    Par défaut
    exemple_data.xlsmRebonjour!

    J'ai utilisé les codes que vous m'avez donnés mais après de très nombreuses tentative je n'arrive toujours pas à mes fins. Je bloc à un certain niveau car il y a un calcul compliqué avec plusieurs conditions.
    Je vais essayer d'expliquer en espérant avoir quelques conseils:

    J'ai mis un fichier exemple en PJ avec la macro. En fait mon problème c'est d'utiliser les données des colonnes qui ont été définies dans une boucle "for" avec "if" car il faut comparer les cellule entre elles avec plusieurs contraintes!

    Je donne un exemple: (pour année 2010)

    Comme A3("données") = B4("Feuil1") et C1("donnée") = K4("feuil1") alors C2("données") = valeur D4("feuil1") ensuite
    A3 = B5 et C1 = K5 alors C2= valeur D4(précédente) + D5
    A3 = B6 et C1 = K6 alors C2= valeur D4(précédente) + D6 etc...

    autre exemple:
    Comme A4 = B10 et E1 = K10 alors E4 = valeur D10

    autre exemple:
    Comme A4 = B11 et C1 = K11 alors C4 = valeur D11 etc...


    Les numéros de la ligne 1 sont sélectionnés en fonction de l'année choisi, car il y en a bcp (ici c'est un extrait) et donc je voulais que seuls les numéros présents l'année x choisie soit placés en entête. La feuille "données" est générée par le code mais je l'ai laissée ici pour illustrer l'exemple.

    Donc en faite chaque ligne de A dans "données" est comparée à toute les lignes de B dans "feuil1". Et chaque numéro de l'entête est comparé à toute les ligne de l'année sélectionnée.

    C'est vraiment compliqué et je sais pas si je peux faire ça avec VBA? Ou peut-être que je devrais aborder le problème autrement?
    Si quelqu'un a un conseil

    Ha oui! la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If mondico.Exists(a(i, 2)) Then mondico(a(i, 2)) = a(i, 2)
    ne sert à rien pour l'instant mais permettra de convertir les nombres de l'entête en données qualitatives à partir de la "feuil2" en remplaçant "=a(i, 2)" par "= a(i, 1)".

  8. #8
    Invité
    Invité(e)
    Par défaut
    Le problème c'est que tu regardes cela comme un tout.

    Comme le disait Descartes, un problème compliqué n'est rien d'autre qu'une sommes de problème simple.

    Découpes ton problème, n créant des fonctions.
    Je fais une boucle sur un tableau1, je passe ma valeurs à un fonction ainsi que le tableau2 et la fonction me retourne le résultat!

    Je suis dans le train mais dès que possible je te donne un exemple!

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

Discussions similaires

  1. Problème avec boucle for
    Par GLDRX dans le forum LabVIEW
    Réponses: 1
    Dernier message: 14/06/2010, 21h43
  2. Problème avec boucle for
    Par kayenne77 dans le forum Débuter
    Réponses: 1
    Dernier message: 10/03/2009, 08h09
  3. [batch] problème avec boucle for
    Par TanEk dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 22/04/2008, 14h41
  4. Problème avec boucle for() et action POST
    Par Oli_Ifre dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2007, 09h52
  5. [ActionScript] Problème avec boucle 'FOR'
    Par BnA dans le forum Flash
    Réponses: 7
    Dernier message: 02/11/2006, 09h26

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