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"
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:
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:
Set f = Sheets("données")
f.UsedRange.Select
Set pm = Selection
ReDim pm(i, d) Si quelqu'un vois quel est mon problème alors merci!
Bonjour,
Essaie :
incult = .Range(.Cells(2, cl), .Cells(.Cells(.Rows.Count, cl).End(xlUp).Row, cl))A+
Re,
Bonjour et merci pour ton intérêt! J'ai essayé avec ta formule mais ça ne marche toujours pas, ça bug au niveau de cette ligne:
If pm(1, v).Value = f.Range(incult(i)).Value And pm(i, 0).Value = f.Range("A1:A" & f.[A65000].End(xlUp).Row) ThenJe vais aussi regarder ailleurs dans le code pour voir mais ça m'étonne parce qu'il n'y a aucune référence je crois...
Merci encore!A+
Bonjour,
Dans ce cas c'est surement ton pm qui déconne...
Je serai curieux de l'examiner à fond et dans le contexte, parce que tu lui fait quand même subir quelques mauvais traitements...
De ma fenêtre, c'est difficile d'apprécier avec des bribes de macros décousues !
A+
Bonjour Galopin01!
En faite les cellules (j, m) de ma feuille "données" (à partir de la ligne 2 et colonne 3), doivent être remplies en faisant la somme des valeurs de la colonne C de la feuil1, sous deux conditions :
1-Il faut que la valeur de l'entête correspondant à la cellule soit égale à la valeur de la colonne "incult" de feuil1
2- Il faut que la valeur de la première colonne correspondant à la cellule soit égale à la valeur de la première colonne de feuil1
En sachant que les valeurs des entêtes sont des entêtes étaient du texte et que j'ai transformé en nombre (avec des correspondances se trouvant sur une feuil2) correspondant aux valeurs qu'on peut trouver dans la colonne "incult".
Je mets le code là où j'en suis pour le moment mais en faite je ne sais pas si je dois définir comme un tableau chaque plage que je compare??
Dim pl() As Variant, pm() As Variant
Dim pn() As Variant, pq As Variant, tablo As Variant
Dim j As Integer, m As Integer, assol As Integer
Dim k As Variant, l As Variant
assol = 0
ReDim pl(j, m)
ReDim pm(j, m)
ReDim pn(j, m)
ReDim pq(j, m)
ReDim pr(j, m)
With Sheets("feuil1")
f.Range("A2", Range("A2").End(xlDown)).Select
pl() = Selection.Value
f.Range("C2", Range("C2").End(xlDown)).Select
pr() = Selection.Value
End With
With Sheets("données")
f.Range("A2", Range("A2").End(xlDown)).Select
pn() = Selection.Value
f.Range("C3", Range("C3").End(xlToRight)).Select
pm() = Selection.Value
End With
With Sheets("feuil2")
f.Range("A1:B" & f.[A65000].End(xlUp).Row).Select
pq() = Selection.Value
End With
For Each k In pm
For Each l In pq
If k.Value = l.Value Then
k.Range = l.Offset(0, 1).Value
End If
Next l
Next k
With f = Sheets("données")
f.UsedRange.Select
tablo() = Selection
End With
For j = 1 To UBound(tablo, 1)
For m = 3 To UBound(tablo, 2)
If pm(1, j).Value = incult(m).Value And pn(m, 1).Value = pl(m, 1).Value Then
assol = assol + pr(m).Value
End If
tablo(j, m).Value = assol
Next m
Next j
End Sub*incult est une colonne qui a été définie plus haut et redim() comme tableau aussi
Je débute en VBA donc j'aborde peut-être pas le problème de la bonne façon?
Bonjour,
Je ne sais pas et j'avoue que ça m'agace un peu : c'est extraordinairement bordélique.
Des With qui ne servent à rien, des Select plus que le pape peut en bénir, et des value d'Array et de Selection incongrues...
En l'absence du fichier pour tester je ne peux pas t'en dire plus.
Je ne sais pas qui a pondu ce code mais à mon sens on irait plus vite à repartir de zéro.
A+
Re,
C'est moi!
Je vais surement le reprendre, mais je n'ai peut-être pas abordé de la bonne façon?! Est-ce que je dois définir toutes les plages à comparer dans les différentes feuilles comme des tableaux?
En fait comme j'ai différentes colonnes sur différentes feuilles je pensais qu'il fallait les définir comme des tableaux pour les utiliser dans les boucles...
Question trop vague. Pour répondre aussi vaguement : surement.
Il est bien préférable de travailler sur des tableaux que sur des plages...
Le problème est que tu ne sais pas vraiment te servir de ces tableaux !
Je te conseille de nous donner un modèle réduit de ton fichier et un modèle du résultat à obtenir, et on essaiera de te montrer comment faire.
A+
Re,
Effectivement je maîtrise pas bien!
D'accord! Je regarde encore si j'y arrive et sinon je vais poster un fichier pour mieux expliquer mon problème.
Re,
Je n'ai toujours pas réussi
Dim pl(), pm(), pn(), Tabtot()
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
Set f = Sheets("données")
f.UsedRange.Select
TabTot = Selection.ValueEn 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!!
Bonjour,
Non !
ça serait bien qu'on ait un petit bout de classeur avec une dizaines de lignes dans chaque feuille.
Et que tu nous écrives "en dur" les coordonnées des plages que tu veux instancier.
Parce que avec ce charabia, je peine un peu à voir ou tu veux en venir.
Voici un exemple de code cohérent et structuré : (ce ne sont probablement pas les plages que tu voulais définir, mais ça illustre clairement comment sur 2 feuilles on peux définir des Array.
Option Explicit
Sub test()
Dim i%, j%, k%, a(), b(), c(), d(), WsD As Worksheet, WsF As Worksheet
Set WsD = Worksheets("Données")
Set WsF = Worksheets("Feuil2")
With WsD
i = Cells(1, 1).End(xlToRight).Column
a = .Range(.Cells(1, 1), .Cells(1, i)).Value
'a correspond aux en-tête de toutes les colonnes de "Données"
j = Range("A1").End(xlDown).Row
b = .Range("A1:A" & j).Value
'b correspond a toute la colonne A de "Données"
c = .UsedRange.Value
'c contient toute la base de donnée de "Données"
End With
With WsF
k = .Range("A1").End(xlDown).Row
d = .Range("A1:A" & k).Value
'd correspond a toute la colonne A de "Feuil2"
End With
End SubA+
Rebonjour!
Merci pour l'aide que tu m'as envoyée! Elle m'a bien fait avancer mais j'y arrive toujours pas!
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 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 on peut faire ça avec VBA? Ou peut-être que je devrais aborder le problème autrement?
La ligne
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)".
A oui et l'année est entrée dans une inputbox car je ne connais pas la position des colonnes à l'avance. Sauf pour les 4 premières qui ne changent jamais d'ordre!!
Merci pour votre aide!!
Au vrai : Combien de lignes pour chaque feuille ?
Il y a environs 25000 lignes mais la macro sera exécutée après un filtre qui fera en générale tomber le nombre de lignes entre 2000 et 3000!
Est-ce que je peux faire ce genre d'opération? si oui avec "for" et "if"? avec un dictionnaire? Le dictionnaire je maîtrise pas très bien encore, c'est avec de l'aide sur le forum que j'ai obtenu ceux du code!
Je parle de la "feuil1", la feuil2 est accessoire et ne compte qu'une 20aine de lignes.
Ok. Bon je suis un peu perdu. Je peine un petit peu au vu de tes explications à comprendre la logique :
Si on examine A3, ça influe sur la valeur de C2 ?
tandis que A4 fait varier C4 ou E4... Quelle logique dans tout ça ?
Pourquoi dans le premier cas ça fait varier la ligne précédente et dans le second cas la même ligne ?
Tant que je ne comprend pas la logique il est inutile que j'essaie de coder quoi que ce soit...
De plus tes variables sont aléatoires déclarées... ou pas ! Réutilisées dans un autre contexte...
ça, ça peut pas aller : Tu me colles un Option Explicit en tête ou il est inutile de perdre son temps la dessus...
Je t'ai fait un exemple de code liminaire, mais dans un projet de ce genre il faut que tu limites l'usage des lettres isolées à des compteurs de boucle. Pour le reste tu essaies de trouver des noms de variables évocateurs (courts et intuitifs) : Les Arrays Tu peux les nommer ArrA, ArrB ou ArrT, mais il faut au premier coup d'œil qu'il n'y ait aucun doute
Parce que ton P il me reste un peu en travers de la gorge...
f tu oublies... Une fois que tu as instancié (au début de ta procédure) :
Set WsD = Worksheets("Données")
Set WsF2 = Worksheets("Feuil2")
Set WsF1 = Worksheets("feuil1")... il n'y a pas à y revenir sinon c'est du codage en forme de plat de "spaghetti"...
Bon tu fais le ménage, t'essaie de répondre à mes questions sur la logique du truc. Après on verra.
Moi je code pas dans ce foutoir.
Pour les Dico, je ne sais pas, j'ai de religion dessus, à priori je ne vois pas le pourquoi... Les Array me semble suffisant à traiter des petites comparaisons comme ça... Mais peut-être qu'avec un complément d'info ça me sautera au yeux !
Enfin... Tu pourrais pas essayer de scinder ta macro en 2 : Une macro pour la création de ta feuille de Données et une macro pour le traitement des données (comparaisons). Parce que tel quel ça vous a vraiment un petit air de chambre d'ado...
A+
[Il faut remplacer l'entête "EXP" par "I_PACAGE" dans la feuille "données" ça sera bcp plus compréhensible"!]
En fait les cellules de la feuille "données" sont remplis en faisant la somme des cellules de la colonne D de la "feuil1" mais sous deux conditions:
1-Il faut que le "I_PACAGE" de la feuille "données" donc la colonne "A", corresponde au "I_PACAGE" de la "feuil1" donc colonne "B".
2- Il faut que le numéro d'entête dans la feuille "données" soit égale au numéro de la colonne "Année" dans la" feuil1" donc 2010 dans l'exemple. (Le numéro de l'année est entré dans une inputbox).
Une pause et après je vais revoir le code avec tes remarques parce que c'est vrai que c'est pas très compréhensible!
Je peux reprendre un exemple plus détaillé pour expliquer s'il le faut!
et merci encore pour ton intérêt!
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
Mais cette ligne :
Si on examine A3, ça influe sur la valeur de C2 ? Tu ne réponds pas...
Pourquoi dans le 2ème exemple A4 ça renvoie sur E4 ?
Il y a là quelque chose d'incompréhensible...
A+
Re!
Merci pour ta réponse! Effectivement il y a une erreur!!! C'est bien C3 au lieu de C2!!!
Donc chaque numéro de ligne "I_PACAGE"(feuille: "données") (Noté "EXP" sur l'exemple mais en fait c'est "I_PACAGE") est comparé à tous les "I_PACAGE" de la "Feuil1" + Chaque valeur d'entête (feuille: "données") est comparé aux numéros trouvés dans "année" dans "feuil1". (En fait j'ai nommé la feuille "données" à tord, j'aurais plutôt dû la nommer "résultats")
A chaque fois que les deux conditions sont respectées dans une cellule du tableau ( feuille: "données") on additionne la valeur de la cellule de D (feuille: "feuil1") correspondante.
En fait tous les I_PACAGE" qui sont égaux de la colonne B (feuille: "feuil1") se retrouve sur la même ligne de "I_PACAGE" ("données") et il sont différentiés par la valeur du numéro contenue dans la colonne "année" (feuille: "feuil1").
Merci encore et désolé pour cette faute ça faisait trop longtemps que j'étais là-dessus sans pause!
Accessoire... Pfff !
Et la Feuil2 elle intervient dans le processus de comparaison ou pas ?
Parce que je ne vais pas m'amuser à programmer pour que tu me dise après "oui !mais..."
Bon de toute façon, inutile de multiplier les Array : 2 tableaux suffiront bien, (un par feuille) sous réserve de ce que tu me réponds pour Feuil2...