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 24/10/2011, 12h28   #1
Invité de passage
 
Femme
Inscription : octobre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : octobre 2011
Messages : 10
Points : 1
Points : 1
Par défaut tableau qui donne les dates communes (ligne) de 3 noms choisis(colonne)

Bonjour,

je synthétise une base de données, et je tente desperement de faire un tableau double entrée avec en colonne principale 3 noms, et en ligne les dates disponibles qui sont communes aux 3 noms, avec 4 dates maximum; le but étant de comparer les prix liés à ces noms à des dates différentes.

Je m explique pour chaque nom dans ma base de données, il peut y avoir plusieurs dates correspondantes et je cherche à faire des comparaisons selon les noms et dates, donc je recherche les dates communes aux 3 noms choisis.

Pour l'instant, je n'ai réussi qu'à avoir les dates dispo sur une même ligne, pour un seul nom grace à une boucle dans vba,voici le code:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub CommandButton3_Click()
Worksheets("Synthese").Select
 
'nettoyage des données du tableau
Worksheets("Synthese").Select
Range("D26:O26").ClearContents
 
Dim Name As String
Dim cells As Range
 
'Name = cells(28, 3)
Dim i
Name = ActiveCell.Value
i = 1
For Each cells In Worksheets("sheet").Range("a3:a" & Worksheets("sheet").Range("A65536").End(xlUp).Row)
If cells.Value = Name Then
ActiveCell.Offset(-2, i) = cells.Offset(0, 1).Value
'cells(28, 3).Offset(-2, i) = cells.Offset(0, 1).Value
 
i = i + 1
End If
Next
End Sub
Mon pb, c'est d arriver à faire la même chose mais pour les 3 noms disposés dans la même colonne de mon tableau
Toute aide est sera précieuse donc + que bienvenue ! Merci bcp
camad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2011, 13h08   #2
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonjour,

Décris très précisément tes données, sur quelle feuille on trouve quoi et donne un exemple de ce que tu cherches à faire.
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 12h07   #3
Invité de passage
 
Femme
Inscription : octobre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : octobre 2011
Messages : 10
Points : 1
Points : 1
Par défaut pbm de boucle

Salut Daniel,

Alors mon fichier se compose de 2 feuilles excel.
la premiere s appelle "Synthese" et contient mon tableau.
La 2eme s appelle "sheet" et contient mes données:
colonne A: tous les noms
colonne B: toutes les dates (maturités correspondantes)
Donc pour un même nom qui peut apparaitre plusieurs fois dans la colonne A il y aura plusieurs dates dispo dans la colonne B.

Ce que j essaye de faire: avoir dans mon tableau de synthese, pour les 3 noms choisis (dans la colonne principale du tableau) les dates communes et disponibles dans la ligne principale du tableau pour au moins 2 des noms.

Le code précédent me permet d afficher en ligne les dates disponibles pour un nom choisi dans la colonne.

Voici mon code pour le tableau avec les 3 noms:
Mon problème étant maintenant que les boucles ne retiennent que la premiere date trouvée correspondante au nom choisi. Donc le premier x1 pour name1, le 1er x2 pour name2 et idem pour x3. Donc je ne peux tester toutes les combinaison. Il faudrait que la macro retienne tous les x1, x2 et x3 possibles et que toutes les combinaisons soient testées.

'***************************************Création du tableau de synthese**************************************

Code :
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
Private Sub commandbutton_4()
 
Worksheets("Synthese").Select
 
'Identification des variables: Issuers
 
Dim name1 As String: name1 = Worksheets("Synthese").Range("C43").Value
Dim name2 As String: name2 = Worksheets("Synthese").Range("C44").Value
Dim name3 As String: name3 = Worksheets("Synthese").Range("C45").Value
 
'Identification des variables: Maturities
 
Dim x1 As String
Dim x2 As String
Dim x3 As String
 
'Identification des variables: chaque cellule dans la colonne A (Name) de la feuille "sheet"
 
Dim cells1 As Range
Dim cells2 As Range
Dim cells3 As Range
 
'Pour chaque cellule de la colonne A feuille "sheet" si la cellule est = name1 soit l'emetteur 1 choisi alors
'la cellule de la colonne B (même ligne) correspond à la maturité 1 (x1)
' ainsi on defini toutes les maturités disponibles (x1) pour l issuer 1 (name1)
 
For Each cells1 In Worksheets("sheet").Range("a3:a" & Worksheets("sheet").Range("a300").End(xlUp).Row)
If cells1.Value = name1 Then
x1 = cells1.Offset(0, 1).Value
 
For Each cells2 In Worksheets("sheet").Range("a3:a" & Worksheets("sheet").Range("a300").End(xlUp).Row)
If cells2.Value = name2 Then
x2 = cells2.Offset(0, 1).Value
 
For Each cells3 In Worksheets("sheet").Range("a3:a" & Worksheets("sheet").Range("a300").End(xlUp).Row)
If cells3.Value = name3 Then
x3 = cells3.Offset(0, 1).Value
 
Dim i As Long
i = 1
 
'si les maturités disponibles pour l issuer 1, l issuer 2 et l issuer 3 sont les mêmes alors on affiche les maturités
'communes en ligne dans le tableau
 
 
If x1 = x2 And x2 = x3 And x1 = x3 Then
Worksheets("Synthese").Range("C43").Offset(-2, i).Value = x1
i = i + 1
End If
 
'si les maturités disponibles pour l issuer 1 et l issuer 2 sont les mêmes alors on affiche les maturités
'communes en ligne dans le tableau
 
If x1 = x2 Then
Worksheets("Synthese").Range("C43").Offset(-2, i).Value = x1
i = i + 1
End If
 
'si les maturités disponibles pour l issuer 2 et l issuer 3 sont les mêmes alors on affiche les maturités
'communes en ligne dans le tableau
If x2 = x3 Then
Worksheets("Synthese").Range("C43").Offset(-2, i).Value = x2
i = i + 1
End If
 
'si les maturités disponibles pour l issuer 1 et l issuer 3 sont les mêmes alors on affiche les maturités
'communes en ligne dans le tableau
If x1 = x3 Then
Worksheets("Synthese").Range("C43").Offset(-2, i).Value = x1
i = i + 1
End If
 
End If
Next cells3
 
End If
Next cells2
 
End If
Next cells1
 
 
End Sub
J espère que j ai été claire... Merci encore pour ton aide.
camad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 12h31   #4
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Citation:
Ce que j essaye de faire: avoir dans mon tableau de synthese, pour les 3 noms choisis (dans la colonne principale du tableau) les dates communes et disponibles dans la ligne principale du tableau pour au moins 2 des noms.
Bonjour,

Il est disposé comment, ton tableau ? c'est quoi, la colonne principale et la ligne principale ? Comment on repère les noms choisis ? Donne un exemple de ce que tu veux.
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 14h56   #5
Invité de passage
 
Femme
Inscription : octobre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : octobre 2011
Messages : 10
Points : 1
Points : 1
l exemple en PJ
Fichiers attachés
Type de fichier : xls spreadsheet3.xls (113,5 Ko, 2 affichages)
camad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 15h24   #6
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
On n'avance pas... Donne un exemple de résultats pour les lignes 43-45.
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 15h30   #7
Invité de passage
 
Femme
Inscription : octobre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : octobre 2011
Messages : 10
Points : 1
Points : 1
dans le tableau, les résultats sont des fonctions excel. je n ai pas de problème avec les résultats. Ce qui me pose problème c'est l'affichage des maturités disponibles sur la ligne 41 (ce qui ne dépend pas des résultats dans le tableau).
C'est le même principe que ce que j ai fait dans le premier tableau, où il faut cliquer sur la cellule C28, choisir le nom de l'émetteur et cliquer sur le bouton "generate spread" pour avoir les maturités sur la ligne 26
camad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 17h13   #8
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Essaie ce code.
Code :
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
27
28
29
Private Sub CommandButton4_Click()
    'Réf Camad.xls
    Dim c As Range, Ctr As Integer, Col As Integer, Plage As Range
 
    Worksheets("Synthese").Select
    Col = 4
    With Sheets("sheet")
        .[E:F].ClearContents
 
        Ctr = 0
        For Each c In .Range(.[A3], .cells(.Rows.Count, 1).End(xlUp))
            If c.Value = cells(43, 3) Or c.Value = cells(44, 3) Or c.Value = cells(45, 3) Then
                Ctr = Ctr + 1
                .cells(Ctr, 5) = c.Value
                .cells(Ctr, 6) = c.Offset(, 1).Value
            End If
        Next c
        .[E:F].Sort .[F1], xlAscending, Header:=xlNo
        Set Plage = .Range(.[F1], .cells(.Rows.Count, 6).End(xlUp))
        Col = 4
        For Each c In Plage
            If Application.CountIf(Plage, c.Value) > 2 And _
            Application.CountIf([D41:N41], c.Value) = 0 Then
                cells(41, Col) = c.Value
                Col = Col + 1
            End If
        Next c
    End With
End Sub
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 17h48   #9
Invité de passage
 
Femme
Inscription : octobre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : octobre 2011
Messages : 10
Points : 1
Points : 1
Merci bcp Daniel, ce code me permet effectivement d obtenir toutes les maturités disponibles pour les 3 noms.
Mon problème était d'afficher sur la ligne 41 du tableau les maturités qui sont communes a au moins 2 des 3 noms.
camad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 17h56   #10
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
il suffit de replacer la ligne :

Code :
If Application.CountIf(Plage, c.Value) > 2 And _
par :

Code :
If Application.CountIf(Plage, c.Value) > 1 And _
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 18h23   #11
Invité de passage
 
Femme
Inscription : octobre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : octobre 2011
Messages : 10
Points : 1
Points : 1
super! ca marche!!!
Je suis désolée, je ne comprend pas très bien le code que tu m'as donné par contre.
Dans mon fichier original, j ai 4 noms et pas 3 à choisir et dans la feuille "sheet" où sont mes données, les colonnes D à H sont occupées par d'autres données qui me servent pour les résultats du tableau.

Peux tu stp me dire ce que je dois modifier dans le code pour que les noms et maturités ne s'affichent pas à cet endroit?

Merci bcp pour ton aide, c'est vraiment génial!
camad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 18h40   #12
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
J'ai commenté la macro; j'utilise les colonnes J et K temporairement. je n'écris la date que si je l'ai trouvée 3 fois pour les 4 noms (c'est modifiable) :

Code :
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Private Sub CommandButton4_Click()
    'Réf Camad.xls
    Dim c As Range, Ctr As Integer, Col As Integer, Plage As Range
 
    Worksheets("Synthese").Select
    'la variable Col renseigne la colonne en écriture
    Col = 4
    With Sheets("sheet")
        'colonnes utilisées pour trier les données sélectionnées
        .[J:K].ClearContents
        Ctr = 0
        'boucle sur la colonne A de la feuille sheet
        For Each c In .Range(.[A3], .cells(.Rows.Count, 1).End(xlUp))
            'si la valeur est égale à l'une des 4 noms de la feuille Synthese
            If c.Value = cells(43, 3) Or c.Value = cells(44, 3) Or c.Value = cells(45, 3) _
             Or c.Value = cells(46, 3) Then
                Ctr = Ctr + 1
                'on écrit les valeurs en colonne J et K
                .cells(Ctr, 10) = c.Value
                .cells(Ctr, 11) = c.Offset(, 1).Value
            End If
        Next c
        'on trie la colonne K (date)
        .[J:K].Sort .[K1], xlAscending, Header:=xlNo
        Set Plage = .Range(.[K1], .cells(.Rows.Count, 11).End(xlUp))
        Col = 4
        'on parcourt la colonne K
        For Each c In Plage
            's'il y a plus de deux fois la même date
            'et que la date n'a pas été déjà recopiée
            If Application.CountIf(Plage, c.Value) > 2 And _
            Application.CountIf([D41:N41], c.Value) = 0 Then
                'on écrit la date en ligne 1
                cells(41, Col) = c.Value
                Col = Col + 1
            End If
        Next c
        .[J:K].ClearContents
    End With
End Sub
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 18h57   #13
Invité de passage
 
Femme
Inscription : octobre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : octobre 2011
Messages : 10
Points : 1
Points : 1
merciiii !!!!
You are THE best!
camad 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 11h52.


 
 
 
 
Partenaires

Hébergement Web