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 28/08/2011, 17h41   #1
Membre du Club
 
Inscription : août 2004
Messages : 386
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 386
Points : 68
Points : 68
Par défaut remplacer une donnée par une autre

bonjour à tous

je récupère un fichier excel de mon site web via phpmyadmin (exporter sous excel)

sur mon onglet 1:

j ai une colonne ID, nomclient, ID formation

EX: 10, martin, 5
11, lebon,6
etc...

sur mon onglet 2

ID formation, nom formation
5, droit
6,économie
etc...

ce que j aimerai c est remplacer dans mon onglet 1 l'ID formation 5 par le nom de la formation droit et cela pour tous bien sûr.

ce qui me permet de faire des tris plus lisibles.

je pense qu un bout de code ou macro ou fonction serait utile.

voila quelq un aurait il une idée?

merci à tous de votre aide.

stephi
Stéph utilisateur d'acces est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 17h53   #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 847
Points : 16 847
Envoyer un message via Skype™ à bbil
Si c'est pour un tri tu peu aussi bien trié sur l'ID que sur le texte associé...


Tu pourrai rajouter dans une colonne de ton onglet 1 une formule RechercheV .. (voir ) ou Fonctions Excel à la loupe : N°1 - RECHERCHEV()
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 18h43   #3
Membre du Club
 
Inscription : août 2004
Messages : 386
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 386
Points : 68
Points : 68
salut bbil et merci

j ai plus de 50 ID donc il faut que je regarde chaque fois à quoi correspond l'id 25 par ex donc trier comme ça est trop lours.

je connais la recherche V mais je vois pas comment l'utiliser dans mon cas car ce que je veux c est qu'à la place de 2 j ai droit, 3 j ai éco, 4 jai farnçais etc

tu vois?

stephi
Stéph utilisateur d'acces est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 18h51   #4
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 847
Points : 16 847
Envoyer un message via Skype™ à bbil
Si tu "connais" RechercheV tu ne devrais pas avoir de problème, inspire toi de cette formule en mettre en colonne D :

Code :
=RECHERCHEV(C2;Feuil2!$A$1:$B$14;2;0)
avec "Feuil2!$A$1:$B$14" ton onglet 2 et ces 2 colonnes ID/nom Formation.




PS : écrit tes mots en entier .. pas de SMS !
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 19h51   #5
Membre du Club
 
Inscription : août 2004
Messages : 386
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 386
Points : 68
Points : 68
merci à vous c est une possiblité mais tu vois j exporte chaque jour ma base mysql dans excel.

la liste de mes formations est fixe elle mais ce que j exporte ce sont les demandes de formations via le site web.
donc de que j aimerai c est que directement la colonne où j ai les ID FORMATION PRENNENT LES NOM DES FORMATIONS DIRECTEMENT;et pas rajouter une colonne.


merci

stephi
Stéph utilisateur d'acces est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 19h58   #6
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
Par défaut Convertir un n° ID de formation du client avec le nom de la formation en Excel VBA

Bonjour Stephi

Ouvrir Excel avec une copie de votre classeur pour test.
Ouvrir le Visual Basic Editeur (VBE) par l'Excel menu "Outils" > "Macro" > "Visual Basic Editeur" (Alt+F11)

Cliquez sur le VBE menu "Insérer" > "Module".
Dans la fenêtre d'Edition de Module1, copier-coller :

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
Option Explicit ' Convertir un n° ID de formation du client avec le nom de la formation
' ============================ Description de l'onglet 1 "Client" feuille CIBLE
Public Const nameSheetClient = "onglet 1"           ' Changez ce nom de feuille si nécessaire
Public Const rowClientFirst = 2                     ' Rangée du premier client
Public Const colClientId = 1                        ' Colonne A : ID du client
Public Const colClientName = colClientId + 1        ' Colonne B : nom du client
Public Const colClientTraining = colClientName + 1  ' Colonne C : ID de la formation
 
' ============================ Description de l'onglet 2 "Formation" feuille SOURCE
Public Const nameSheetTraining = "onglet 2"         ' Changez ce nom de feuille
Public Const rowTrainingFirst = 2                   ' Rangée de la première formation
Public Const colTrainingId = 1                      ' Colonne A : ID de la formation
Public Const colTrainingName = colTrainingId + 1    ' Colonne B du nom de la formation
 
Public collTraining As Collection ' Collection des formations
 
' Convertir un n° ID de formation en son nom
Sub TrainingIdToName()
Dim wkSheetTarget As Worksheet, indRow As Long, rowClientLast As Long
Dim strIdTraining As Variant, strTrainingName As String
 
    If Not TrainingRead() Then Exit Sub
    Set wkSheetTarget = ThisWorkbook.Worksheets(nameSheetClient)
    If Err.Number <> 0 Then Warning "1000: Impossible de trouver la feuille cible " & nameSheetClient: Exit Sub
    On Error GoTo 0
 
    Application.ScreenUpdating = False
    With wkSheetTarget
        rowClientLast = .Cells(Columns(colClientId).Rows.Count, colClientId).End(xlUp).Row
        For indRow = rowClientFirst To rowClientLast ' Lecture des clients
            On Error Resume Next
            strIdTraining = CStr(.Cells(indRow, colClientTraining)) ' ID de formation
            If strIdTraining = vbNullString Then
                Warning "2000: Le n° ID de formation ne peut pas être vide en ligne " & indRow: Exit Sub
            End If
            strTrainingName = TrainingNameFromId(strIdTraining) ' Nom de la formation
            If strTrainingName <> vbNullString Then ' Si la formation existe
                .Cells(indRow, colClientTraining) = strTrainingName
            End If
        Next
    End With
    Application.ScreenUpdating = True
End Sub
 
' Lire les formations
Function TrainingRead() As Boolean
Dim wkSheetSource As Worksheet, indRow As Long, rowTrainingLast As Long
Dim varIdTraining As Variant
 
    TrainingRead = False
    On Error Resume Next
    Set wkSheetSource = ThisWorkbook.Worksheets(nameSheetTraining)
    If Err.Number <> 0 Then
        Warning "3000: Impossible de trouver la feuille source " & nameSheetTraining: Exit Function
    End If
    TrainingCleanCollection ' Libère les précédentes formations de la collection
    Set collTraining = New Collection ' Crée une nouvelle collection de formations
    With wkSheetSource
        ' Dernier ID de formation
        rowTrainingLast = .Cells(Columns(colTrainingId).Rows.Count, colTrainingId).End(xlUp).Row
        On Error Resume Next
        For indRow = rowTrainingFirst To rowTrainingLast ' Lecture des formations
            ' Ajoute la formation : Nom de formation avec la clé ID de formation
            varIdTraining = CStr(.Cells(indRow, colTrainingId))
            If varIdTraining = vbNullString Then
                Warning "4000: Le n° ID de la formation est vide ligne n° " & indRow: Exit Function
            End If
            collTraining.Add .Cells(indRow, colTrainingName), key:=varIdTraining
            If Err.Number <> 0 Then Warning "5000: La formation de n° " & varIdTraining & _
                " est redéfinie ligne n° " & indRow: Exit Function
        Next
        On Error GoTo 0
    End With
    TrainingRead = True
End Function
 
' Recherche le nom d'une formation par son n°
Function TrainingNameFromId(ByVal strTrainingId As Variant) As String
 
    TrainingNameFromId = vbNullString
    If collTraining Is Nothing Then Exit Function
    On Error Resume Next
    TrainingNameFromId = collTraining(CStr(strTrainingId))
    If Err.Number <> 0 Then TrainingNameFromId = vbNullString
    On Error GoTo 0
End Function
 
' Libère la collection des formations
Sub TrainingCleanCollection()
    While collTraining.Count > 1
        collTraining.Remove 1
    Wend
    Set collTraining = Nothing
End Sub
 
' Common error management
Sub Warning(ByVal strMsg As String)
Const lenErr = 4 ' Number of digits of the error code beginning the message
    If Err.Number <> 0 Then
        strMsg = strMsg + vbCrLf + "Error " + Str(Err.Number) + ": " + Err.Description
    End If
    MsgBox Mid(strMsg, lenErr + 3), vbExclamation, "Control warning " + Left(strMsg, lenErr)
End Sub
Vous reconnaîtrez la description de votre feuille client dans l'onglet 1 et votre feuille formation dans l'onglet 2.
En ligne 3 et 10, adaptez les noms de feuilles par défaut nommées "onglet 1" et "onglet 2" ci-dessus en rouge dans les constantes.

Comment utiliser la maquette TrainingIdToName() ?

Utilisez une copie de votre classeur pour test.

Le jeu de test sur la feuille des formations dans le second onglet, comprend de A1 à B3 :

ID	formation
5	droit
6	économie
Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE (Visual Basic Editeur) d'Excel, copier-coller et valider par ENTER :
True

Les formations ont été correctement lues. Les ID de formation peuvent être numériques ou alphanumériques mais doivent être uniques sinon on aura l'erreur 5000.

Code :
? TrainingNameFromId(5)
droit

Code :
? TrainingNameFromId(6)
économie

Le jeu de test sur la feuille des clients dans le premier onglet, comprend de A1 à C5 :
ID	nomclient	ID formation
10	martin		5
11	lebon		6
12	client3		5
13	client4		5
Allez dans votre feuille Client dans le premier onglet.
Optionnellement, dupliquez la colonne C des ID formation pour référence si vous voulez relancer la procédure de conversion des ID plus d'une fois car la substitution se fait dans la même colonne. Les n° d'ID seront donc remplacés définitivement par le nom de la formation associée.

Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE d'Excel, copier-coller et valider par ENTER ou lancer directement la macro par le menu classique d'Excel "Outils" > "Macro".

Le résultat obtenu sur la feuille des clients est :
ID	nomclient	ID formation
10	martin		droit
11	lebon		économie
12	client3		droit
13	client4		droit
Dans la fenêtre d'Exécution immédiate, optionnellement, on peut libérer la collection des formations par :
Code :
TrainingCleanCollection
Ce programme peut être un point de départ si vous avez à faire des traitements automatiques de plus en plus élaborés.
On notera en début de module la description des feuilles cible et source.

L'appel de TrainingRead() étant inclu dans TrainingIdToName(), cette première étape dans la session de la fenêtre d'Exécution immédiate était optionnelle.
Elle a été proposée pour montrer le fonctionnement du module.

Le point d'entrée principal est TrainingIdToName().
___________

Si la discussion est résolue, vous pouvez cliquer sur le bouton

En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 05h52   #7
Membre du Club
 
Inscription : août 2004
Messages : 386
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 386
Points : 68
Points : 68
Bonjour et merci MattChess

je vais tester ton code et je reviens.

merci encore pour ton effort .

à bientôt

stephi
Stéph utilisateur d'acces est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h32.


 
 
 
 
Partenaires

Hébergement Web