Bonjour,
je fais un find sur "toto" sur un usedRange de ma feuille. Je le trouve s'il est dans une cellule non fusionnée, sinon je ne le trouve pas, so... help
Merci d'avance.
Rque : je n'ai pas trouver sur le forum ni meme sur la toile
Bonjour,
je fais un find sur "toto" sur un usedRange de ma feuille. Je le trouve s'il est dans une cellule non fusionnée, sinon je ne le trouve pas, so... help
Merci d'avance.
Rque : je n'ai pas trouver sur le forum ni meme sur la toile
Tu dois utiliser xlwhole. Avec xlpart, ça fonctionne. Ensuite tu vérifies siTu vois comme il serait mieux si tu avais mis ton code, on serait pas là à essayer de deviner
Code : Sélectionner tout - Visualiser dans une fenêtre à part Cells(nl, nc) = CeQueTuCherches![]()
Désolé :
mais bon, comme ca ne marche pas voila le code de la fonction (j'ai remplacé le xlWhole par le xlPart):
je fais ensuite
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
17
18
19 Public Function RechercheValeurPlagePart(ByVal valeurRecherchee As Variant, ByVal plageDeRecherche As Range) As Range Dim cellulesTrouvees As Range, PremAdresse As String ' verifier si la plage recue en parametre n'est pas vide (auquel cas sortir) If plageDeRecherche.Count = 0 Then Exit Function ' on trouve la premiere cellule contenant la valeur Set cellulesTrouvees = plageDeRecherche.Find(What:=valeurRecherchee, lookat:=xlPart, MatchCase:=False) PremAdresse = cellulesTrouvees.Address Set RechercheValeurPlagePart = cellulesTrouvees ' on recherche, A PARTIR DE LA CELLULE MATCHANTE PRECEDENTE, la prochaine cellule contenant la valeur recherchee Do Set cellulesTrouvees = plageDeRecherche.FindNext(cellulesTrouvees) Set RechercheValeurPlagePart = Application.Union(RechercheValeurPlagePart, cellulesTrouvees) Loop Until cellulesTrouvees.Address = PremAdresse End Function
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Dim myRangeNum As Range Set myRangeNum = RechercheValeurPlagePart("toto", FeuilleGestionDesRisques.UsedRange) MsgBox myRangeNum.Count
bien sur le probleme est que :
ca vaut "1" quand "toto" est dans une cellule NON fusionnée
ca repond rien (la boite de dialogue ne s'ouvre pas) quand "toto" est dans une cellule fusionnée
ca repond "2" qaudn "toto" est A LA FOIS dans une cellule fusionnée ET dans une cellule non fusionnée....
je sens que je vais me faire charier....
en attendant, merci![]()
Remplace ta recherche par ça
Tu peux tester pour moi ?
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
17 Dim cellulesTrouvees as range, PremAdresse As String ' verifier si la plage recue en parametre n'est pas vide (auquel cas sortir) If plageDeRecherche.Count = 0 Then Exit Function ' on trouve la premiere cellule contenant la valeur With plageDeRecherche Set cellulesTrouvees = .Find(What:=valeurRecherchee, lookat:=xlPart, MatchCase:=False) If not cellulesTrouvees is nothing then PremAdresse = cellulesTrouvees.Address Do if RechercheValeurPlagePart = valeurRecherchee then Set RechercheValeurPlagePart = Application.Union(RechercheValeurPlagePart, PremAdresse) endif Set cellulesTrouvees = FindNext(cellulesTrouvees) Loop Until cellulesTrouvees.Address = PremAdresse Endif
A+
Remarque : ce code, s'il fonctionne, "n'unit" (d'union) que les cellules dont la cellule entière = valeurRecherchee
j'ai une erreur sur la premiere ligne de declaration "Erreur de compilation Sub ou function non definie"
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
17
18
19
20
21
22
23 Public Function RechercheValeurPlagePart(ByVal valeurRecherchee As Variant, ByVal plageDeRecherche As Range) As Range Dim cellulesTrouvees As Range, PremAdresse As String ' verifier si la plage recue en parametre n'est pas vide (auquel cas sortir) If plageDeRecherche.Count = 0 Then Exit Function ' on trouve la premiere cellule contenant la valeur Set cellulesTrouvees = plageDeRecherche.Find(What:=valeurRecherchee, lookat:=xlPart, MatchCase:=False) If Not cellulesTrouvees Is Nothing Then PremAdresse = cellulesTrouvees.Address Do If RechercheValeurPlagePart = valeurRecherchee Then Set RechercheValeurPlagePart = Application.Union(RechercheValeurPlagePart, cellulesTrouvees) End If Set cellulesTrouvees = FindNext(cellulesTrouvees) Loop Until cellulesTrouvees.Address = PremAdresse End If End Function
Sur quelle ligne ?
Teste avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 With plageDeRecherche Set cellulesTrouvees = .Find(What:=valeurRecherchee, lookat:=xlPart, MatchCase:=False) '...... '...... end with
bon j'ai capté d'ou vient mon erreur, (j'ai compris l'interet du with...)
maintenant le code ne bug plus mais ne fais toujours pas ce qu'il doit faire...
en attendant, j'ai un probleme, il rentre plus dans la fonction, je crois que le soucis vient des parametres et la facon dont je les passe :
et la fonction est
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Dim myRangeImpact, myRangeProba, myRangeNum, myRangeToto As Range Set myRangeImpact = RechercheValeurPlagePart2(nomCellImpact, FeuilleGestionDesRisques.UsedRange) ' c'est la fameuse fonction sur laquelle on a travaillé hier, sauf que la, c'est la v2: celle qui marchait avec le xlWhole Dim b As Boolean b = TestFonc(myRangeImpact) MsgBox b
les problemes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Public Function TestFonc(ByVal myRange As Range) As Boolean MsgBox "fonc" TestFonc = True End Function
- je n'ai pas le msgbox "fonc" qui s'affiche
- le msgbox affiche "faux" pour b
par contre, si je retire le parametre :
et la fonction est
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Dim myRangeImpact, myRangeProba, myRangeNum, myRangeToto As Range Set myRangeImpact = RechercheValeurPlagePart2(nomCellImpact, FeuilleGestionDesRisques.UsedRange) ' c'est la fameuse fonction sur laquelle on a travaillé hier, sauf que la, c'est la v2: celle qui marchait avec le xlWhole Dim b As Boolean b = TestFoncWithOutParam MsgBox b
j'ai :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Public Function TestFoncWithOutParamAs Boolean MsgBox "fonc" TestFoncWithOutParamAs = True End Function
- le msgbox "fonc" qui s'affiche
- le msgbox affiche "vrai" pour b...
la recherche sur le forum rien, et sur le net des conseil du style "save", etc.
Tu n'as pas mis ce qui serait intéressant d'avoir, je parle de myRangeImpact
Comment le déclares-tu et/ou en déclares-tu l'instance
A+
bah, en faisant la demo a un collegue (decommentage de ligne pas plus!!!) ca re-marche, je crois que je loupe un truc... ce peut il qu'il y ait des bug en fonction de la version d'excel (Xl 2002 - SP3) ????
bon du coup revennon au probleme initial :
le comptage de cellule contenant "toto" sans tenir compte du avec ou sans "fusion".... je retest...
bon alors, je vais y arriver, mais j'ai une question (toujours dans le meme style) :
pourquoi :
affiche un message, alors que
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Dim b As Boolean b = ErreurUnicity(nomCellImpact, myRangeImpact) MsgBox b
n'affiche rien (meme pas la boite de dialogue) ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 MsgBox ErreurUnicity(nomCellImpact, myRangeImpact)
Je reprends donc ton code édité
Tu déclares myRangeImpact as variant (par défaut de type) et dans ta fonction, tu le déclares as range... Ça ne peut pas coller. C'est soit l'un soit l'autre, jamais les deux.Dim myRangeImpact, myRangeProba, myRangeNum, myRangeToto As Range
Set myRangeImpact = RechercheValeurPlagePart2(nomCellImpact, FeuilleGestionDesRisques.UsedRange) ' c'est la fameuse fonction sur laquelle on a travaillé hier, sauf que la, c'est la v2: celle qui marchait avec le xlWhole
Dim b As Boolean
b = TestFonc(myRangeImpact)
MsgBox b
Public Function TestFonc(ByVal myRange As Range) As Boolean
MsgBox "fonc"
TestFonc = True
End Function
E outre, si c'est un range que tu attends, alors arrange-toi pour que ce soit un range que tu envoies
Pour tester, change le nom de la feuille
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Sub bidouille() Dim truc as range Set Truc = Worksheets("LaFeuilleDeChou").range("A2:Z65000") msgbox TestFonc(Truc) End sub Public Function TestFonc(myRange As Range) As Boolean MsgBox "fonc" TestFonc = True End Function![]()
je ne voyait pas ou j'avais mi variant, mais je viens en effet de voir de plus pres la doc, je pensais que
Dim myRangeImpact, myRangeProba, myRangeNum, myRangeToto As Range equivalait à
Dim myRangeImpact As Range, Dim myRangeProba As Range, etc...
... et en fait pas du tout
Merci, j'ai compris mon erreur.
Alors pourquoi, avec le code suivant :
avec la fonction ErreurUnicity definie comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Dim b As Boolean b = ErreurUnicity(nomCellImpact, myRangeImpact) If b = False Then Exit Sub
1) SI le mot existe dans une cellule non fusionné --> le message s'affiche ("il y a 1 cellules contenant toto")
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 Public Function ErreurUnicity(ByVal valRecherchee As String, ByVal r As Range) As Boolean ErreurUnicity = False ' If IsEmpty(r) Then <--> ca ne change rien If r.Count = 0 Then MsgBox "Erreur: la cellule nommée " & valRecherchee & " n'existe pas !" Else If r.Count > 1 Then MsgBox "Erreur: la cellule nommée " & valRecherchee & " doit être unique ! (il y a " & r.Count & " cellules contenant " & valRecherchee Else ErreurUnicity = True End If End If MsgBox "il y a " & r.Count & " cellules contenant " & valRecherchee End Function
2) SI le mot existe dans deux cellules distinctes (chacune non fusionnés) --> le message s'affiche ("erreur, unicité requise")
3) SI le mot n'existe pas, AUCUNE boite de dialogue s'affiche !!!
--> ok resolu en remplacant :
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part If r IS NOTHING Then
Code : Sélectionner tout - Visualiser dans une fenêtre à part If r.Count = 0 Then
Même pas ???
Alors c'est que tu as un "On error resume next" ou "goto ???" dans la procédure appelante. Sinon c'est, pour moi comme pour toi, un mystèreMsgBox "il y a " & r.Count & " cellules contenant " & valRecherchee
Edit
Et en outre, que tu as une erreur dans la fonction
Tu n'as pas une condition qui traîne pour appeler la fonction ? parce que sinon je ne vois pas.
Vérifie tout de même qu'un on error ne se prélasse pas dans une des procédures publiques "parentes". (A clore avec On error goto 0)
bon reprennons a zero :
la fonction RechercheValeurPlagePart :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Const nomCellImpact As String = "Impacts" Dim myRangeImpact As Range, myRangeProba As Range, myRangeNum As Range, myRangeToto As Range Set myRangeImpact = RechercheValeurPlagePart(nomCellImpact, FeuilleGestionDesRisques.UsedRange) Dim b As Boolean b = ErreurUnicity(nomCellImpact, myRangeImpact) If b = False Then MsgBox "c pas passé" Exit Sub End If
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
17
18
19
20
21
22
23
24 Public Function RechercheValeurPlagePart(ByVal valeurRecherchee As Variant, ByVal plageDeRecherche As Range) As Range Dim cellulesTrouvees As Range, PremAdresse As String ' verifier si la plage recue en parametre n'est pas vide (auquel cas sortir) If plageDeRecherche.Count = 0 Then Exit Function ' on trouve la premiere cellule contenant la valeur With plageDeRecherche Set cellulesTrouvees = .Find(What:=valeurRecherchee, lookat:=xlPart, MatchCase:=False) If Not cellulesTrouvees Is Nothing Then PremAdresse = cellulesTrouvees.Address Do If RechercheValeurPlagePart = valeurRecherchee Then Set RechercheValeurPlagePart = Application.Union(RechercheValeurPlagePart, cellulesTrouvees) End If Set cellulesTrouvees = .FindNext(cellulesTrouvees) Loop Until cellulesTrouvees.Address = PremAdresse End If End With End Function
et erreurUnicity :
alors la, j'ai tout le temps les msgbox :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Public Function ErreurUnicity(ByVal valRecherchee As String, ByVal r As Range) As Boolean ErreurUnicity = False If r Is Nothing Then MsgBox "Erreur: la cellule nommée " & valRecherchee & " n'existe pas !" Else If r.Count > 1 Then MsgBox "Erreur: la cellule nommée " & valRecherchee & " doit être unique ! (il y a " & r.Count & " cellules contenant " & valRecherchee Else ErreurUnicity = True End If End If MsgBox "il y a " & r.Count & " cellules contenant " & valRecherchee End Function
1) Erreur: la cellule nommée Impacts n'existe pas !
2) c pas passé
bien vu... la encore je pensais que la visibilté ne descendais pas aux fonctions appelées, tu es bon...
du coup, dans la fonction : RechercheValeurPlagePart, j'ai une erreur sur la ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Set RechercheValeurPlagePart = Application.Union(RechercheValeurPlagePart, cellulesTrouvees)
... "argument ou appel de procedure incorrect"
Pour utiliser Union, tu dois avoir au moins deux arguments (Range1 et Range2)
Comme tu ne mets qu'un bout de code, je ne vois pas ce qu'est RechercheValeurPlagePart avant ton Set.
Pour que ça fonctionne, tu dois déjà avoir au moins mis
Ensuite tu peux utiliser Union comme tu le fais
Code : Sélectionner tout - Visualiser dans une fenêtre à part Set RechercheValeurPlagePart = Quelquechose '(un range... Range("A1") par exemple)
Partager