Mateo.... Je t'ai déjà montré l'erreur. Dans deux messages précédents.
Mateo.... Je t'ai déjà montré l'erreur. Dans deux messages précédents.
Merde !!! Autant pour moi, j'étais encore dessus moi^^ !!! Bon je go tester tout ça sur le VRAI fichier maintenant et je vous tiens au courant !
Dès que ça fonctionne, j'ajoute les petits pouces verts et je clôture !!
Je vous tiens au courant !!
Mouhaha j'ai trouvé :
Il faut que tu adapte la ligne For i = 2 To x + 2 en fonction de où tu commence le x = Sheets(2).Range("A3:A" & Sheets(2).Range("B:B").End(xlDown).Row).Count ici c'est + 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 + 2 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![]()
Bon bah génial si ça marche !! Je sais pas encore quelle solution je vais prendre !!
J'ai pas compris le x+2 ^^'
Le + 2 correspond au nombre de ligne avant que commence les valeurs dont tu as besoins![]()
A quoi correspond le i = 2 alors? ^^ j'suis chiant ouai !
J'ai réussis à mettre le code de Kiouane sur mon vrai fichier :p
C'est la ligne de départ de tes valeurs
C'est bien ce que je pensais oui, ok bah j'te remercie pour ton temps, pour ton aide et pour les explications !
De même pour tous les autres, merci beaucoup pour toutes ces aides que vous m'avez apporté ! Je vous en suis très reconnaissant![]()
Pas de soucis à ton service
Bonne soirée
J'utilise toujours un tableau quand je traite des valeurs de cellules.
La raison est simple, une cellule contient beaucoup de méthodes et de propriétés (implicitement si tu ne précises pas de propriété c'est .Value qui va être utilisée). Un objet Range est donc beaucoup plus "gros" qu'un élément d'un simple tableau. Le temps de traitement va donc être beaucoup plus rapide.
Pour ce qui est d'adapter la plage a chacun de tes cas, je pense que tu as déjà trouvé une solution grâce aux autres intervenant de cette discutions.
Finalement dans mon code, il n'y a que cette ligne à changer :Tu dois déterminer les bornes de ta plage.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Set rg = ActiveSheet.Range("A3:C6")
Ok ça marche, j'te remercie pour ta réponse.
Peut-on écrire quelque chose comme ça pour ton code ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 dim n as long 'pour la dernière ligne renseignée n = Sheets("Telephonie").Range("C" & Rows.Count).End(xlUp).Row Set rg = Sheets("Telephonie").Range("C4:C" & n, ) and Sheets("Telephonie").Range("H4:H" & n, ) and Sheets("Telephonie").Range("K4:K" & n, ) : t = rgAprès vérification, je constate que pour :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Dim n, ref1, ref2 As Integer Dim cell As Range ref1 = Sheets("Telephonie").Range("H3").Value ref2 = Sheets("Telephonie").Range("K3").Value n = Sheets("Telephonie").Range("C" & Rows.Count).End(xlUp).Row For Each cell In Sheets("Telephonie").Range("H4:H" & n) If cell > ref1 And cell.Offset(0, 3) > ref2 Then .Range("D8").Value = .Range("D8").Value + cell.Offset(0, -5).Value & Chr(10) End If If cell < 0.6 And cell.Offset(0, 3) < 0.35 Then .Range("C8").Value = .Range("C8").Value + cell.Offset(0, -5).Value & Chr(10) End If Next
En fin de compte ça ne prend pas en compte la ref 2, il me met dans la cellule tous ceux > ref1 mais ne prend pas en compte le >ref1 ET >ref2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 For Each cell In Sheets("Telephonie").Range("H4:H" & n) If cell > ref1 And cell.Offset(0, 3) > ref2 Then .Range("D8").Value = .Range("D8").Value + cell.Offset(0, -5).Value & Chr(10) End If
Par contre pour ma deuxième condition ça fonctionne bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 If cell < 0.6 And cell.Offset(0, 3) < 0.35 Then .Range("C8").Value = .Range("C8").Value + cell.Offset(0, -5).Value & Chr(10) End If
Absolument pas !
Le AND comme le OR, le IS, le LIKE ... sont des opérateurs logiques qui vont renvoyer un booléen qui prendra la valeur VRAI ou FAUX.
VRAI AND VRAI va te répondre VRAI mais plage1 AND plage2 n'a pas de sens pour Excel. Je ne pense pas qu'il y est d'erreur de logique ou de syntaxe (pas testé)
mais il n'y a aucune de chance d'obtenir le résultat souhaité.
Je crois comprendre que tu veux prendre la réunion des différentes plages.
C'est possible en VB a l'aide de la méthode Union de l'objet Application :Exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Application.Union()
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 Sub Test_Union() Dim rg1 As Range, rg2 As Range, rg3 As Range, Rg_Union As Range Set rg1 = Range("C4:C10") Set rg2 = Range("K4:K10") Set rg3 = Range("H4:H10") Set Rg_Union = Application.Union(rg1, rg2, rg3) MsgBox "rg1 := " & rg1.Address & vbCr & _ "rg2 := " & rg2.Address & vbCr & _ "rg3 := " & rg3.Address & vbCr & _ "Réunion de rg1, rg2 et rg3 := " & Rg_Union.Address fin: Set rg1 = Nothing Set rg2 = Nothing Set rg3 = Nothing Set Rg_Union = Nothing End Sub
Ok je vois, merci !!
Sur le code des autres participants, j'ai résolu le problème en supprimant les deux variables ref1 et ref2 et en mettant directement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 If cell > Sheets("Telephonie").Range("H3").Value And cell.Offset(0, 3) > Sheets("Telephonie").Range("K3").Value Then 'action
Bonjour !
Cas d'école d'un filtre avancé utilisant un critère calculé via une formule de niveau débutant !
Donc réalisable sans code … Et si vraiment besoin d'un code :
soit via la fin du tutoriel soit via l'aide de l'Enregistreur de macros ou encore rien qu'en lisant l'aide VBA interne !
C'est souvent le plus simple pour un débutant et peut aussi s'avérer plus rapide qu'un code bouclant sur des cellules …
_________________________________________________________________________________________________________
Je suis Paris, Charlie, Bruxelles, …
Re bonjour à tous !
Je rencontre un problème que je n'arrive pas à surmonter !
Je suis toujours sur le même travail depuis maintenant quelques semaines.
Maintenant, je dois mettre, pareil qu'avant, des noms dans une cellule, cependant, je dois les mettre selon un calcul : pour i = 5 to dernière ligne -> Si Hi/Ki<3 alors mettre le nom dans la cellule.
Je suis donc partis du code fourni par Kiouane :
Cependant, je n'arrive pas à m'y retrouver avec les cell, d'ailleurs, dans ce code, il y a une variable cell et d'autres cell qui se baladent, je n'arrive pas à différencier le cell[variable] des autres cell.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Dim n As Integer Dim cell As Range n = Sheets("Telephonie").Range("C" & Rows.Count).End(xlUp).Row For Each cell In Sheets("Telephonie").Range("H4:H" & n) If cell > Sheets("Telephonie").Range("H3").Value And cell.Offset(0, 3) > Sheets("Telephonie").Range("K3").Value Then .Range("D8").Value = .Range("D8").Value + cell.Offset(0, -5).Value & Chr(10) End If Next
Avez-vous une idée de comment je peux faire pour lui dire de faire Hi/K1 < 3 avec ce bout de code ci-dessus ?
Un deuxième soucis rencontré : je vais placer ce genre de code au moins 4 fois dans mon bouton, j'ai donc écris le code ci-dessus, puis un autre dans le même bouton :
Cependant, il aime pas, il me met une erreur "incompatibilité de type", avez-vous une idée de comment je peux remédier au problème ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Dim postit postit = Sheets("Post_it").Range("C" & Rows.Count).End(xlUp).Row For Each cell In Sheets("Post_it").Range("K4:K" & postit) If cell > Sheets("Post_it").Range("K3").Value And cell.Offset(0, 9) > Sheets("Post_it").Range("T3").Value Then .Range("D24").Value = .Range("D24").Value + cell.Offset(0, -8).Value & Chr(10) End If If cell < 5 And cell.Offset(0, -6) > 2 Then .Range("C24").Value = .Range("C24").Value + cell.Offset(0, -8).Value = Chr(10) End If Next![]()
Je ne sais pas si c'est que tu veux mais voilà un code qui prends les Hi/Ki à partir de la ligne 5 jusqu'à la dernière ligne et vérifie si supérieur à 3 puis retourne le nom dans la case D8.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Dim n As Integer Dim cell As Range n = Sheets("Telephonie").Range("C" & Rows.Count).End(xlUp).Row For Each cell In Sheets("Telephonie").Range("H5:H" & n) if cell.Offset(0,3).value <> 0 then If cell.value/cell.Offset(0, 3).value > 3 Then .Range("D8").Value = .Range("D8").Value + cell.Offset(0, -5).Value & Chr(10) End If End if Next
Je te remercie ! Cependant, le truc c'est que je sais pas si ça va fonctionner car comme je mets dans un programme où j'ai déjà fais un dim cell as range, et que là, c'est un "for each cell in sheets(autre feuille).range(autre plage)"
A la limite remplace cell par un autre nom de variable dans son code, ca n'a pas vraiment d'importance du moment que tu utilises le même nom dans ce for each
Mais si à la place dej'écris
Code : Sélectionner tout - Visualiser dans une fenêtre à part dim cell as RangeIl faudra mettre
Code : Sélectionner tout - Visualiser dans une fenêtre à part dim bidule as Rangeou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 For each bidule in .. if bidule.value = ... and bidule.offset ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 For each cell in ... if cell.Value = .... and cell.offset ..
For each bidule
Dans le code de kiouane ca donnera :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Dim n As Integer Dim bidule As Range n = Sheets("Telephonie").Range("C" & Rows.Count).End(xlUp).Row For Each bidule In Sheets("Telephonie").Range("H5:H" & n) if bidule.Offset(0,3).value <> 0 then If bidule.value/bidule.Offset(0, 3).value > 3 Then .Range("D8").Value = .Range("D8").Value + bidule.Offset(0, -5).Value & Chr(10) End If End if
Partager