Fonction COUNTIF
Résolu/Fermé
camcam1404
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019
-
Modifié par pijaku le 9/02/2017 à 08:17
camcam1404 Messages postés 64 Date d'inscription mardi 13 décembre 2016 Statut Membre Dernière intervention 9 septembre 2019 - 17 févr. 2017 à 09:40
camcam1404 Messages postés 64 Date d'inscription mardi 13 décembre 2016 Statut Membre Dernière intervention 9 septembre 2019 - 17 févr. 2017 à 09:40
A voir également:
- Fonction COUNTIF
- Fonction si et - Guide
- Fonction somme excel - Guide
- Fonction moyenne excel - Guide
- Fonction trier excel - Guide
- Fonction couleur excel - Guide
4 réponses
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
8 févr. 2017 à 11:23
8 févr. 2017 à 11:23
Bonjour Camcam, bonjour le forum,
Les explications sont claires ! Mais un petit fichier exemple viendrait illuminer encore plus cette clarté (obscure) car même ton code est confus pour moi...
Les explications sont claires ! Mais un petit fichier exemple viendrait illuminer encore plus cette clarté (obscure) car même ton code est confus pour moi...
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
8 févr. 2017 à 23:03
8 févr. 2017 à 23:03
Re,
Le fichier c'est bien mais tes explications sont toujours confuses pour moi. Pourquoi seules 3 cellules sont colorées de jaunes ?
Pourrais-tu rajouter un onglet dans ton fichier en montrant ce que tu désires avoir après le traitement par la macro. Peut-être réussirai-je à mieux comprendre...
Le fichier c'est bien mais tes explications sont toujours confuses pour moi. Pourquoi seules 3 cellules sont colorées de jaunes ?
Pourrais-tu rajouter un onglet dans ton fichier en montrant ce que tu désires avoir après le traitement par la macro. Peut-être réussirai-je à mieux comprendre...
camcam1404
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019
9 févr. 2017 à 18:21
9 févr. 2017 à 18:21
Bonsoir,
Voilà ce que je veux obtenir: https://www.cjoint.com/c/GBjrsWnYNev
J'espère que c 'est plus clair maintenant.
J'ai coloré certain cellule de la colonne A dans la feuille REF pour mettre en valeur le changement de date. Les dates correspondent au jour de la création du numéro de série.
Le mesures (j'ai pas donné les valeurs des mesures) sont toujours effectués (feuille RES) le même jour ou le numéro de série a été affecté au produit (feuille REF)
Il faut savoir aussi que plusieurs produit peuvent avoir le même numéro de série uniquement si ils n'ont pas été mesurés à la même date...
Voilà ce que je veux obtenir: https://www.cjoint.com/c/GBjrsWnYNev
J'espère que c 'est plus clair maintenant.
J'ai coloré certain cellule de la colonne A dans la feuille REF pour mettre en valeur le changement de date. Les dates correspondent au jour de la création du numéro de série.
Le mesures (j'ai pas donné les valeurs des mesures) sont toujours effectués (feuille RES) le même jour ou le numéro de série a été affecté au produit (feuille REF)
Il faut savoir aussi que plusieurs produit peuvent avoir le même numéro de série uniquement si ils n'ont pas été mesurés à la même date...
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
9 févr. 2017 à 21:33
9 févr. 2017 à 21:33
Re,
Essaie comme ça :
Essaie comme ça :
Sub Macro2() Dim R As Worksheet 'déclare la variable R (onglet REF) Dim TR As Variant 'déclare la variable TR (Tableau des Références) Dim O As Worksheet 'déclare la variable O (Onglets) Dim TD As Variant 'déclare la variable TD (Tableau des Dates) Dim I As Integer 'déclare la variable I (Incrément) Dim J As Integer 'déclare la variable J (incrément) '*************** 'les onglet RES_ '*************** Set R = Worksheets("REF") 'définit l'onglet R TR = R.Range("A1").CurrentRegion 'définit le tableau des références TR For Each O In Worksheets 'boucle 1 : sur tous les onglets O du classeur If O.Name <> R.Name Then 'condition 1 : si le nom de l'onglet O est différent du nom de l'onglet R TD = O.Range("A1").CurrentRegion 'définit le tableau des dates TD For I = 2 To UBound(TD, 1) 'boucle 2 sur toutes les lignes I du tableau des dates TD (en partant de la seconde) For J = 2 To UBound(TR, 1) 'boucle 3 : sur les lignes J du tableau des référence TR (en partant de la seconde) 'condition 2 : si la donnée ligne J colonne 1 de TR est égale aux derniers caractères, après le quatrième, 'du nom de l'onglet O et si les numéros de série sont identiques (en colonne 2 pour TD et en colonne 3 pour TR) If TR(J, 1) = Mid(O.Name, 5) And TD(I, 2) = TR(J, 3) Then TD(I, 3) = 1: Exit For 'la donnée ligne I colonne 3 de TD est égale à 1, sort de la boucle 2 Else 'sinon (condition 2) TD(I, 3) = 0 'la donnée ligne I colonne 3 de TD est égale à 0 End If 'fin de la condition 2 Next J 'prochaine ligne de la boucle 2 Next I 'prochaine ligne de la boucle 1 'renvoie le tableau TD dans la cellule A1 redimensionnée de l'onglet O O.Range("A1").Resize(UBound(TD, 1), UBound(TD, 2)).Value = TD Erase TD 'efface le tableau TD End If 'fin de la condition 1 Next O 'prochain onglet de la boucle 1 '************ 'l'onglet REF '************ For I = 2 To UBound(TR, 1) 'boucle 1 : sur toutes les lignes I du tableau des références TR (en partant de la seconde) With Sheets("RES_" & TR(I, 1)) 'prend en compte l'onglet correspondant à la date de la données ligne I colonne 1 de TR TD = .Range("A1").CurrentRegion 'définit la tableau des dates TD End With 'fin de la prise en compte l'onglet correspondant à la date de la données ligne I colonne 1 de TR For J = 2 To UBound(TD, 1) 'boucle 2 : sur toutes les lignes J du tableau des dates TD (en partant de la seconde) 'si les numéros de série sont identiques (en colonne 3 pour TR et en colonne 2 pour TD), 'renvoie 1 dans la cellule ligne I colonne 4 de l'onglet R, va à l'étiquette "suite" If TR(I, 3) = TD(J, 2) Then R.Cells(I, 4).Value = 1: GoTo suite Next J 'prochaine ligne de la boucle 2 R.Cells(I, 4).Value = 0 'renvoie 0 dans la cellule ligne I colonne 4 de l'onglet R suite: 'étiquette Next I 'prochaien ligne de la boucle 1 End Sub
camcam1404
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019
Modifié par camcam1404 le 10/02/2017 à 06:54
Modifié par camcam1404 le 10/02/2017 à 06:54
Bonjour,
Oula hahah ca c'est du code ! :)
Je vais essayer et je te tiens au courant.
Merci et Bonne journée !
Oula hahah ca c'est du code ! :)
Je vais essayer et je te tiens au courant.
Merci et Bonne journée !
camcam1404
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019
10 févr. 2017 à 07:10
10 févr. 2017 à 07:10
J´ai déjà une question !
Pourquoi le Goto est nécessaire dans ce code ? L´étiquette correspond À une ligne ?
(Désolée mais je crois que je vais t'en poser beaucoup des question..^^)
Pourquoi le Goto est nécessaire dans ce code ? L´étiquette correspond À une ligne ?
(Désolée mais je crois que je vais t'en poser beaucoup des question..^^)
camcam1404
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019
15 févr. 2017 à 14:28
15 févr. 2017 à 14:28
Ton code ne fonctionne pas.
Mais j'en ai écrit qui marche presque ! Il me reste un probléme à regler :)
Je te le montrerai quand j'aurai finis.
Mais j'en ai écrit qui marche presque ! Il me reste un probléme à regler :)
Je te le montrerai quand j'aurai finis.
camcam1404
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019
16 févr. 2017 à 10:01
16 févr. 2017 à 10:01
Voilà mon code ! J'ai réussi !
Tu peux me dire ce que tu en penses s'il te plait ? :)
( Je suis débutante et je détestais l'info pendant mes études mais maintenant ca me plait de plus en plus de coder)
Sub pairing()
Dim i As Long
Dim Lastlineref As Long
Dim O As Worksheet
'Sheet REF
Set REF = Worksheets("REF")
Lastlinesar = REF.Range("A1").End(xlDown).Row
For Each O In ActiveWorkbook.Worksheets
If UCase(O.Name) Like "*RES*" Then
For i = 2 To Lastlinesar
If REF.Cells(i, 1) = CDate(Right(O.Name, 10)) Then
SNzusuchen = REF.Cells(i, 3)
Set rangezuabsuchen = O.Columns(2)
Set gefunden = rangezuabsuchen.Cells.Find(what:=SNzusuchen)
If gefunden Is Nothing Then
REF.Cells(i, 4) = 0
Else
REF.Cells(i, 4) = 1
End If
End If
Next i
End If
Next O
'Sheet GEO_
Dim Lastlineres As Long
For Each O In ActiveWorkbook.Worksheets
If UCase(O.Name) Like "*RES*" Then
Lastlineres = O.Range("A2").End(xlDown).Row
For i = 2 To Lastlineres
SNzusuchen = O.Cells(i, 2)
Set rangezuabsuchen = REF.Columns(3)
Set gefunden = rangezuabsuchen.Cells.Find(what:=SNzusuchen)
If gefunden Is Nothing Then
O.Cells(i, 3) = 0
Else
O.Cells(i, 3) = 1
End If
Next i
End If
Next O
End Sub
Tu peux me dire ce que tu en penses s'il te plait ? :)
( Je suis débutante et je détestais l'info pendant mes études mais maintenant ca me plait de plus en plus de coder)
Sub pairing()
Dim i As Long
Dim Lastlineref As Long
Dim O As Worksheet
'Sheet REF
Set REF = Worksheets("REF")
Lastlinesar = REF.Range("A1").End(xlDown).Row
For Each O In ActiveWorkbook.Worksheets
If UCase(O.Name) Like "*RES*" Then
For i = 2 To Lastlinesar
If REF.Cells(i, 1) = CDate(Right(O.Name, 10)) Then
SNzusuchen = REF.Cells(i, 3)
Set rangezuabsuchen = O.Columns(2)
Set gefunden = rangezuabsuchen.Cells.Find(what:=SNzusuchen)
If gefunden Is Nothing Then
REF.Cells(i, 4) = 0
Else
REF.Cells(i, 4) = 1
End If
End If
Next i
End If
Next O
'Sheet GEO_
Dim Lastlineres As Long
For Each O In ActiveWorkbook.Worksheets
If UCase(O.Name) Like "*RES*" Then
Lastlineres = O.Range("A2").End(xlDown).Row
For i = 2 To Lastlineres
SNzusuchen = O.Cells(i, 2)
Set rangezuabsuchen = REF.Columns(3)
Set gefunden = rangezuabsuchen.Cells.Find(what:=SNzusuchen)
If gefunden Is Nothing Then
O.Cells(i, 3) = 0
Else
O.Cells(i, 3) = 1
End If
Next i
End If
Next O
End Sub
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
>
camcam1404
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019
Modifié par ThauTheme le 16/02/2017 à 11:40
Modifié par ThauTheme le 16/02/2017 à 11:40
Bonjour Camcam, Pikaju, bonjour le forum,
Tu m'as dit dans ton post précédent que mon code ne fonctionnait pas mais sans aucune indication sur ce qui ne fonctionnait pas ?!... Les tests que j'avais fait sur ton fichier exemple me paraissaient fonctionnels. De plus, la méthode proposée avec des variables tableaux de type Variant était beaucoup plus rapide que de travailler directement dans les cellules. Surtout quand les onglets contiennent beaucoup de lignes...
Juste quelques remarques sur ton code :
• Il est d'usage de déclarer les variables en début de module.
• Tu ne déclares pas toutes les variables. Pourquoi ? Y'en a qui sentent le pâté ?
• la variable Lastlineref ne sert à rien !
• Un code avec identation (et proposé avec les balise de code) est bien plus facile à lire et donc a comprendre.
Ton code en fonction de ces remarques :
Sinon quoi te dire de plus. L'essentiel c'est que tu sois satisfaite et que ton code fonctionne !
Tu m'as dit dans ton post précédent que mon code ne fonctionnait pas mais sans aucune indication sur ce qui ne fonctionnait pas ?!... Les tests que j'avais fait sur ton fichier exemple me paraissaient fonctionnels. De plus, la méthode proposée avec des variables tableaux de type Variant était beaucoup plus rapide que de travailler directement dans les cellules. Surtout quand les onglets contiennent beaucoup de lignes...
Juste quelques remarques sur ton code :
• Il est d'usage de déclarer les variables en début de module.
• Tu ne déclares pas toutes les variables. Pourquoi ? Y'en a qui sentent le pâté ?
• la variable Lastlineref ne sert à rien !
• Un code avec identation (et proposé avec les balise de code) est bien plus facile à lire et donc a comprendre.
Ton code en fonction de ces remarques :
Sub pairing()
Dim REF As Worksheet
Lastlinesar As Long
Dim O As Worksheet
Dim i As Long
Dim SNzusuchen As Variant '(type à redéfinir, dans le doute j'ai mis Variant)
Dim rangezuabsuchen As Range
Dim gefunden As Range
Dim Lastlineres As Long
'Sheet REF
Set REF = Worksheets("REF")
Lastlinesar = REF.Range("A1").End(xlDown).Row
For Each O In ActiveWorkbook.Worksheets
If UCase(O.Name) Like "*RES*" Then
For i = 2 To Lastlinesar
If REF.Cells(i, 1) = CDate(Right(O.Name, 10)) Then
SNzusuchen = REF.Cells(i, 3)
Set rangezuabsuchen = O.Columns(2)
Set gefunden = rangezuabsuchen.Cells.Find(what:=SNzusuchen)
If gefunden Is Nothing Then
REF.Cells(i, 4) = 0
Else
REF.Cells(i, 4) = 1
End If
End If
Next i
End If
Next O
'Sheet GEO_
For Each O In ActiveWorkbook.Worksheets
If UCase(O.Name) Like "*RES*" Then
Lastlineres = O.Range("A2").End(xlDown).Row
For i = 2 To Lastlineres
SNzusuchen = O.Cells(i, 2)
Set rangezuabsuchen = REF.Columns(3)
Set gefunden = rangezuabsuchen.Cells.Find(what:=SNzusuchen)
If gefunden Is Nothing Then
O.Cells(i, 3) = 0
Else
O.Cells(i, 3) = 1
End If
Next i
End If
Next O
End Sub
Sinon quoi te dire de plus. L'essentiel c'est que tu sois satisfaite et que ton code fonctionne !
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
10 févr. 2017 à 09:08
10 févr. 2017 à 09:08
Re,
Quand les numéros de série sont identiques, on écrit "1" et il n'y a plus nécessité de continuer la boucle. En revanche, si ils ne sont pas identiques, il faut boucler jusqu'à ce que que l'on trouve (ou pas) la correspondance.
Le Goto permet deux choses : sortir de la boucle (un Exit For aurais pu faire l'affaire) et sauter la ligne qui écrit "0" (le Exit For ne pouvait pas faire ça)...
j'appelle étiquette mais je ne suis pas sur que ce soit le terme exact. GoTo permet de faire continuer le code à un endroit précis. On peut utiliser n'importe quel mot (sauf les mots-clé VBA) suivi de deux points (:) pour définir la ligne où repart le code.
On pourrait écrire par exemple :
J'espère que mes explications sont claires mais si, malgré le code complètement commenté, je dois passer mon temps à expliquer je ne vais pas y arriver. Utilise l'aide VBA avant de poser tes questions...
Quand les numéros de série sont identiques, on écrit "1" et il n'y a plus nécessité de continuer la boucle. En revanche, si ils ne sont pas identiques, il faut boucler jusqu'à ce que que l'on trouve (ou pas) la correspondance.
Le Goto permet deux choses : sortir de la boucle (un Exit For aurais pu faire l'affaire) et sauter la ligne qui écrit "0" (le Exit For ne pouvait pas faire ça)...
j'appelle étiquette mais je ne suis pas sur que ce soit le terme exact. GoTo permet de faire continuer le code à un endroit précis. On peut utiliser n'importe quel mot (sauf les mots-clé VBA) suivi de deux points (:) pour définir la ligne où repart le code.
On pourrait écrire par exemple :
If TR(I, 3) = TD(J, 2) Then R.Cells(I, 4).Value = 1: GoTo Camcam R.Cells(I, 4).Value = 0 'renvoie 0 dans la cellule ligne I colonne 4 de l'onglet R Camcam: 'étiquette MsgBox "La Ligne R.Cells(I,4).Value = 0 a été sautée"
J'espère que mes explications sont claires mais si, malgré le code complètement commenté, je dois passer mon temps à expliquer je ne vais pas y arriver. Utilise l'aide VBA avant de poser tes questions...
camcam1404
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019
10 févr. 2017 à 13:15
10 févr. 2017 à 13:15
Compris !
Je me suis aussi renseigné de mon cote À ce sujet , je te rassure.
Parmis tout ce que j'ai lu ton explication est la plus claire, encore meci :)
Je me suis aussi renseigné de mon cote À ce sujet , je te rassure.
Parmis tout ce que j'ai lu ton explication est la plus claire, encore meci :)
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 741
>
camcam1404
Messages postés
64
Date d'inscription
mardi 13 décembre 2016
Statut
Membre
Dernière intervention
9 septembre 2019
Modifié par pijaku le 16/02/2017 à 10:14
Modifié par pijaku le 16/02/2017 à 10:14
Bonjour tous les deux,
Le GoTo, dans ce cas, permet de faire gagner une ligne de code (indiquée ci-dessous).
En effet, une autre solution serait de se servir d'un boolean (ici Test) :
Le GoTo, dans ce cas, permet de faire gagner une ligne de code (indiquée ci-dessous).
En effet, une autre solution serait de se servir d'un boolean (ici Test) :
Dim Test As Boolean For I = 2 To UBound(TR, 1) Test = False 'Unique ligne de code ajoutée With Sheets("RES_" & TR(I, 1)) TD = .Range("A1").CurrentRegion End With For J = 2 To UBound(TD, 1) If TR(I, 3) = TD(J, 2) Then Test = True: Exit For Next J 'Si Test = True, CInt(Test) * - 1 = 1 Si Test = False, CInt(Test) * - 1 = 0 R.Cells(I, 4).Value = CInt(Test) * -1 Next I End Sub
8 févr. 2017 à 11:45
8 févr. 2017 à 12:05
Par exemple : https://www.cjoint.com/
mais il y a en plein d'autres...
8 févr. 2017 à 17:41