Microsoft 365 Macro copier/coller

stella69670

XLDnaute Nouveau
bonjour,
Je reçois tous les jours plusieurs bons de commandes (ils sont tous identiques) seulement les quantités à commander et le "site" change.
Ces bons de commande, je les copie/colle dans un fichier de récapitulatif.
J'aimerai me simplifier la tâche et mettre en place une macro qui le fait seul. Mais cette macro n'est pas applicable dès sur tous les bons de commandes (surement car le nom est différent) et j'aimerai que ce soit mis à la suite des lignes.
J'ai besoin uniquement des quantités >0 d'où mon filtre sur la macro
Je vous joints les deux fichiers. Un exemple de bon de commande que je reçois (toujours sous la même forme) et mon fichier récapitulatif regroupant mes données à commander.
Je vous remercie pour votre aide.
https://www.cjoint.com/c/JIEo7yqvUny
 

Pièces jointes

  • Recapitulatif.xlsx
    21.2 KB · Affichages: 26
Solution
@stella69670

Attention : n'utilise pas les 2 fichiers précédents, mais ceux de ce post !

--------------------------------------------------------------------------------------

Ouvre "Réassort Bozel hiver 2019.xlsx" ; tu peux voir que j'ai ajouté :

* une Date de commande en C2 : 20/09/20 (fusion C2@D2)
N° de Commande en H2 : 100046-200920 (fusion H2:I2)
(j'ai mis « @ » au lieu de « : » pour éviter le smiley auto.)


* une Date de livraison en E2 : 08/10/20 (fusion E2:G2)

Note aussi que sur la ligne 4...

soan

XLDnaute Barbatruc
Inactif
J'aurais d'abord dû te demander : avec les 2 fichiers joints dans mon post #12,
ça marche correctement, n'est-ce pas ? peux-tu le confirmer, stp ?

Et c'est bien seulement avec un autre fichier commande que ça a planté,
probablement pour la raison indiquée dans mon post #15.

soan
 

stella69670

XLDnaute Nouveau
Mes classeurs ont tous un onglet DOSSIER RECAP (en théorie), mais là pour le coup en ouvrant un autre classeur cela m'affiche toujours le même code, et pourtant je n'ai que 2 classeurs ouverts, et mon Bon de commande à bien l'onglet DOSSIER RECAP.
Mais je te confirme que ça marche ud feu de dieu avec Bozel c'est fabuleux
 

stella69670

XLDnaute Nouveau
@stella69670

Attention : n'utilise pas les 2 fichiers précédents, mais ceux de ce post !

--------------------------------------------------------------------------------------

Ouvre "Réassort Bozel hiver 2019.xlsx" ; tu peux voir que j'ai ajouté :

* une Date de commande en C2 : 20/09/20 (fusion C2@D2)
N° de Commande en H2 : 100046-200920 (fusion H2:I2)
(j'ai mis « @ » au lieu de « : » pour éviter le smiley auto.)


* une Date de livraison en E2 : 08/10/20 (fusion E2:G2)

Note aussi que sur la ligne 4, il
n'y a plus les petites flèches du filtre
automatique ! tu verras que ma macro s'en passe très bien ! :) alors
c'est inutile de remettre un filtre automatique ! ;)


--------------------------------------------------------------------------------------

Sans refermer le 1er classeur, ouvre "Récapitulatif.xlsm".

Tu peux voir que c'est en bas des deux dernières lignes, et qu'il n'y a rien
sous la 1ère commande du site "BEAULIEU" (t'as trouvé l'Jardin d'Eden ?).

Sans devoir remonter tout en haut pour cliquer sur ton bouton
"Nouvelle commande", fais Ctrl e ➯ tu as bien le résultat voulu
(un clic sur le bouton aurait eu exactement le même effet).

Vérifie bien toutes les données de la plage A62:H91 !

--------------------------------------------------------------------------------------

Comme on est le 02/10/20, tu n'as plus que six jours pour honorer ta
commande du 20/09/20 du site "HUTTOPIA BOZEL EN VANOISE" !

--------------------------------------------------------------------------------------

Fais Ctrl Début ➯ ça remonte tout en haut, en cellule A1

Tu peux voir que j'ai amélioré la présentation de la ligne 1 des en-têtes,
ainsi que la présentation du bouton "Nouvelle commande".

--------------------------------------------------------------------------------------

Plus tard, quand tu voudras ajouter une nouvelle commande, à partir
d'un autre fichier, tu devras fermer "Réassort Bozel hiver 2019.xlsx"
et ouvrir ton autre fichier (peu importe son nom, ma macro saura le
détecter correctement) ; mais ça n'est pas prévu pour marcher avec
plus de 2 classeurs ouverts en même temps : c'est seulement pour
le fichier de la commande + le fichier "Récapitulatif.xlsm"
.

Note aussi que c'est ce classeur "Récapitulatif.xlsm" qui contient
la macro (donc 1 seule fois seulement) ; je veux dire qu'à l'inverse,
il aurait fallu mettre une même macro dans chaque classeur de
commande, ce qui aurait été bien évidemment plus contraignant !
et aussi bien plus encombrant ! (taille de la macro × n fichiers
de commande)


--------------------------------------------------------------------------------------

Comme c'était très compliqué à faire, et que j'ai utilisé, tout comme toi,
l'enregistreur de macro, ça explique que ma macro fait environ 3 800
lignes : tu vas avoir beaucoup de lecture ! :D

Nan, j'plaisante ! :p ma macro fait 31 lignes seulement, et j'espère que
tu ne m'en voudras pas trop pour n'avoir rien gardé de ta belle macro
initiale : j'ai préféré tout refaire à partir de zéro, à ma façon. ;)

Fais Alt F11 pour aller sur Visual Basic, puis pour revenir sur Excel.

--------------------------------------------------------------------------------------

Si tu as besoin d'une adaptation et / ou d'un complément d'infos,
n'hésite pas à demander ; à te lire pour avoir ton avis. :)

--------------------------------------------------------------------------------------

Tu as eu d'la chance : d'habitude j'évite les exos Excel où y'a
plus d'un fichier ! c'est vraiment exceptionnel si j'en fais !

J'dois reconnaître que ton exo était très intéressant à faire,
et qu'il m'a beaucoup plu ; merci d'l'avoir proposé ! :D


soan
Merci beaucoup pour ton aide !!!
 

soan

XLDnaute Barbatruc
Inactif
Merci pour ta confirmation du post #17, pour ta rectification du post #18, et pour
m'avoir cité dans ton post #19 ; par contre, pour ton expression un peu hérétique du
post #17, tu me feras le plaisir de réciter 3 « Ave Maria » avant d'aller dormir ! :p

(comme dans la série "La petite maison dans la prairie", quand une des filles Ingalls
a fait une bêtise et doit faire pénitence)


soan
 
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
Si tu n'as pas bien compris le mot « hérétique » que j'ai employé, sache que ce n'est
pas du tout un terme informatique, lolllll ! :p c'est à propos de ton expression un
peu « sacrilège » : « ça marche du feu de D. » ! (oh la la, j'ai osé le répéter ! :D)

(j'crois qu'ça y'est, là j'suis cuit : j'suis bon pour aller en enfer, ou
tout au moins au purgatoire ! :p tu viendras m'sauver, dis ?)


soan
 
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
@stella69670

J'ai modifié mes 2 posts précédents.

Sérieusement, j'suis bien content qu'ça marche ! surtout que je n'voyais pas bien
pourquoi ça avait planté sur ton PC ; et surtout avec un classeur de commande
qui contient bien une feuille "DOSSIER RECAP" ; il va de soi que si tu utilises la
macro avec un fichier commande qui n'a pas cette feuille "DOSSIER RECAP",
alors la tentative d'accès à cette feuille inexistante causera un plantage ! mais
si tu veux, on peut ajouter du code VBA pour qu'en cas d'absence de cette
feuille, la macro ne plante pas, mais elle ne fera rien, tout simplement.

soan
 

patricktoulon

XLDnaute Barbatruc
bonsoir
et voila je viens foutre le boxon

sur la capture #post 14 je vois
VB:
 For Each wbk In Workbooks
        If wbk.Name = "Récapitualatif.xlsm" Then Exit For
    Next
blablabla
blablabla
ensuite je vois
VB:
   With Workbooks(wbk.Name).Worksheets("DOSSIER RECAP")
alors soit vous êtes chanceux , soit vous êtes chanceux ;) :p :p :p ;)

1° dites moi ou est la gestion d'erreur en cas de non présence de ce classeur :eek::rolleyes:
2° il bien optimiste de compter sur l’arrêt par le exit for pour utiliser wbk par la suite (mais passons)
3° je vois With Workbooks(wbk.Name):eek::oops:o_O au plus simple on fait with wbk

ce fichier Récapitualif.xlsm c'est en quelque sorte une sauvegarde de ce qui est fait sur le classeur exécutant la macro c'est bien ça??
alors pourquoi l'ouvrir et le garder ouvert pour boucler sur les classeurs pour le saisir au vol d'une boucle sans même savoir si il est ouvert

j'ai fait un petit essaie avant d'intervenir pour être sur (j'ai la memoire qui part en bataille des fois)
j'ai donc créé un fichier Récapitualif.xlsm dans le quel j'ai nommé la 1ere feuille "DOSSIER RECAP" et j'ai mis un petit message en B3 (pour l'exemple) et je l'ai enregistré sur mon bureau
jusque là rien de bien compliqué;)

maintenant j ouvre un new classeur et dans un module je plante ce code

VB:
Sub test()
    Set wbk = GetObject("C:\Users\polux\DeskTop\Récapitualatif.xlsm")
    If Not wbk Is Nothing Then
         x = wbk.Worksheets("DOSSIER RECAP").[B3].Value
       'ici tu peux aussi bien lire qu'ecrire dans ce classeur 
 wbk.Close
    End If
    MsgBox x
End Sub
voyons voir ce que me dis le new classeur
demo6.gif


apercu du classeur récapitualatif

;)
Capture.JPG


tout le monde a compris ou je fait pipi par terre ;)
 

soan

XLDnaute Barbatruc
Inactif
Bonsoir Patrick,

Pour ta capture du post #14, désolé, mais tu as mal recopié ! :p ce n'est pas :
Code:
For Each wbk In Workbooks
        If wbk.Name = "Récapitualatif.xlsm" Then Exit For
    Next
mais c'est :
VB:
For Each wbk In Workbooks
  If wbk.Name <> "Récapitulatif.xlsm" Then Exit For
Next wbk
avec le test "différent", pas le test "égal" ! de plus, tu as mis Next tout seul, ce que je ne
fais jamais : je mets toujours après le Next la même variable que celle qui a été utilisée
pour le For, car le temps d'exécution est plus court : VBA n'a pas à rechercher à quelle
variable correspond le Next (cette remarque est d'autant plus valable pour des boucles
imbriquées !)
; aussi, moi j'ai mis : Next wbk ; enfin, tu as mis : "Récapitualatif.xlsm" ;
ton copier / coller marche bizarrement, je crois, car j'ai mis "Récapitulatif.xlsm". :p

--------------------------------------------------------------------------------------------------

A) Pour ton 1° : je n'ai pas mis de gestion d'erreur car j'ai pensé que l'utilisateur prenait
toujours grand soin d'avoir 2 classeurs ouverts à l'écran : le fichier "Récapitulatif", qui est
le fichier de destination pour l'ajout d'une commande ; et un autre fichier, peu importe
son nom, qui est le fichier de la commande, et qui contient la feuille "DOSSIER RECAP".

B) Pour ton 2° : c'est d'ailleurs par rapport à ce que j'ai écrit en A) que ma jolie boucle
For Each wbk In Workbooks fonctionne correctement : ça lit les noms des classeurs, et
comme ça ignore le fichier "Récapitulatif.xlsm", le 1er classeur rencontré qui a un nom
différent
est donc forcément le classeur de la commande, vu qu'j'ai bien précisé que
ma macro marche pour 2 classeurs ouverts en même temps ; pas plus, et pas moins
non plus ; et tu s'ras d'accord avec moi que si un seul classeur est ouvert, l'utilité du job
à faire est tout simplement nulle et sans objet !


C) Pour ton 3° : tu as entièrement raison ! mea culpa, j'aurais effectivement dû mettre
plus simplement With wbk.Worksheets("DOSSIER RECAP") ; un grand merci pour
l'avoir signalé, et j'espère que si stella revient ici, elle appliquera cette correction.

--------------------------------------------------------------------------------------------------

J'ai pas bien compris c'que t'as écrit ensuite, mais c'est ceci : la macro est dans l'classeur
"Récapitulatif.xlsm" ; son travail est de copier dans ce même classeur, sous les autres
lignes des commandes antérieures, les lignes du classeur de commande en cours (qui
est ouvert à côté, si tu préfères) ; mais pas toutes les lignes : seulement celles qui ont
une quantité > 0 en colonne J "Total nécessaire" ; attention : y'a des #REF! à éviter !
(et j'ai préféré généraliser, en évitant toute valeur d'erreur !)


--------------------------------------------------------------------------------------------------

Je connais pas ton expression « tout le monde a compris ou je fais pipi par terre ? » ;
j'suppose que c'est l'équivalent de « faut qu'j'vous fasse un dessin ? ». ;) alors si
tu tiens vraiment à dessiner par terre en urinant, j'ai rien contre, libre à toi ! :p

Pour cet exo Excel, si tu veux le continuer avec stella, fais donc, je t'en prie ! :)
(mais sois galant avec la jolie demoiselle : ne fais pas pipi devant elle ! :p)

Pour moi, cet exo est fini (et j'y ai déjà passé beaucoup de temps) ; bien sûr,
si stella me demande un complément, je le ferai (si c'est dans mes capacités !).


soan
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re

pour les "next wbk" c'est pas bien grave c'est toujours le next du For

mais
à te lire ,hotte moi d'un doute la macro n'est pas dans le Récapitulatif.xlsm?
si c'est le cas ,il faudra m'expliquer a quoi ça sert tout ce ramdam pour l’attraper
alors que thisworkbook est!!!!! le classeur exécutant la macro qu'il soit celui actif ou pas
set wbk=thisworkbook' point barre ;)
 
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
Pour les Next, fais comme tu veux ; moi, perso, j'préfère toujours indiquer la variable.

Pour wbk, c'est pas le classeur "Récapitulatif.xlsm" ! donc c'est pas ThisWorkbook !
wbk est le 1er classeur rencontré autre que "Récapitulatif.xlsm" (relis le post #24).


soan
 

patricktoulon

XLDnaute Barbatruc
ok donc 2 classeurs ouverts ou plus pour toi le bon c'est le premier qui n'est pas le "récapitulatif"
ben mon ami elle a intérêt a en avoir que deux d'ouverts sinon c'est le crach assuré
pour info les boucles for each object in collection d'object bouclent dans l'ordre de création en l’occurrence ici l'ordre d'ouverture des fichiers

vraiment intérêt a ce qu'il y en ai qu'un ouvert en même temps que le "récapitulatif
a jouer a la roulette russe comme ça
j'aurais fait plus simple
set wbk=workbooks(2) ;) :p :p
mais je le conseillerais pas ni ta boucle d'ailleurs
bref si stella est contente de ce qu'elle a

la question qui aurais du être posée a Stella c'est y a t il un moyen de reconnaître ces fichiers de commande par une partie du nom ou autre ou de déterminer un point commun et pointer dessus si correspondance
 

soan

XLDnaute Barbatruc
Inactif
ben relis les posts précédents ! j'ai bien dit : « que 2 classeurs ouverts en même temps »,
pas plus et pas moins ! donc pour 2 classeurs, c'est OK : ça marchera forcément !


donc c'est NI le crash assuré, NI la roulette russe !

si tu veux continuer cet exo, fais-le avec stella ! ;)

soan
 

patricktoulon

XLDnaute Barbatruc
puré je viens de revoir un peu tout le post
ce qui est indiqué ici pour éviter toute méprise c'est un dialog ouvrant le fichier commande a analyser et récupérer les données

comme ca elle n'a pas besoins de l'ouvrir manuellement par l'explorer
elle ouvre par le dialog et il peut y en avoir 36 d'ouverts y a pas photo on peut pas se tromper

exemple

VB:
Sub test()
 Dim fichier, wbk As Workbook
 
  fichier = Application.GetOpenFilename("commande stella (*.xls;*.xlsm;*.xlsx), *.xls;*.xlsm;*.xlsx", 1, "ouvrir un fichier de commande")
    If fichier = False Then Exit Sub
       Set wbk = Workbooks.Open(fichier)

MsgBox wbk.Name
 
' faire l'analyse et la récup des >0 ici

End Sub
 

Discussions similaires

Réponses
13
Affichages
689
Réponses
21
Affichages
947

Membres actuellement en ligne

Statistiques des forums

Discussions
312 294
Messages
2 086 895
Membres
103 404
dernier inscrit
sultan87