Automatisation de taches

Résolu
fresid -  
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   -
bonjour,

je suis actuellement en stage de 1ere année et il m'est demandé d'automatiser une tache sous excel, cette tache consiste a entrer plusieurs valeur , très souvent identiques dans plusieurs cellules et colonnes, ils disent qu'ils aimeraient qu'un copier collé puisse completer les colonnes et cellules de manière automatique.
a vrai dire j'ai aucune idée de comment m'y prendre.

merci par avance.

40 réponses

sidyy Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
en selectionnant la cellule F5 par exemple, il devrait etre demandé ce qui veut etre importé dans cette cellule et proposer l'emplacement pour aller chercher...c'est une façon que j'ai eu de comprendre, après je peux me tromper...
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
Que veux tu que je te réponde....???
Reviens quand tu sauras...

En fait, une automatisation, quel que soit le langage de programmation, va répéter ou faire à ta place, une tâche bien précise. Sans plus de précision, je ne peux guère t'aider...

Dis moi, une fois pour toute, ce que tu dois faire.
0
sidyy Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
- chercher dans les colonnes A et B du fichier cible, le contenu des catégories, mais seulement les 2 premières ligne, de la colonne B du fichier source.
- dans la colone F du fichier cible.
mais toutefois, les il doit y avoir une correspondance entre les entités, si c'est par expl "permit" pour abortion dans le fichier source, il doit aller mettre le resultat dans la cellule correspondant a "abortion" dans le fichier cible.

voilà, c'est cela ce que je dois faire.
tks
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
On avance...
Quand tu dis seulement les 2 premières lignes de la colonne B du fichier source, tu veux tout de même parler des cellules B4:B5, B10:B11, B16:B17, B22:B23 etc...?

Je repère, par exemple, en B4 le mot "Abortion". J'enregistre la valeur en B5 ("permit"), je vais chercher, dans le fichier cible, dans les colonnes A et B si je trouve "Abortion", si je le trouve, j'écris "permit" (valeur trouvée en B6) dans la colonne F, en face de Abortion.
OK???
0
sidyy Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
oui mais sauf que "permit" sera la valeur trouvée en b5 plutot.
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
oui oui, pardon faute de frappe.
Bon ben je te propose d'attendre un instant...
Tu peux aller prendre un café si tu aimes.
0
sidyy Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
ok ça marche, mais disons que je vais en prendre deux!
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
peut être même trois... ça risque de durer un peu.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sidyy Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
bon bah d'accord...
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
Alors, voici ma proposition.
Tout d'abord, les classeurs exemples :
Fichier SOURCE
Fichier CIBLE qui est le tien intégralement inchangé....

!!!! Il faudra adapter le nom de la feuille contenant les données du fichier_source, directement dans le code de la macro. C'est indiqué en toutes lettres...!!!!!

Ensuite, l'explication :
La procédure va te faire participer...
Tu va devoir :
1- depuis la feuille contenant les données du fichier source, taper ALT+F8, choisir ExporterActionsParCategories, puis cliquer sur Exécuter.
2- à l'apparition du message "Choix du fichier cible" : CLIQUER SUR OUI!,
3- dans la boite de dialogue suivante, CHERCHER LE FICHIER CIBLE puis CLIQUER SUR OUVRIR,
4- à l'apparition du message "Sélectionner une seule cellule de la colonne ou vous voulez transférer les données", CLIC SUR UNE CELLULE DE LA COLONNE F (UNE SEULE!!!), par exemple F5 du fichier cible. Va alors s'afficher : $F$5,
5- à l'apparition du message "Sélectionner la plage contenant les catégories", SÉLECTIONNE à la souris, la plage A5:B93 du fichier cible
6- puis laisser couler jusqu'au dernier message : "Exportation terminée en XX secondes."

Et le code à placer dans un module standard du classeur source :
Sub ExporterActionsParCategories()
Dim fichier, t
Dim Wbk_Source As Workbook, Wbk_Cible As Workbook
Dim Wsh_Source As Worksheet
Dim Tbl_In(), Tbl_Temp()
Dim Plage As Range, Cel As Range
Dim i As Long, drlig As Long, fin As Long, cpt As Long, Pos As Long
Dim Colonne As String, maVar As String

t = Timer
'********** COLLECTE DES INFOS "Category" & "Action" *************
Set Wbk_Source = ThisWorkbook

'************************************************************************ A ADAPTER
'remplacer Feuil1 par le nom de la feuille contenant les category, actions etc.
Set Wsh_Source = Wbk_Source.Worksheets("Feuil1")
'**********************************************************************************FIN ADAPTATION
With Wsh_Source
    drlig = .Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row
    fin = (drlig - 4) / 6
    cpt = 0
    ReDim Tbl_In(1 To 2, 1 To fin)
    For i = 4 To drlig Step 6
        cpt = cpt + 1
        Tbl_In(1, cpt) = .Range("B" & i).Value
        Tbl_In(2, cpt) = .Range("B" & i + 1).Value
    Next i
End With
'************ FIN COLLECTE ****************************************

'************ OUVERTURE FICHIER CIBLE *****************************
MsgBox "Choix du fichier cible"
fichier = Application.GetOpenFilename
If VarType(fichier) = vbBoolean Then
    MsgBox "Abandon opérateur", vbCritical, "Annulation"
    Exit Sub
End If
Set Wbk_Cible = Workbooks.Open(fichier)
'************* Le fichier cible est ouvert ************************

'********** Choix de la colonne ou transférer les données *********
Set Plage = Application.InputBox("Sélectionner une seule cellule de la colonne ou vous voulez transférer les données", "Column choice", Type:=8)
If Not Plage Is Nothing And Plage.Count = 1 Then
    Colonne = Split(Plage.Address(ColumnAbsolute:=False), "$")(0)
Else
    MsgBox "Abandon opérateur", vbCritical, "Annulation"
    Wbk_Cible.Close
    Exit Sub
End If
'**************** FIN CHOIX COLONNE *******************************

'**************** Restitution des données *************************
Set Plage = Application.InputBox("Sélectionner la plage contenant les catégories", "Category", Type:=8)
If Plage Is Nothing Then
    MsgBox "Abandon opérateur", vbCritical, "Annulation"
    Wbk_Cible.Close
    Exit Sub
Else
    Application.ScreenUpdating = False
    For Each Cel In Plage
        For i = LBound(Tbl_In, 2) To UBound(Tbl_In, 2)
            If Cel.Value Like "*" & "|---" & Tbl_In(1, i) & "*" Then Cells(Cel.Row, Colonne) = Tbl_In(2, i): Exit For
        Next i
    Next Cel
    Application.ScreenUpdating = True
End If
'****************** FIN RESTITUTION ********************************
MsgBox "Exportation terminée en " & Timer - t & " secondes."
End Sub


Cordialement,
Franck P
0
sidyy Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
ok, je vais appliquer tout ça et puis je tiens informé...

tks
0
sidyy Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
la combinaison de touches alt+f8 m'ouvre l'enregistrement de macro...j'utilise excel 2007. j'ai essayé d'autre combinaisons mais aucune ne m'affiche ce qui est précisé...

tks
0
sidyy Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
c bon, je suis distrait..
tkss
0
sidyy Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
j'avais pas compris que cela devais etre fait avc les fichiers que t'as joint
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
C'est bon?
0
sidyy Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
oui, le test fonctionne, je vais prendre le temps de tout adapter et puis je te dit si tout marche comme il faut...

encore merci
0
sidyy
 
bonjour,

merci pijaku, ca marche en effet, meme si maintenant que jai refais pour les autres jai des cases vides, je ne sais pas trop pourquoi encore. j'ai ete malade, c'est pourquoi j'ai pris du temps.

merci
0
sidyy
 
bonjour,

désolé de t'importuner à nouveau, mais il y a un petit détail qui m'échappe,
pourquoi est ce que la sélection de la plage contenant les catégories s'effectue à partir du fichier cible et non du fichier source?

merci
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
Bonjour,

Pas de souci.
Dans le fichier source, les cellules concernées, on sait ou elles sont. Toutes les 6 lignes, colonne B.
Dans le fichier cible, tu m'as dit au départ, ne pas connaitre le nombre de colonnes. Donc on demande à l'utilisateur...
0
sidyy
 
d'accord, et dans le cas ou je voudrais inversé le processur, c'est à dire sélectionner les cellules avant , je veux dire que la première action soit de sélectionner la plage contenant les categories et le reste après...?

vivement merci pour tn aide
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
t'as pas l'impression d'exagérer en changeant tout le temps d'avis.
Moi perso j'arrête.
Vois ça avec quelqu'un d'autre
A+
0
sidyy
 
Désolé,
c'est pas de ma faute, j'ai bien appliqué la solution de départ et elle marche bien, mais ils trouvent que ce serait plus facile si ça deroulais plutot comme je te l'ai dit, ils préfèrent que je le fasse comme cela. c'est pourquoi je suis retourné vers toi.
mais si t'en a marre désolé, merci pour l'aide que tu m'a apporté jusqu'ici

merci
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
De rien.
Le problème c'est qu'un "petit" changement comme celui que tu demandes aujourd'hui nécessite la refonte de toute la macro.
Alors non.
A+
0
sidyy
 
ok. et encore merci.
0
sidyy
 
bonjour,

quelqu'un d'autre pourrait-il m'aider svp?


merci
0
sidyy
 
bonjour,

encore moi, j'èspère que t pas trop contrarié pijaku, mais je reviens vers toi pour un souci avec le code.

en fait a chaque fois qu'il retrouve des mots identiques dans le fichier il ne renvoi pas la valeur excate(l'action qui y correspond).par exemple pour "entertainment" et "entertainment video" ou encore "educational material" et "educational video". j'ai comme l'impression qu'il retourne l'action qui correspond au premier mot...
en espérant que tu veuille bien encore te pencher sur mon cas...
cdlt,
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
Bonjour,

Le problème ...
...
est insoluble.
Dans l'état du fichier, il n'y a pas de solutions.
J'explique.
Tes données sont stockées sous la forme :
|--- entertainment
    |---    entertainment material
etc etc...

Avec des espaces pour certains, d'autres sans etc...
Alors, pour reconnaitre ces données, je suis obligé de :
- ne pas tenir compte de ce qu'il y a avant,
- ne pas tenir compte de ce qu'il y a après,
Donc contraint d'utiliser l'opérateur Like, avec des * comme ceci :
If Cel.Value Like "*" & "|---" & Tbl_In(1, i) & "*" 


Si tu arrives à "assainir" ta base de données, c'est à dire supprimer tous les espaces inutiles d'un côté comme de l'autre, tu pourras remplacer cette partie du code :
For Each Cel In Plage
        For i = LBound(Tbl_In, 2) To UBound(Tbl_In, 2)
            If Cel.Value Like "*" & "|---" & Tbl_In(1, i) & "*" Then Cells(Cel.Row, Colonne) = Tbl_In(2, i): Exit For
        Next i
    Next Cel

Par :
For Each Cel In Plage
        For i = LBound(Tbl_In, 2) To UBound(Tbl_In, 2)
            If Cel.Value = "|---" & Tbl_In(1, i) Then Cells(Cel.Row, Colonne) = Tbl_In(2, i): Exit For
        Next i
    Next Cel

ce qui sera plus propre et plus fonctionnel
0
sidyy
 
d'accord, je vais supprimer les espaces et symboles quelconques avant et apres et je remplacerai la partie du code correspondante par celui-ci.

merci.

bien cdlt,
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
Tant que tu y es, vires les |--- de ta feuille et du code...
For Each Cel In Plage
        For i = LBound(Tbl_In, 2) To UBound(Tbl_In, 2)
            If Cel.Value = Tbl_In(1, i) Then Cells(Cel.Row, Colonne) = Tbl_In(2, i): Exit For
        Next i
    Next Cel
0
sidyy
 
le problème est résolu. merci pour ta patience et ton aide, merci.

bien cdlt,
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
de rien.
A+
0