Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 VBA COPIER COLLER SOUS CONDITION

BENAM69

XLDnaute Occasionnel
Bonjour à tous,

Je suis novice en VBA, je cherche à automatiser une recherche, selon les conditions, il va copier coller les informations dont j'ai besoin sur un autre onglet.

Je vous remercie par avance pour votre aide et en espérant que j'arriverai à m'apporter une solution à mon problème.

Voici l'explication :
Sur le premier onglet :
Sur la plage définie [D5:O15]
SI sur la colonne D "Opérateur 1"/ Première ligne n°5 il détecte le chiffre 1 (cela signifie que l'opérateur 1 va devoir aller en formation) ALORS il va sur colonne B "Activite" pour voir de quelle activité il s'agit suivant la ligne en question. Une fois qu'il a détecté cela, il va aller sur le deuxième onglet pour faire un copié collé des informations suivantes selon la cellule dédiée.
J'aurai donc comme information sur le deuxieme onglet:
A3 : Opérateur 1
B3 : Production "Récupère en cellule B3 dans le premier onglet"
C3 : Coulée "Récupère sur la colonne B le nom de l'activité"
D3 : 20.11.2018 "Récupère la date de formation sur la colonne E du premier onglet"
E3 : 20.01.2019 "Additionne la durée de formation avec la date de formation, il vérifiera si c'est en mois ou en semaine ou en jour pour ajouter correctement la durée"
F3 : 20.03.2019 "Ajoute la prochaine date de formation, c'est à dire la date de fin + la durée du Tournus que l'on trouve en colonne R du premier onglet ( il vérifiera si la période est en mois, en semaine ou en jour sur la colonne S)

Une fois terminée, il répète la même chose sauf qu'il comparera les informations de la première boucle avant de copié collé sur l'autre onglet :
Sur le premier onglet, il détecte le deuxième chiffre 1 (ligne 6) sur la colonne B " Opérateur 1", si les informations Colonne B : "Activite" / Colonne P : "Durée de formation" / Colonne Q : "Périodes" / Colonne E : "Date de formation" sont identiques au premier copié collé alors il ne fait rien. Si une des informations est différentes alors il copie colle de la même manière.

A chaque fois, il vérifie les informations de ce qu'il a collé pour éviter d'avoir un doublon sur le deuxième onglet.

Une fois qu'il a terminé avec l'opérateur 1, il fait de même avec l'opérateur 2 et ainsi de suite. Je précise la plage des opérations de la macro vérifient les informations a partir de la plage [B3:S15]

En tout cas, je remercie grandement les personnes qui m'aideront à résoudre mon problème.

Je vous mets en pièce jointe le fichier en question pour mieux comprendre

Bien à vous
 

Pièces jointes

  • Test de formation.xlsx
    10.7 KB · Affichages: 35
Dernière édition:

Johan

XLDnaute Occasionnel
Salut,


Je t'ai fait un début de code, mais j'ai pas le temps de finir, me manque les calculs de date et finir la comparaison entre la boucle précédente


Code:
Sub CopierColler()

Dim lastLine As Long
lastLine = ActiveWorkbook.Sheets("Formation").Range("A3").End(xlUp).Row + 1

ActiveWorkbook.Sheets("Formation").Range("A3:F3" & lastLine).ClearContents


For Each cell In Range("D5:I15")

    If cell = 1 Then
        If cell = 1 And ActiveWorkbook.Sheets("Formation").Range("C" & lastLine).Offset(-1, -0) = Cells(cell.Row, 2) Then
        'MsgBox True
        GoTo NextCell
        End If
            ActiveWorkbook.Sheets("Formation").Range("A" & lastLine) = Cells(4, cell.Column)
            ActiveWorkbook.Sheets("Formation").Range("B" & lastLine) = Cells(3, 2)
            ActiveWorkbook.Sheets("Formation").Range("C" & lastLine) = Cells(cell.Row, 2)
            ActiveWorkbook.Sheets("Formation").Range("D" & lastLine) = Cells(cell.Row, 12)
            ActiveWorkbook.Sheets("Formation").Range("E" & lastLine) = ""
            ActiveWorkbook.Sheets("Formation").Range("F" & lastLine) = ""
            lastLine = lastLine + 1
       
    End If
NextCell:
Next cell


End Sub


J'y rejette un oeil demain si t'as tjs des problèmes ou si personne n'est passé entre temps

Good luck
 

BENAM69

XLDnaute Occasionnel
Salut Johan,

Je te remercie beaucoup pour ton début de code ^^ je vais le tester dans un premier temps et ajouter ce que je peux.
Si je peux avoir le reste du code pour résoudre mon problème ca ne serait pas de refus hihi mais en tout cas c'est un début ^^

encore merci pour le temps que consacré

a+
 

BENAM69

XLDnaute Occasionnel
Bonjour,
Je voulais savoir si c'est possible de faire exactement la même chose avec un léger changement que j'ai ajouté ? En effet, au lieu d'avoir une seule colonne "Date de Formation", j'ai copié et déplacé la colonne "Date de formation" a côté de chaque colonne "Opérateur". En effet, chaque opérateur n'aura pas la même date de formation.

Je voulais savoir aussi, une fois qu'il a terminé avec le tableau Production, peut-on faire en sorte qu'il passe sur le tableau Qualité pour faire exactement la même chose, et sur le deuxième onglet, il copie colle à la suite sans écraser les données pris sur le tableau Production ?

Je vous remercie pour votre aide et du temps que vous consacrerez pour résoudre mon problème

Je vous ai remis le fichier avec l'ajout du tableau Qualité et le copie collé des colonnes "Dates de formation" sur le même premier onglet.
J'ai aussi modifié les informations de ma première demande en termes d'identification de cellule
Je vous remercie encore une fois pour votre aide ^^

Bien à vous
 

Pièces jointes

  • Test de formation.xlsx
    12 KB · Affichages: 33
Dernière édition:

Johan

XLDnaute Occasionnel
Bonjour,

oui c'est possible, mais ca va pas être pratique vu que l'information "Opérateur " est répétée sur la ligne 4 et 19 et qu'il va falloir aller la récupérer en fonction du tableau. J'aurais préféré un seul tableau.

Autre point qui me paraît un peu "casse-gueule" c'est cette histoire de périodes :


Si j'ai bien compris, je récupère ma date de formation (exemple 20/11) et je dois ensuite regarder si la durée (exemple "2") est en jour, mois ou semaine pour faire le bon calcul ? Donc soit 20/11 + 2 jours, 20/11 + 2 semaines ou 20/11 +2 mois. Pourquoi ne pas tout mettre en jours directement ?? On aurait juste à faire +2, +15 ou +60


Merci
 
Dernière édition:

BENAM69

XLDnaute Occasionnel
Bonjour Johan,

Et bien du coup, est-ce que ce format te conviendrait pour résoudre plus facilement le besoin ?

Du coup, je pense que tu as raison, on va tout faire en jour sans prendre en compte si c'est en semaine, en mois.
Je pense que cela évitera le problème

En tout cas, un grand merci à toi si tu réussi à faire tout cela ^^, tu n'imagines même pas à quel point cela va m'aider sur l'avancement de mon projet

bien à vous
 

Pièces jointes

  • Test de formation.xlsx
    12 KB · Affichages: 25
Dernière édition:

BENAM69

XLDnaute Occasionnel
Salut Johan,

Je ne sais que dire de ton programme, simplement GRANDIOSE et PARFAIT !!!!!!!!!!!!!

Le programme que tu as réalisé répond à mon besoin hihihi ^^

Ce programme peut-il être adapté sur un autre fichier ? C'est a dire si la structure de ce fichier est identique à mon autre fichier excepté qu'il y a un onglet en plus avant, comme suit :

Fichier que tu as programmé :
Onglet Taches Formation - Onglet Formation

Autre fichier :
Onglet Processus - Onglet Taches Formation - Onglet Formation

Sinon, MERCI BEAUCOUP !!!!! Tu es un génie !!!!

Je te souhaite tout le bonheur du monde
A+
 

Johan

XLDnaute Occasionnel
Re,

Content pour toi C'est facile pour moi quand le besoin est aussi clair et aussi bien expliqué, comme tu l'as fait.

Pour ta question oui le code s'adaptera à un autre fichier tant que les 2 onglets que j'ai utilisé gardent exactement le même nom
Je sais pas qui aura accès en écriture dessus mais faudra faire gaffe à pas ajouter/supprimer de colonnes ou insérer de lignes au milieu de ces tableaux, ca risque de décaler toutes mes opérations.

Cela dit, le code est facilement compréhensible et modifiable en fonction des évolutions que tu feras sur ton fichier

Merci, A+
 

BENAM69

XLDnaute Occasionnel
Re,

Oui je ferai attention à ce que les gens qui l'utiliseront n'ajoute pas de colonne ou lignes en plus. ^^

Je crois que le nom des onglets seront changés. Mais j'essaierai d'adapter sur ta macro le nom de mes onglets. A moins que cela ne marche pas ...

En tout cas j'essaierai de me débrouiller si cela ne fonctionne pas. Pourrais-je à nouveau te demander au autre coup de pouce ?

En tout cas je te remercie encore une fois pour le temps que tu as pu consacré a mon problème hihi !!

A+
 

BENAM69

XLDnaute Occasionnel
Bonjour,

L'adaptation du code en fonction de mon autre fichier ne fonctionne pas.
J'ai trituré dans tous les sens mais rien à faire.
J'ai copié le code et coller sur un autre fichier puis je l'ai adapté suivant les cellules et le titre des onglets mais la macro ne réagit pas.
Savez-vous ce que je dois faire ?

Je vous mets le fichier avec le code à l'intérieur (Nom de la macro CopierColler)
Rappel de ce que la macro doit faire.

Sur la plage définie [D7:Y10]
SI sur la colonne D "Niveau"/ Première ligne n°7 il détecte le chiffre 1 (cela signifie que l'opérateur 1 va devoir aller en formation) ALORS il va sur colonne B "Activite" pour voir de quelle activité il s'agit suivant la ligne en question. Une fois qu'il a détecté cela, il va aller sur le deuxième onglet pour faire un copié collé des informations suivantes selon la cellule dédiée.
J'aurai donc comme information sur le deuxieme onglet:
A3 : 1 (Numéro de programme sur la colonne C de l'onglet 1)
B3 : NVA (Initial de l'opérateur)
C3 : FONDERIE "Récupère en cellule B5 dans le premier onglet"
D3 : Transfert matière "Récupère sur la colonne B le nom de l'activité"
E3 : 20.10.2018 "Récupère la date de formation sur la colonne E du premier onglet"
F3 : 27.10.2018 "Additionne la durée de formation avec la date de formation"
G3 : 16.11.2018 "Ajoute la prochaine date de formation, c'est à dire la date de fin + la durée du Tournus que l'on trouve en colonne AB du premier onglet

Une fois terminée, il répète la même chose puis il passe au deuxième opérateur "CBO" jusqu'au dernier "TDE"

Après, la macro devrait être adaptable avec le deuxième tableau, il faudrait que je puisse faire un copier coller du code et adapter en fonction de la plage définie.

Merci de votre aide
 

Pièces jointes

  • Polycomptence.xlsm
    28.5 KB · Affichages: 28

Johan

XLDnaute Occasionnel
Salut,

A priori juste un décalage de cellules, la structure de ce tableau est différente de l'autre fichier.


Toujours d'actualité cette idée de comparer avant de recopier ?

Johan
 

BENAM69

XLDnaute Occasionnel
Salut,

A priori juste un décalage de cellules, la structure de ce tableau est différente de l'autre fichier.



Toujours d'actualité cette idée de comparer avant de recopier ?

Johan

Et bien étant donné que j'ai mis des numéros de programme de formation, il n' y a plus lieu de comparer comme la dernière fois ^^.

La structure à changer parce qu'on m'a demandé de faire plus simple niveau visuel.
 

Johan

XLDnaute Occasionnel
Le code sans la comparaison

Code:
Sub CopierColler()

Dim lastLine As Long
lastLine = ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("A3").End(xlUp).Row + 1

ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("A3:G3" & lastLine).ClearContents

'FONDERIE
For Each cell_TableauFonderie In Range("D7:D10, F7:F10, H7:H10, J7:J10, L7:L10, N7:N10, P7:P10, R7:R10, T7:T10, V7:V10, X7:X10")
   
    If cell_TableauFonderie = 1 Then
    ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("A" & lastLine) = Cells(cell_TableauFonderie.Row, 3) 'PROGRAMME DE FORMATION
    ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("B" & lastLine) = Cells(5, cell_TableauFonderie.Column + 1) 'OPERATEUR
    ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("C" & lastLine) = Cells(5, 2) 'SECTEUR
    ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("D" & lastLine) = Cells(cell_TableauFonderie.Row, 2) 'ACTIVITE
    ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("E" & lastLine) = cell_TableauFonderie.Offset(0, 1) 'DATE DE FORMATION
    ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("F" & lastLine) = cell_TableauFonderie.Offset(0, 1) + Cells(cell_TableauFonderie.Row, 26) 'DATE DE FORMATION + DUREE DE FORMATION
    ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("G" & lastLine) = cell_TableauFonderie.Offset(0, 1) + Cells(cell_TableauFonderie.Row, 26) + Cells(cell_TableauFonderie.Row, 28) 'DATE DE FIN + TOURNUS
    lastLine = lastLine + 1
    End If
  
Next cell_TableauFonderie

'LAMINAGE
For Each cell_TableauLaminage In Range("D48:D50, F48:F50, H48:H50, J48:J50, L48:L50, N48:N50, P48:P50, R48:R50, T48:T50, V48:V50, X48:X50")
   
    If cell_TableauLaminage = 1 Then
    ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("A" & lastLine) = Cells(cell_TableauLaminage.Row, 3) 'PROGRAMME DE FORMATION
    ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("B" & lastLine) = Cells(5, cell_TableauLaminage.Column + 1) 'OPERATEUR
    ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("C" & lastLine) = Cells(5, 2) 'SECTEUR
    ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("D" & lastLine) = Cells(cell_TableauLaminage.Row, 2) 'ACTIVITE
    ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("E" & lastLine) = cell_TableauLaminage.Offset(0, 1) 'DATE DE FORMATION
    ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("F" & lastLine) = cell_TableauLaminage.Offset(0, 1) + Cells(cell_TableauLaminage.Row, 26) 'DATE DE FORMATION + DUREE DE FORMATION
    ActiveWorkbook.Sheets("SUIVI DE FORMATION").Range("G" & lastLine) = cell_TableauLaminage.Offset(0, 1) + Cells(cell_TableauLaminage.Row, 26) + Cells(cell_TableauLaminage.Row, 28) 'DATE DE FIN + TOURNUS
    lastLine = lastLine + 1
    End If

Next cell_TableauLaminage

End Sub
 

Discussions similaires

Réponses
11
Affichages
544
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…