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
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)
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)
bah je venait d'y penser :
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
25
26 Public Function RechercheValeurPlagePart(ByVal valeurRecherchee As String, 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 Is Nothing 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 Set RechercheValeurPlagePart = cellulesTrouvees Do If cellulesTrouvees = 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
mais bon ce n'est qu'une maigre victoire, puisque sans se pencher sur le probleme des cellules fusionnées, j'ai :
- avec 0 impact --> la boite de dialogue "Erreur : y a aucune cellule avec impacts"
- avec 1 impact --> la boite de dialogue "il y a 1 cellules impacts"
- avec 2 impacts --> la boite de dialogue "il y a 1 cellules impacts"
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é
Partager