Mateo.... Je t'ai déjà montré l'erreur. Dans deux messages précédents.
Version imprimable
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 :mrgreen: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 + 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: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:
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 = rg
Après vérification, je constate que pour :Code:
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 >ref2Code:
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:
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:Application.Union()
Code:
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:
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:
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 ? :xCode:
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:
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'écrisCode:dim cell as Range
Il faudra mettreCode:dim bidule as Range
ouCode:
1
2 For each bidule in .. if bidule.value = ... and bidule.offset ...
Code:
1
2 For each cell in ... if cell.Value = .... and cell.offset ..
For each bidule
Dans le code de kiouane ca donnera :
Code:
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