Tu as essayé mon dernier bout de code?
Version imprimable
Tu as essayé mon dernier bout de code?
Ce code fonctionne ! Je n'avais pas vu le message, désolé ^^
Je vais essayer de l'adapter à mon code pour mes vrais fichiers (un code qui boucle sur 16 fichiers ^^)
Tu pourrais m'expliquer clairement ce que signifie ces deux lignes?
Code:
1
2 If cell >= Ref1 And cell.Offset(0, 1) >= Ref2 Then Range("H3").Value = Range("H3").Value + cell.Offset(0, -1).Value & Chr(10)
Oui bien sûr. Alors mon code fonctionne finalement pour toi !
J'enregistre dans la cellule le texte contenu dans la colonne d'avant d'où le offset(0,-1) qui veut dire de prendre la cellule de la colonne = colonne de la cellule actuelle - 1.
Code:
1
2 If cell >= Ref1 And cell.Offset(0, 1) >= Ref2 Then ' Si la cellule de la colonne B est supérieure à la Réf1 contenu dans B2 ET si la cellule adjacente à la cellule de la colonne B sur laquelle on est entrain de faire le test est supérieure à la Réf2 contenu dans C2 alors on enregistre le libbelé contenu dans la colonne A dans la cellule H3 Range("H3").Value = Range("H3").Value + cell.Offset(0, -1).Value & Chr(10)
Ok c'est ça que veut dire offset
Dans mon vrai fichier, le texte à prendre est en colonne C, et les références sont en colonne H et K c'est pour ça que j'ai du mal, ET le résultat soit se placer ailleurs dans une autre feuille (je suis sur le même travail que sur l'autre topic "NB.SI VBA" Kiouane)
De plus, il se peut qu'il y ait, comme toute à l'heure des cases vides dans H et K .. ^^ Je ne pense pas que le xlUp va fonctionner
Si tu peux montrer un Template qui reprend exactement la même composition de ton fichier, je pourrai te guider.
Pièce jointe 210076
Les nom sont en colonne C : je sais pas si ça influe sur quoi que ce soit mais ils peuvent avoir plusieurs mots jusqu'à 50 caractères en tout
Les valeurs de références sont : H3 et K3
Si les valeurs de H > H3 ET K > K3 alors prendre le nom de la ligne en colonne C et placer dans une autre feuille dans une même cellule
Je sais pas si ce que je dis est compréhensible ^^
J'avais pas vu en effet XD
Il faut adapter avec tes propres colonnes c'est pour ça :mrgreen:
Le U, V, W, Y sont le nom des colonnes à toi de mettre les tiennes
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Sub test() Dim n, Ref1, Ref2 As Integer Ref1 = Range("H3").Value Ref2 = Range("K3").Value Dim cell As Range n = Range("C" & Rows.Count).End(xlUp) For Each cell In Range("H4:H" & n) If cell >= Ref1 And cell.Offset(0, 3) >= Ref2 Then With Worksheets("Nomdetafeuille") .Range("H3").Value = .Range("H3").Value + cell.Offset(0, -5).Value & Chr(10) End If Next End Sub
Même en adaptant avec mes colonnes je n'arrive pas à le faire fonctionner ^^
ça ne provoque pas d'erreur mais ça ne fais rien, je te montre quand même le code : j'ai juste modifier le nom des colonnes
Code:
1
2
3
4
5
6
7
8
9
10
11 Sub try1() x = Sheets(1).Range("A2:U" & Sheets(1).Range("A:A").End(xlDown).Row).Count r1 = Sheets(1).Range("B1").Value: r2 = Sheets(1).Range("C1").Value For i = 2 To x + 1 If Sheets(1).Range("B" & i).Value > r1 And Sheets(1).Range("C" & i).Value > r2 Then Sheets(1).Range("H2").Value = IIf(Sheets(1).Range("H2").Value <> "", Sheets(1).Range("H2").Value & Chr(10) & Sheets(1).Range("A" & i).Value, Sheets(1).Range("A" & i).Value) End If: Next End Sub
Code:
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 Option Explicit Sub test() 'J'utilise 4 variables : ' rg pour Range de type Range ' t() est un tableau ' i et res sont respectivement de type Long et String (& pour Long et $ pour String) Dim rg As Range, t(), i&, res$ 'Je mets la plage [A3:C6] dans la variable rg Set rg = ActiveSheet.Range("A3:C6") 'Je mets ma plage rg dans mon tableau ' t(i,j) := croisement de la ligne i avec la colonne j dans mon tableau t ' t(1,1) = la valeur de la cellule A3 ' t(2,2) = la valeur de la cellule B4 ... t = rg 'J'initialise res à "*" res = "*" 'Boucle sur le nombre de ligne de la plage rg (Ubound(t) donne le nombre de ligne de t) For i = 1 To UBound(t) 'Je teste la condition que tu nous expliquais If t(i, 2) >= ActiveSheet.[B2] And t(i, 3) >= ActiveSheet.[C2] Then 'Si la condition est vrai, j'ajoute la valeur voulue précédée d'un "/" res = res & "/" & t(i, 1) End If Next i 'En fin de boucle j'ai donc res qui vaut "*/[toutes les valeurs séparées d'un /]" 'Donc je remplace "*/" par rien res = Replace(res, "*/", "") 'Ensuite je remplace le séparateur / par un retour a la ligne c'est à dire Chr(10) res = Replace(res, "/", Chr(10)) 'Je mets le résultat dans la cellule [H3] ActiveSheet.[H3] = res fin: 'Je libère la variable rg Set rg = Nothing End Sub
En version courte :
Code:
1
2
3
4
5
6
7
8
9 Sub test() Dim rg As Range, t(), i&, res$: res = "*" Set rg = ActiveSheet.Range("A3:C6"): t = rg For i = 1 To UBound(t) If t(i, 2) >= ActiveSheet.[B2] And t(i, 3) >= ActiveSheet.[C2] Then res = res & "/" & t(i, 1) Next i ActiveSheet.[H3] = Replace(Replace(res, "*/", ""), "/", Chr(10)) fin: Set rg = Nothing End Sub
La meilleur façon de comprendre un code (a mon gout) c'est de l'exécuter en Pas à pas détaillé (Touche F8) en observant attentivement la fenêtre des variables locales.
Tu comprendras très facilement ce que fait mon code. ;)
Merci pour ton aide, ça me met une erreur : Bloc End If sans IF, je me sui dis que ça devait être du fait qu'il manque un End With, donc j'ai rajouté un End With à la ligne avant le End If.
Une erreur apparait : "La méthode 'Range' de l'objet worksheet a échoué"
J'ai enlevé Worksheets et j'ai mis juste Sheets ça met une erreur "Erreur défini par l'applcation ou par l'objet"
Change pour voir
ParCode:x = Sheets(1).Range("A2:U" & Sheets(1).Range("A:A").End(xlDown).Row).Count
De plus il s'agit bien de la première feuille de ton classeur ? Ensuite r1 et r2 sont tes références donc mets les bonne case pour leur attribuer la bonne valeur :mrgreen:Code:x = Sheets(1).Range("A2:U" & Sheets(1).Range("B:B").End(xlDown).Row).Count
T'as bien mis le bon nom de feuille ? Sinon tu peux me dire sur quelle ligne tu as cette erreur?
N'hésite pas à mettre un pouce vert pour les solutions qui t'ont aidées.
Merci beaucoup Antony pour ces explications !! C'est très clair !
J'aimerais savoir s'il était obligatoire de passer par un tableau ? Je ne vois pas trop comment l'appliquer à mon cas (j'ai mis une capture écran tout à l'heure dans un message précédent). En effet, dans l'exemple, les colonnes sont collées, et il n'y a pas de cellules vides..
Ma difficulté est aussi de trouver la bonne plage, car dans l'exemple c'était A3:C6, mais comme j'ai 16 fichiers, chaque plage n'est pas la même (en colonne si, mais pas en ligne)
Du coup pour mon code au lieu des sheets(1) il faut mettre sheets("Feuil3") ;)
Bizarre chez moi ça fonctionne très bien
Il manquait le .Row pour n
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Sub test() Dim n, Ref1, Ref2 As Integer Ref1 = Range("H3").Value Ref2 = Range("K3").Value Dim cell As Range n = Range("C" & Rows.Count).End(xlUp).Row 'Ici For Each cell In Range("H4:H" & n) If cell >= Ref1 And cell.Offset(0, 3) >= Ref2 Then With Worksheets("Nomdetafeuille") .Range("H3").Value = .Range("H3").Value + cell.Offset(0, -5).Value & Chr(10) End with End If Next End Sub
Créer chez toi le même jeu de données que j'ai mis au tout début (le jeu d'exemple) et essaye ce code (qui est le tiens) adapté, dis moi si ça marche ^^'
J'ai créé l'exemple en feuille 2
Kiouane, je crois avoir trouvé le petit truc !Code:
1
2
3
4
5
6
7
8
9
10
11 Sub try1() x = Sheets(2).Range("A3:A" & Sheets(2).Range("B:B").End(xlDown).Row).Count r1 = Sheets(2).Range("B2").Value: r2 = Sheets(2).Range("C2").Value For i = 2 To x + 1 If Sheets(2).Range("B" & i).Value > r1 And Sheets(2).Range("C" & i).Value > r2 Then Sheets(2).Range("H2").Value = IIf(Sheets(2).Range("H2").Value <> "", Sheets(2).Range("H2").Value & Chr(10) & Sheets(2).Range("A" & i).Value, Sheets(2).Range("A" & i).Value) End If: Next End Sub
En fait, il m'a suffit de modifier cette ligne :
En ajoutant le petit mot magique ^^Code:n = Range("C" & Rows.Count).End(xlUp)
Code:n = Range("C" & Rows.Count).End(xlUp).Row