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 21/10/2011, 19h10   #1
Invité de passage
 
Inscription : décembre 2008
Messages : 27
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 27
Points : 3
Points : 3
Par défaut Recherche et concaténation des résultats

Bonjour,

Je suis un peu novice en VBA et j'ai donc essayé un petit programme simple mais cela ne marche pas...
Je veux créer une fonction qui prend 2 valeurs en entrée. Ces 2 valeurs sont recherchés dans un tableau (la valeur 1 doit être contenue dans la colonne A et la valeur 2 doit être contenue dans la colonne B). Si ces 2 conditions sont remplies, je souhaite récupérer la valeur de la colonne 3. Je parcours ainsi tout mon tableau et je concaténe les résultats avant de les retourner.

Code :
1
2
3
4
5
6
7
8
9
10
Function maConcatenation(valeur1 as String, valeur2 as String) as String
Worksheet("Calcul").Select
For length =1 to 100 then
if Cells(length,1)=valeur1 Then
 if Cells(length,2)= valeur2 Then
 maConcatenation=maConcatenation&" "&Cells(length,3)
End If
End If
Next length
End Function
J'ai essayé de mettre un .Value à la fin de Cells mais rien n'y change sauf le message d'erreur...

Lorsque j'aurai compris cela je m'attaquerai à ne parcourir que mon tableau et non pas les 100 premières lignes de la feuille...

En tt cas, si vous avez des idées ce serait super !
Merci à vous et bonne soirée,

Nico
nicotimo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 19h23   #2
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
un message d'erreur ?

c'est jamais une bonne idée d'utiliser Select ... il faut préciser la feuille concernées devant Cells, range....

Utilise une variable string intermédiaire pour calculer ta concaténation

Code :
1
2
3
4
5
6
7
8
9
10
 
Dim st As stiring 
 
(...)
st = st & " " & (....)
 
(...)
 
MaConcatenation = st
End function
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 19h23   #3
Invité régulier
 
Homme Antoine
Inscription : octobre 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Antoine
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 5
Points : 5
Points : 5
bonjour,

je ne suis pas sur de tout avoir compris et c'est ma première réponse sur ce forum mais essaye

1. d'ajouter en première ligne de ta fonction
(pour initialiser ton résultat)

2. de changer

C
Code :
1
2
3
ells(length,1)=valeur1  en    Cells(length,1).text=valeur1 
Cells(length,2)=valeur2  en    Cells(length,2).text=valeur2 
maConcatenation=maConcatenation&" "&Cells(length,3)
en
Code :
maConcatenation=maConcatenation&" "&Cells(length,3).text
(si tu as bien des valeurs textes dans tes cellcules)

Dis moi si ça aide
Excellant est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 19h51   #4
Invité de passage
 
Inscription : décembre 2008
Messages : 27
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 27
Points : 3
Points : 3
Alors tout d'abord merci à vous 2.

La solution donnée, d'écrire ".text" ne fonctionne pas. Je n'ai aucune erreur à l'execution mais le résultat obtenu est #VALEUR....

Nico
nicotimo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 19h56   #5
Invité régulier
 
Homme Antoine
Inscription : octobre 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Antoine
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 5
Points : 5
Points : 5
as-tu essayé d'ajouter

maConcatenation = ""

en 1ère ligne de ta fonction ?
Excellant est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 20h12   #6
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
Citation:
Envoyé par nicotimo Voir le message
Alors tout d'abord merci à vous 2.

La solution donnée, d'écrire ".text" ne fonctionne pas. Je n'ai aucune erreur à l'execution mais le résultat obtenu est #VALEUR....

Nico
Ou en est tu de ton code ? as tu appliqué les correction préconisé (suppression de Select ?)
as tu corrigé tes fautes de syntaxes ? (il manque un s à Worksheeets)

as tu enlevé ce "Then" perdu en plein milieu de ton code ?
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 20h14   #7
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 692
Points : 1 443
Points : 1 443
Bonjour,

Tu as dû faire l’impasse sur le conseil de bbil
Citation:
Utilise une variable string intermédiaire pour calculer ta concaténation
Essaie avec

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function maConcatenation(valeur1 As String, valeur2 As String) As String
Dim st As String
Dim Length As Long
    With Worksheets("Calcul")
        For Length = 1 To 100
            If .Cells(Length, 1) = valeur1 Then
                If .Cells(Length, 2) = valeur2 Then
                     st = st & " " & .Cells(Length, 3)
                End If
            End If
        Next Length
    End With
    maConcatenation = st
End Function
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 20h17   #8
Invité de passage
 
Inscription : décembre 2008
Messages : 27
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 27
Points : 3
Points : 3
Oui j'ai essayé et cela ne change rien. Par contre, j'appelle ma fonction sur toute une colonne.
Le premier résultat est 0 au lieu de test1.
Le deuxième résultat est 0 0#VALEUR!0 au lieu de test3 test2
Le troisième résultat est 0 0#VALEUR!0 0 au lieu de test3 test2.

J'ai donc l'impression que la concaténation est mauvaise et qu'il ne réinitialise pas la valeur malgré le maConcatenation="" et st=""
nicotimo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 20h22   #9
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
Citation:
Envoyé par nicotimo Voir le message
...
J'ai donc l'impression que la concaténation est mauvaise et qu'il ne réinitialise pas la valeur malgré le maConcatenation="" et st=""
on as toujours pas vu le code que tu utilise ... le code que tu nous montre ne peu s'exécuter en l'état ... ! la "ré-initialisation" ne sert à rien ... en VB les variables string sont automatiquement initialisé en "" lors de leur déclaration.. il n'y as rien à écrire.

de plus dis nous comment tu appelle ta fonction quels sont les paramètres utilisés ? que contiennent tes colonnes A et B ?
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 20h40   #10
Invité de passage
 
Inscription : décembre 2008
Messages : 27
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 27
Points : 3
Points : 3
Pardon, j'ai tenu compte des différentes remarques.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
Function maConcatenation(valeur1 As String, valeur2 As String) As String
Dim st As String
Dim length as Long
 
st=""
maConcatenation=""
 
With Worksheets("Calcul").Select
 
For length = 1 To 100<blockquote>If Cells(length,1) = valeur1 Then<blockquote>if Cells(length,2) = valeur2 Then
st = st &" "& Cells(length,3)
End if
</blockquote>End if
</blockquote>Next length
End With
maConcatenation = st
End Function
Ceci me retourne toujours 0.

Si je remplace Cells(X,Y) par Cells(X,Y).text, j'obtiens le résultat évoqué tt à l'heure:
Le premier résultat est 0 au lieu de test1.
Le deuxième résultat est 0 0#VALEUR!0 au lieu de test3 test2
Le troisième résultat est 0 0#VALEUR!0 0 au lieu de test3 test2.

Pour ce qui est de la mise en place de mon test, j'ai la Feuil1 avec:
A6 qui contient DM01
B6 qui contient 3.0
C6=maConcatenation(A6;B6)

A7 qui contient DM02
B7 qui contient 3.1
C7=maConcatenation(A7;B7)

A8 qui contient DM03
B8 qui contient 3.1
C8=maConcatenation(A8;B8)

et sur la feuille nommée "Calcul":
A6 qui contient DM01
B6 qui contient 3.0
C6 qui contient test1

A7 qui contient DM02
B7 qui contient 3.1
C7 qui contient test3

A8 qui contient DM02
B8 qui contient 3.1
C8 qui contient test2

A9 qui contient DM03
B9 qui contient 3.2
C9 qui contient test

Merci en tt cas !
nicotimo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 20h54   #11
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
Encore une fois ce n'est pas le bon ... code ! ..
cette ligne :
Code :
With Worksheets("Calcul").Select
ne doit pas être accepté par l'éditeur VBA ...!


Ton with ne sert à rien si tu oublie le point devant tes Cells :



Ensuite je comprends pas ce que tu veux faire avec ton code ..? tu met ta formule en colonne C ...alors que le contenu de ta colonne C fait parti de la concaténation que tu désire obtenir ... tu n'as pas l'impression de créer une formule qui se "mord la q..."
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 21h08   #12
Invité de passage
 
Inscription : décembre 2008
Messages : 27
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 27
Points : 3
Points : 3
Ceci est accepté par VBA chez moi...
Bon, j'ai rajouté les . devant les Cells et j'obtiens des #VALEUR! pour chaque cellule de résultat.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
Function maConcatenation(valeur1 As String, valeur2 As String) As String
Dim st As String
Dim length as Long
 
st=""
maConcatenation=""
 
With Worksheets("Calcul").Select
 
For length = 1 To 100
If .Cells(length,1) = valeur1 Then
if .Cells(length,2) = valeur2 Then
st = st &" "& .Cells(length,3)
End if
End if
 
Next length
End With
maConcatenation = st
End Function
nicotimo est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 21/10/2011, 21h10   #13
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
.... enlève ce .Select ...


et revoit la position de ta formule ..
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 21h58   #14
Invité de passage
 
Inscription : décembre 2008
Messages : 27
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 27
Points : 3
Points : 3
Oui merci, c'est super. Bon je ne comprends pas ce que signifie la ligne volatile que tu as rajouté mais le résultat me convient. Merci encore. Je mets le code que tu as fait pour ceux qui veulent le visualiser.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Function maConcatenation(valeur1 As String, valeur2 As String) As String
Dim st As String
Dim Length As Long
Application.Volatile
With Worksheets("Calcul")
For Length = 1 To 100
    If .Cells(Length, 1) = valeur1 Then
        If .Cells(Length, 2) = valeur2 Then
            st = st & " " & .Cells(Length, 3)
        End If
    End If
Next Length
End With
maConcatenation = st
End Function
Bonne soirée !

Nico
nicotimo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2011, 10h15   #15
Expert Confirmé
 
Homme Philippe
ex Observeur CGG / Analyste prog.
Inscription : juin 2006
Messages : 1 707
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Localisation : France, Finistère (Bretagne)

Informations professionnelles :
Activité : ex Observeur CGG / Analyste prog.

Informations forums :
Inscription : juin 2006
Messages : 1 707
Points : 3 629
Points : 3 629
Salut, voir http://silkyroad.developpez.com/vba/fonctions/#LII-C pour rôle de Application.Volatile
__________________
Pensez à Voter, d'avance merci. ( Pouces en bas à la droite de Citer )
Balisez votre code après l'avoir indenté sous Excel via Smart Indenter
Autre utilitaire : MZ Tools 3.0 VBA

Contribution : Excel / Word / PDF avec Adobe Acrobat Pro / PDFCreator 1 2
kiki29 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 07h44.


 
 
 
 
Partenaires

Hébergement Web