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

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


    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
    et la fonction est
    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
    les problemes :
    - je n'ai pas le msgbox "fonc" qui s'affiche
    - le msgbox affiche "faux" pour b

    par contre, si je retire le parametre :

    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
    et la fonction est
    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
    j'ai :
    - 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.

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

  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
    je viens d'éditer le code de mon dernier post

  10. #10
    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, 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...

  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
    bon alors, je vais y arriver, mais j'ai une question (toujours dans le meme style) :
    pourquoi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim b As Boolean
    b = ErreurUnicity(nomCellImpact, myRangeImpact)
    MsgBox b
    affiche un message, alors que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MsgBox ErreurUnicity(nomCellImpact, myRangeImpact)
    n'affiche rien (meme pas la boite de dialogue) ???

  12. #12
    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
    Je reprends donc ton code édité
    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
    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.
    E outre, si c'est un range que tu attends, alors arrange-toi pour que ce soit un range que tu envoies

    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
    Pour tester, change le nom de la feuille

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

    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
    avec la fonction ErreurUnicity definie comme suit :
    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
    1) SI le mot existe dans une cellule non fusionné --> le message s'affiche ("il y a 1 cellules contenant toto")

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

  14. #14
    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 onejock Voir le message

    1) SI le mot existe dans une cellule non fusionné --> le message s'affiche ("il y a 1 cellules contenant toto")

    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

  15. #15
    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
    Même pas ???
    MsgBox "il y a " & r.Count & " cellules contenant " & valRecherchee
    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

    Edit
    Et en outre, que tu as une erreur dans la fonction

  16. #16
    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 !!!

  17. #17
    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)

  18. #18
    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é

  19. #19
    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"

  20. #20
    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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