Automatiser des tâches répétitives

Le_Goret

XLDnaute Nouveau
Bonjour,

Je suis stagiaire dans une entreprise et on me demande de remplacer au pied levé une personne malade. Tous les matins cette personne ouvre un fichier Excel (toujours au même format) et y effectue les mêmes tâches. Ci-joint la maquette du fichier en question.

Chaque matin:

1) Vérifier que le tableau ne fasse pas plus de 1000 lignes. Aviser si plus de 1000 lignes.

2) Contrôle de la colonne H dans le premier onglet du fichier. Il ne doit y avoir que 5 types de valeurs (P1, P2, P3,P4,P5). Aviser si autres références.

3)Vérifier les dates des colonne J, M et N. Remplacer les cellules contenant la valeur "00/01/1900" par celle de la cellule correspondante de la colonne I (Date Mini).
Si cellule de la colonne M est non vide alors mettre "TA" dans la cellule correspondante de la colonne H "Période" de cette feuille de calcul.

4) Créer un nouvel onglet pour chaque point de vente (à partir de la colonne O). Il peut y avoir plusieurs dizaines de sites. Chaque nouvel onglet reprend les colonnes de A à N. On ajoute la colonne présente dans l'onglet reprenant les informations du site.

Quelqu'un pourrait-il me donner la trame d'une macro qui me permettrait d'automatiser ces tâches? Je me forme tout seul sur VBA ce serait gentil de commenter la macro histoire que je puisse comprendre comment elle marche. N'hésitez pas à me demander si il vous manque des infos ou tout simplement si je n'ai pas été assez clair!!! Merci.

Le_Goret
 

Pièces jointes

  • Automatisation retail.xls
    28.5 KB · Affichages: 174

Dranreb

XLDnaute Barbatruc
Re : Automatiser des tâches répétitives

Bonjour,
Ce n'est qu'un brouillon dans le ThisWorkbook
Code:
Option Explicit

Rem. Chaque matin:
'bon, on va supposer que c'est à chaque ouverture
Private Sub Workbook_Open()
Dim RgT As Range, N As Long, C As Long, FeuiR As Worksheet

Rem. 1) Vérifier que le tableau ne fasse pas plus de 1000 lignes. Aviser si plus de 1000 lignes.
Set RgT = Feuil1.[H8].CurrentRegion
Set RgT = Range(Feuil1.Rows(8), RgT.Rows(RgT.Rows.Count))
If RgT.Rows.Count > 1000 Then MsgBox "Le tableau comporte plus de 1000 ligne", vbInformation, "Ouverture classeur"

Rem. 2) Contrôle de la colonne H dans le premier onglet du fichier. Il ne doit y avoir que 5 types de valeurs (P1, P2, P3,P4,P5). Aviser si autres références.
' Résolu par mise en forme conditionnelle avec formule =ESTERREUR(CHERCHE(H8;"P1•P2•P3•P4•P5"))'

Rem. 3) Vérifier les dates des colonne J, M et N. Remplacer les cellules contenant la valeur "00/01/1900" par celle de la cellule correspondante de la colonne I (Date Mini).
For N = 1 To 3
   C = Choose(N, 10, 13, 14)
   RgT.Columns(250).FormulaR1C1 = "=IF(OR(NOT(ISNUMBER(RC" & C & ")),RC" & C & "=0),RC9,RC" & C & ")"
   RgT.Columns(C).Value = RgT.Columns(250).Value
   Next N
RgT.Columns(250).ClearContents

Rem. Si cellule de la colonne M est non vide alors mettre "TA" dans la cellule correspondante de la colonne H "Période" de cette feuille de calcul.
   ' PAS COMPRIS CAR CONTIENT UNE DATE
   
Rem. 4) Créer un nouvel onglet pour chaque point de vente (à partir de la colonne O).
'       Il peut y avoir plusieurs dizaines de sites. Chaque nouvel onglet reprend les colonnes de A à N.
'       On ajoute la colonne présente dans l'onglet reprenant les informations du site.

For C = 15 To 256
   If RgT(0, C).Value = "" Then Exit For
   Set FeuiR = Worksheets.Add
   FeuiR.Name = RgT(0, C).Value
   Feuil1.Columns(1).Resize(, 14).Copy FeuiR.Columns(1)
   Feuil1.Columns(C).Copy FeuiR.Columns(15)
   Next C
End Sub
 

Le_Goret

XLDnaute Nouveau
Re : Automatiser des tâches répétitives

Par rapport à la remarque 3): Rem. Si cellule de la colonne M est non vide alors mettre "TA" dans la cellule correspondante de la colonne H "Période" de cette feuille de calcul.
' PAS COMPRIS CAR CONTIENT UNE DATE
En fait la colonne M ne contient pas systématiquement de date. Lorsque cette colonne contient une date je voudrais remplacer le numéro de période P1, P2, P3, P4 ou P5 de la cellule correspondante de la colonne H par le cigle "TA".

Si je veux lancer la macro non pas à l'ouverture du fichier mais manuellement via un bouton de commande dison command button 1 je lance la macro ainsi:
Private Sub command button 1()
C'est bien ca?
 

Dranreb

XLDnaute Barbatruc
Re : Automatiser des tâches répétitives

Oui mais ne devait elle pas reprendre la date en col I si elle ne contenait pas de date valide ?
Enfin j'espère que vous trouverez, en combinant mes instruction avec des renseignements de l'aide, comment réécrire ce qui ne va pas.

Vous disposez de deux listes déroulantes au dessus de votre fenêtre de code.
Celle de gauche vous permet de choisir un objet connu de votre module,
celle de droite vous permet d'apporter un modèle correct de procédure évènement pour l'objet choisi.

remarque: le code ne devra plus être écrit dans le ThisWorkbook mais dans le module associé à la feuille contenant le bouton en question.
 
Dernière édition:

Le_Goret

XLDnaute Nouveau
Re : Automatiser des tâches répétitives

Oui la colonne M devait reprendre la date de la colonne I si elle contenait elle-même une date non valide. Et sil est contient une date, valide ou non, il faudrait remplace le contenu des cellules correspondantes de la colonne H par "TA".

Je vous remercie pour votre aide, je vais essayer de faire marcher cette macro en suivant vos conseils.
 

Le_Goret

XLDnaute Nouveau
Re : Automatiser des tâches répétitives

C'est de nouveau moi. Pour ma partie 4 de ma macro j'ai une erreur de "Variable bloc ou variable objet with non définie. C'est au niveau de:
If RgT(0, C).Value = "" Then Exit For
Set FeuiR = Worksheets.Add

Où peut bien se situer le problème?

Cordialement,
Le_Goret
 

Dranreb

XLDnaute Barbatruc
Re : Automatiser des tâches répétitives

Heu... à l'endroit exact où ça plante l'objet spécifié en qualificateur n'est pas défini.
Deroulez en pas à pas, n'hesitez pas à mettre des espions et analysez les valeurs des variables espionnées.
 

Le_Goret

XLDnaute Nouveau
Re : Automatiser des tâches répétitives

Bonjour, c'est de nouveau moi! Ma macro avance petit à petit. Je posais la question suivante: Cette macro doit servir à ranger des données qui seront traitées sous la forme d'un tableau croisé dynamique. Je dois, pour chaque point de vente, sélectionner les données et créer donc un tableau croisé dynamique. Est-il possible d'automatiser la production d'un tableau croisé dynamique? Est-ce que celà doit faire l'objet d'un nouveau post?
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Automatiser des tâches répétitives

Boujour,
Il est naturellement possible de l'automatiser.
1 - Se mettre en enregistrement d'une nouvelle macro, et le créer sous Excel,
2 - Optimiser le code, supprimer les instructions inutiles, les selections, rendre auto adaptatif ce qui doit l'être.
 

Le_Goret

XLDnaute Nouveau
Re : Automatiser des tâches répétitives

Ca y est j'ai trouve, ca marche:
Private Sub CommandButton1_Click()
Dim RgT As String, N As Long, C As Long, FeuiR As Worksheet
For C = 15 To 256
RgT = Cells(6, C).Value
If RgT = "" Then
Exit For
End If
Set FeuiR = Worksheets.Add
FeuiR.Name = RgT
Feuil1.Columns(1).Resize(, 14).Copy FeuiR.Columns(1)
Feuil1.Columns(C).Copy FeuiR.Columns(15)
Next C
End Sub

En fait je définis mon Rgt au début avec RgT = Cells(6, C).Value
Lorsque ma cellule de la ligne 6 devient vide je sors bien de ma boucle for. :D

Merci pour votre aide!!!!!

Je m'attaque à cette question de tableau croisé dynamique. Je vais utiliser la macro commande et l'enregistreur de macro ca n'a pas l'air trop compliqué. Je me permets de vous poster un peti truc le cas échéant...
 

Le_Goret

XLDnaute Nouveau
Re : Automatiser des tâches répétitives

Bonjour, je suis de retour avec cette fameuse macro. J'y ai ajouté la création automatique d'un onglet avec un tableau croisé dynamique. Voilà ce que ca donne:

Private Sub CommandButton1_Click()
Dim RgT As String, N As Long, C As Long, FeuiR As Worksheet
For C = 15 To 256
RgT = Cells(6, C).Value
If RgT = "" Then
Exit For
End If
Set FeuiR = Worksheets.Add
FeuiR.Name = RgT
Feuil1.Columns(1).Resize(, 14).Copy FeuiR.Columns(1)
Feuil1.Columns(C).Copy FeuiR.Columns(15)
Set FeuiR = Worksheets.Add
FeuiR.Name = RgT & " OK"

' Tableaucroisédynamique Macro
Name = "Tableau croisé dynamique" & C
Dest = RgT & "!A3"

PivotCache.CreatePivotTable TableDestination:= _
Dest, TableName:= _
Name, DefaultVersion:=xlPivotTableVersion10
ActiveSheet.PivotTables("Tableau croisé dynamique" & C).AddFields RowFields:= _
Array("Période", "Date Livraison", "RCT")
ActiveSheet.PivotTables("Tableau croisé dynamique" & C).PivotFields("Impl."). _
Orientation = xlDataField
Range("A3").Select
ActiveSheet.PivotTables("Tableau croisé dynamique" & C).PivotSelect "", xlOrigin, _
True
Range("A3").Select
Windows("OK Cdes H11 BNX BQS.xls").Activate
Windows("Automatisation retail 1.xls").Activate
Range("A3").Select
ActiveSheet.PivotTables("Tableau croisé dynamique" & C).PivotFields( _
"Nombre de Impl.").Function = xlSum
Next C
End Sub

Ca bloque à ce niveau là:

PivotCache.CreatePivotTable TableDestination:= _
Dest, TableName:= _

J'essaie de donner la destination de ma macro. Je prends mes informations au niveau de l'onglet crée. VBA ne reconnait pas ce que je lui écris. Quel format adopter? Merci à vous!!!!
 

Dranreb

XLDnaute Barbatruc
Re : Automatiser des tâches répétitives

Bonjour,
je me rappelle avoir initialement déclaré RgT comme Range. Si vous avez besoin d'une variable String, appelez la autrement. À part ça: Dest n'est pas déclaré, est donc variant, et à reçu la chaîne RgT & "!A3"
Ellel ne peut donc être spécifié comme paramètre TableDestination: celui ci doit impérativement être un objet Range.
Consultez l'aide pour CreatePivotTable, elle est très claire.
À+
 

Discussions similaires

Réponses
1
Affichages
446

Statistiques des forums

Discussions
312 344
Messages
2 087 447
Membres
103 546
dernier inscrit
mohamed tano