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 :

Prob boucle for next avec recherche chaine


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Prob boucle for next avec recherche chaine
    Problème pour établir une boucle.

    J'ai une feuille excel contenant un livre-journal comptable d'une association... j'aimerais que quand il y a le mot "Cotisation" en cellule C# il me renvoie la valeur de la cellule qui se trouve en colonne D (même ligne).
    Mais le mot "Cotisation" qui se trouve dans ladite cellule peut être accompagné d'une description genre "Cotisation Untel" (la cellule peut donc comporter plus que ce mot). J'aimerais aussi nommer le nom de la feuille Worksheets(3) qui est "c-c".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Cell as Range
    For Each Cell In Worksheets(3).Range("C4:C50")
           If Cell.Find("Cotisation") = True Then MsgBox (Cell.Offset(0, 1).Value)
    Next Cell
    Merci d'avance pour votre aide.

  2. #2
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut chaîne de caractères
    Bonsoir Papajn,

    Tout d'abord, bienvenu sur le Forum.

    Un conseil. Utilise les balises de code pour citer un développement VBA. L'exposé n'en sera que plus clair.

    Pour ton information, la méthode "Find" renvoie un objet Range. Elle ne retourne donc ni False ni True.

    Afin de tester la présence d'une chaîne de caractères, tu peux utiliser la propriété "Instr", soit par exemple (code à adapter) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Sub ESSAI()
    Dim c As Range
    For Each c In Range("A1:A10")
        If InStr(c, "Cotisation") > 0 Then Debug.Print c.Address
    Next c
    End Sub
    Pour ces 2 instructions, tu peux consulter l'aide en ligne d'Excel (F1 sur le mot clé).

    Reviens si nécessaire.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 907
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 907
    Points : 28 882
    Points
    28 882
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Soit tu utilises la méthode FIND soit tu utilises la fonction Instr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Cell As Range
    For Each Cell In Worksheets(2).Range("C4:C24")
    If InStr(UCase(Cell), "COTISATION") Then MsgBox (Cell.Offset(0, 1).Value)
    Next Cell
    Pour la méthode FIND, je n'ai pas le temps de faire un Test, mais ce serait la procédure la plus rapide.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par corona Voir le message
    Bonjour,
    Soit tu utilises la méthode FIND soit tu utilises la fonction Instr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Cell As Range
    For Each Cell In Worksheets(2).Range("C4:C24")
    If InStr(UCase(Cell), "COTISATION") Then MsgBox (Cell.Offset(0, 1).Value)
    Next Cell
    Pour la méthode FIND, je n'ai pas le temps de faire un Test, mais ce serait la procédure la plus rapide.

    J'ai donc écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Cell As Range
    For Each Cell In Worksheets(3).Range("C4:C24")
    If InStr(UCase(Cell), "Cotisation") Then MsgBox (Cell.Offset(0, 1).Value)
    Next Cell
    Les cellules C3 et C4 contiennent le mot "Cotisation".
    Par ailleurs comment nommer la feuille par son nom "c-c"?
    Ne fonctionne pas... cela bloque sur UCase(Cell)...

  5. #5
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut Find
    Bonsoir Corona,

    Soit tu utilises la méthode FIND
    Dans ce cas, tu n'es plus dans le contexte VBA mais dans le contexte Excel. Il s'agit donc d'utiliser WorksheetFunction.

    Cela me semble plus compliqué alors.
    Au demeurant, voici une prposition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Sub ESSAI()
     
    Dim c As Range, t As Integer
     
    On Error Resume Next
     
    For Each c In Range("A1:A10")
        t = WorksheetFunction.Find("Cotisation", c.Value, 1)
        If t > 0 Then Debug.Print c.Address
        t = 0
    Next c
     
    End Sub

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  6. #6
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Essayé aussi cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim c As Range
    For Each c In Worksheets(3).Range("C4:C50")
        If InStr(c, "Cotisation") > 0 Then MsgBox (c.Adress.Offset(0, 1).Value)
    Next c
    ne bloque pas, mais ne renvoie rien....

  7. #7
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Papajn,

    Remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c.Adress.Offset(0, 1).Value
    par c est ici un objet Range.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  8. #8
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    J'ai trouvé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim c As Range, t As Integer
     
    On Error Resume Next
     
    For Each c In Worksheets(3).Range("C4:C24")
        t = WorksheetFunction.Find("Cotisation", c.Value, 1)
        If t > 0 Then MsgBox (c.Offset(0, 1).Value)
        t = 0
    Next c
    Comment nommer la feuille par son nom? et peut-on facilement faire cette recherche sur 3 feuilles différentes sans tout réécrire? Je voudrais faire cette recherche sur les feuilles "c-c", "caisse" et "c-e"

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 907
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 907
    Points : 28 882
    Points
    28 882
    Billets dans le blog
    53
    Par défaut
    Bonsoir,
    Citation Envoyé par papajn Voir le message
    J'ai donc écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Cell As Range
    For Each Cell In Worksheets(3).Range("C4:C24")
    If InStr(UCase(Cell), "Cotisation") Then MsgBox (Cell.Offset(0, 1).Value)
    Next Cell
    Les cellules C3 et C4 contiennent le mot "Cotisation".
    Par ailleurs comment nommer la feuille par son nom "c-c"?
    Ne fonctionne pas... cela bloque sur UCase(Cell)...
    Le but de placer la fonction UCASE avec Cell, c'est justement de mettre en majuscule le contenu de la cellule et donc il faut comparer avec COTISATION sinon la fonction ne trouvera rien évidemment.
    Si tu es absolument certain que tout est écrit correctement, tu peux enlever le UCASE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If InStr(Cell, "Cotisation") Then MsgBox (Cell.Offset(0, 1).Value)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  10. #10
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    J'ai trouvé:
    Merci pour lui! Cette recherche ne t'a pas pris trop de temps, j'espère!

    Merci également de m'avoir répondu.

    J'arrête ma contribution.

    Pas...

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  11. #11
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 907
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 907
    Points : 28 882
    Points
    28 882
    Billets dans le blog
    53
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    Bonsoir Corona,
    Dans ce cas, tu n'es plus dans le contexte VBA mais dans le contexte Excel. Il s'agit donc d'utiliser WorksheetFunction.
    Cela me semble plus compliqué alors.
    Bonsoir Marcel,
    Je ne parlais pas de la fonction Find d'excel mais la méthode FIND de VBA (l'équivalent de la recherche Ctrl+F)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  12. #12
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci Corona et MarcelG,

    J'ai essayé la méthode avec InStr, en enlevant le Ucase, mais sans succès.

    Comment donc faire cette recherche sur plusieurs feuilles et ce en les nommant?

  13. #13
    Membre chevronné Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Points : 2 003
    Points
    2 003
    Par défaut
    Bonjour,
    Pour faire une recherche sur tes trois feuilles, en complément des codes de corona et de MarceG que je salue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim mesfeuil As Variant
    mesfeuil = Array(Sheets("c-c"), Sheets("caisse"), Sheets("c-e"))
    For Each sh In mesfeuil
      With sh
        For Each cell In .Range("C4:C24")
        If InStr(UCase(cell), "COTISATION") Then MsgBox (cell.Offset(0, 1).Value)
        Next cell
      End With
    Next sh
    @+

    Si vous avez trouvé la solution à votre problème n'oubliez pas d'appuyer sur
    Et n'oubliez pas de voter en appuyant sur si ce message a repondu à vos attentes.
    Ou sur si ce n'est pas le cas

  14. #14
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Excellent!!!

    Code final:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim Cell As Range
    Dim mesfeuil As Variant
    Dim sh As Variant
     
    mesfeuil = Array(Sheets("caisse"), Sheets("c-c"), Sheets("c-e"))
    For Each sh In mesfeuil
      With sh
        For Each Cell In .Range("C4:C24")
        If InStr(Cell, "Cotisation") Then MsgBox (Cell.Offset(0, 1).Value)
        Next Cell
      End With
    Next sh
    Grand merci à vous!

  15. #15
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 907
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 907
    Points : 28 882
    Points
    28 882
    Billets dans le blog
    53
    Par défaut
    Bonsoir Hervé,
    Attention que si on utilise la fonction UCASE, il faut chercher aussi le mot en majuscule.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If InStr(UCase(cell), "COTISATION") Then MsgBox (cell.Offset(0, 1).Value)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  16. #16
    Membre chevronné Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Points : 2 003
    Points
    2 003
    Par défaut
    Très juste je l'ai remarqué après, j'ai edité mon post précédent.
    Merci pour ta remarque.
    @+

    Si vous avez trouvé la solution à votre problème n'oubliez pas d'appuyer sur
    Et n'oubliez pas de voter en appuyant sur si ce message a repondu à vos attentes.
    Ou sur si ce n'est pas le cas

  17. #17
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 907
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 907
    Points : 28 882
    Points
    28 882
    Billets dans le blog
    53
    Par défaut
    Bonsoir,
    Citation Envoyé par papajn Voir le message
    Merci Corona et MarcelG,
    J'ai essayé la méthode avec InStr, en enlevant le Ucase, mais sans succès.
    Comment donc faire cette recherche sur plusieurs feuilles et ce en les nommant?
    Je suis toujours étonné de ces demandes partielles. Dans ton premier message, tu ne fais nulle part allusions à une recherche sur plusieurs feuilles.
    Problème pour établir une boucle.
    J'ai une feuille excel contenant un livre-journal comptable d'une association... j'aimerais que quand il y a le mot "Cotisation" en cellule C# il me renvoie la valeur de la cellule qui se trouve en colonne D (même ligne).
    Mais le mot "Cotisation" qui se trouve dans ladite cellule peut être accompagné d'une description genre "Cotisation Untel" (la cellule peut donc comporter plus que ce mot). J'aimerais aussi nommer le nom de la feuille Worksheets(3) qui est "c-c".
    Merci d'avance pour votre aide.
    Comment espérer une réponse pertinente dans ces cas là.
    Et la raison de l'utilisation de UCASE, c'est que je me suis dit qu'avec plus qu'un mot dans une cellule, il y avait un risque d'avoir par exemple Untel, cotisation ou la cotisation d'untel ou encore et cela arrive cotisation Untel.
    On est jamais trop prudent, ce type de problème arrive fréquemment mais bon, si tu sûr de de ce qui est encodé, pas de problème.
    description genre "Cotisation Untel" (la cellule peut donc comporter plus que ce mot).
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

Discussions similaires

  1. Boucle For Next avec 2 variables
    Par neninio31 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 20/07/2019, 19h46
  2. [XL-2003] Pb avec une boucle For - Next
    Par cynoq dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 12/12/2011, 11h29
  3. [AC-2007] ouvrir plusieurs états avec boucle FOR...NEXT
    Par sylv20 dans le forum IHM
    Réponses: 5
    Dernier message: 30/06/2011, 10h58
  4. [VB.net] Boucle for next avec un tableau
    Par grand_prophete dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/05/2006, 11h08
  5. Réponses: 3
    Dernier message: 03/11/2005, 19h22

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