Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/08/2011, 16h57   #1
Invité de passage
 
Homme
Inscription : août 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : août 2011
Messages : 6
Points : 1
Points : 1
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 :
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.
papajn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 17h15   #2
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

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

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
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 :
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

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


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 17h18   #3
Expert Confirmé
 
Philippe Tulliez
Développeur et formateur VBA, Excel et Word.
Inscription : janvier 2010
Messages : 1 306
Détails du profil
Informations personnelles :
Nom : Philippe Tulliez
Localisation : Belgique

Informations professionnelles :
Activité : Développeur et formateur VBA, Excel et Word.

Informations forums :
Inscription : janvier 2010
Messages : 1 306
Points : 2 654
Points : 2 654
Bonjour,
Soit tu utilises la méthode FIND soit tu utilises la fonction Instr
Code :
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
http://philippe.tulliez.be
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
corona est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 17h49   #4
Invité de passage
 
Homme
Inscription : août 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : août 2011
Messages : 6
Points : 1
Points : 1
Citation:
Envoyé par corona Voir le message
Bonjour,
Soit tu utilises la méthode FIND soit tu utilises la fonction Instr
Code :
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 :
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)...
papajn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 17h54   #5
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

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

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
Par défaut Find

Bonsoir Corona,

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

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


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 17h57   #6
Invité de passage
 
Homme
Inscription : août 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : août 2011
Messages : 6
Points : 1
Points : 1
Essayé aussi cela:

Code :
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....
papajn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 18h03   #7
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

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

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
Papajn,

Remplace

Code :
c.Adress.Offset(0, 1).Value
par c est ici un objet Range.
__________________

Bien Cordialement.

Marcel

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


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 18h04   #8
Invité de passage
 
Homme
Inscription : août 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : août 2011
Messages : 6
Points : 1
Points : 1
J'ai trouvé:

Code :
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"
papajn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 18h12   #9
Expert Confirmé
 
Philippe Tulliez
Développeur et formateur VBA, Excel et Word.
Inscription : janvier 2010
Messages : 1 306
Détails du profil
Informations personnelles :
Nom : Philippe Tulliez
Localisation : Belgique

Informations professionnelles :
Activité : Développeur et formateur VBA, Excel et Word.

Informations forums :
Inscription : janvier 2010
Messages : 1 306
Points : 2 654
Points : 2 654
Bonsoir,
Citation:
Envoyé par papajn Voir le message
J'ai donc écrit:
Code :
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 :
If InStr(Cell, "Cotisation") Then MsgBox (Cell.Offset(0, 1).Value)
__________________
Philippe Tulliez
http://philippe.tulliez.be
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
corona est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 18h13   #10
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

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

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
Citation:
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

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


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 18h18   #11
Expert Confirmé
 
Philippe Tulliez
Développeur et formateur VBA, Excel et Word.
Inscription : janvier 2010
Messages : 1 306
Détails du profil
Informations personnelles :
Nom : Philippe Tulliez
Localisation : Belgique

Informations professionnelles :
Activité : Développeur et formateur VBA, Excel et Word.

Informations forums :
Inscription : janvier 2010
Messages : 1 306
Points : 2 654
Points : 2 654
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
http://philippe.tulliez.be
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
corona est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 18h22   #12
Invité de passage
 
Homme
Inscription : août 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : août 2011
Messages : 6
Points : 1
Points : 1
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?
papajn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 18h24   #13
Membre Expert
 
Avatar de rvtoulon
 
Homme Hervé
Agent Technique
Inscription : mars 2009
Messages : 823
Détails du profil
Informations personnelles :
Nom : Homme Hervé
Âge : 36
Localisation : France, Var (Provence Alpes Côte d'Azur)

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

Informations forums :
Inscription : mars 2009
Messages : 823
Points : 1 441
Points : 1 441
Bonjour,
Pour faire une recherche sur tes trois feuilles, en complément des codes de corona et de MarceG que je salue:
Code :
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
rvtoulon est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/08/2011, 18h35   #14
Invité de passage
 
Homme
Inscription : août 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : août 2011
Messages : 6
Points : 1
Points : 1
Excellent!!!

Code final:
Code :
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!
papajn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 18h36   #15
Expert Confirmé
 
Philippe Tulliez
Développeur et formateur VBA, Excel et Word.
Inscription : janvier 2010
Messages : 1 306
Détails du profil
Informations personnelles :
Nom : Philippe Tulliez
Localisation : Belgique

Informations professionnelles :
Activité : Développeur et formateur VBA, Excel et Word.

Informations forums :
Inscription : janvier 2010
Messages : 1 306
Points : 2 654
Points : 2 654
Bonsoir Hervé,
Attention que si on utilise la fonction UCASE, il faut chercher aussi le mot en majuscule.
Code :
If InStr(UCase(cell), "COTISATION") Then MsgBox (cell.Offset(0, 1).Value)
__________________
Philippe Tulliez
http://philippe.tulliez.be
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
corona est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 18h39   #16
Membre Expert
 
Avatar de rvtoulon
 
Homme Hervé
Agent Technique
Inscription : mars 2009
Messages : 823
Détails du profil
Informations personnelles :
Nom : Homme Hervé
Âge : 36
Localisation : France, Var (Provence Alpes Côte d'Azur)

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

Informations forums :
Inscription : mars 2009
Messages : 823
Points : 1 441
Points : 1 441
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
rvtoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 18h44   #17
Expert Confirmé
 
Philippe Tulliez
Développeur et formateur VBA, Excel et Word.
Inscription : janvier 2010
Messages : 1 306
Détails du profil
Informations personnelles :
Nom : Philippe Tulliez
Localisation : Belgique

Informations professionnelles :
Activité : Développeur et formateur VBA, Excel et Word.

Informations forums :
Inscription : janvier 2010
Messages : 1 306
Points : 2 654
Points : 2 654
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.
Citation:
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.
Citation:
description genre "Cotisation Untel" (la cellule peut donc comporter plus que ce mot).
__________________
Philippe Tulliez
http://philippe.tulliez.be
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
corona est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h04.


 
 
 
 
Partenaires

Hébergement Web