IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

find ignoré dans les cellules fusionnées


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 111
    Par défaut find ignoré dans les cellules fusionnées
    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

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu dois utiliser xlwhole. Avec xlpart, ça fonctionne. Ensuite tu vérifies si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(nl, nc) = CeQueTuCherches
    Tu vois comme il serait mieux si tu avais mis ton code, on serait pas là à essayer de deviner

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 111
    Par défaut
    Désolé :
    mais bon, comme ca ne marche pas voila le code de la fonction (j'ai remplacé le xlWhole par le xlPart):

    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
    je fais ensuite
    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

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Remplace ta recherche par ça
    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
    Tu peux tester pour moi ?
    A+

    Remarque : ce code, s'il fonctionne, "n'unit" (d'union) que les cellules dont la cellule entière = valeurRecherchee

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 111
    Par défaut
    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

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    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

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 111
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    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ère

    non, non, malgré mon erreur, c'est un mystere de savoir pourquoi, mon instruction qui n'est en rien conditionnelle ne s'execute pas !!!

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    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)

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 111
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    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"

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set RechercheValeurPlagePart = Quelquechose '(un range... Range("A1") par exemple)
    Ensuite tu peux utiliser Union comme tu le fais

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 111
    Par défaut
    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"

  12. #12
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 111
    Par défaut
    bon reprennons a zero :


    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
    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
    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 :

    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
    alors la, j'ai tout le temps les msgbox :
    1) Erreur: la cellule nommée Impacts n'existe pas !
    2) c pas passé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/06/2013, 15h57
  2. Réponses: 2
    Dernier message: 21/06/2006, 17h57
  3. Changement de couleur dans les cellules d'un tableau
    Par allowen dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/11/2005, 14h52
  4. [JTable] centrer les donnees dans les cellules
    Par cmoa59 dans le forum Composants
    Réponses: 5
    Dernier message: 20/05/2005, 11h35
  5. Alignement dans les cellules d'un tableau
    Par philippef dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 23/02/2005, 12h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo