Macro Excel avec incrémentation de lignes

Bonjour,

je suis novice dans le monde des macros.

Je cherche juste à réaliser une macro pour recopier en incrémentant des lignes.

EX: 1 classeur, 2 onglets identiques

Copier le contenu de la 1ère ligne de la feuil1 (qui changera de contenu) et la recopier sur la feuil2 en incrémentant la copie dans la ligne en dessous.

Merci pour votre aide

Bonjour et bienvenue,

Merci de joindre un classeur à ta demande.

Cdlt

Bonjour et

Je cherche juste à réaliser une macro pour recopier en incrémentant des lignes

ça commence souvent par "je veux faire un truc tout simple". Si tu attends une réponse (et j'imagine que c'est la raison qui t'a poussé à poser une question ) il faut que tu donnes des précisions supplémentaires:
  • pourquoi une macro ? Une formule ne conviendrait pas ?
  • dans quel contexte s'inscrit ta demande (de quoi disposes-tu, vers quoi veux-tu aller, etc.) ?
  • qu'est-ce qui va déclencher l'exécution de cette éventuelle macro ?
  • le travail de recopie devra se faire une seule fois ou de manière répétée ?
  • dans ta feuille 1, tu modifieras parfois le contenu ? Tu feras des tris ? tu inséreras ou supprimeras éventuellement des lignes un jour ou l'autre ? Dans ces différents cas de figure, que doit-il advenir du contenu de la feuille 2
  • pour ce qui est de:
    ... c'est certainement clair dans ton esprit, mais pour ceux qui te lisent, il y a certainement des manières très différentes de comprendre

[Edit:] salut Jean-Éric

Bonjour Charly, le forum,

je te propose ce fichier Excel :

33exo-charly65.xlsm (14.35 Ko)

* sur "Feuil2", y'a déjà 4 titres de colonne "T1" à "T4" ; les données seront écrites en dessous, avec ton incrémentation de ligne

* va sur "Feuil1" ; Ctrl e ➯ les données en A1:D1 sont écrites en "Feuil2" ; modifie les données ; fais Ctrl e...

Alt F11 pour voir le code VBA, puis revenir sur Excel

dhany

Bonjour,

Un autre exemple à étudier.

Cdlt.

25charly65.xlsm (24.82 Ko)

Bonjour Charly,

voici tes 2 fichiers :

13produits.xlsm (17.35 Ko)
9suivi.xlsx (9.52 Ko)

* attention : ces 2 fichiers doivent être placés dans le même dossier

* ouvre le 1er fichier "Produits.xlsm" ; ça ouvre automatiquement le 2ème fichier "Suivi.xlsx"

(même si tu ne le vois pas car c'est revenu sur le 1er fichier "Produits.xlsm")

* Ctrl e ➯ copie effectuée dans le 2ème fichier "Suivi.xlsx"

(y'a aucun message de confirmation pour éviter de ralentir la saisie)

* pour la feuille "Produit", tu peux éventuellement choisir d'ajouter dans le code VBA un effacement de A2:C2 juste après la copie ; si je l'ai pas fait, c'est car tu préfères peut-être conserver les infos pour éviter de les retaper si elles sont identiques pour la saisie suivante ; en particulier si c'est la même date

si besoin, tu peux demander une adaptation.

merci de me dire si ça te convient.

dhany

Bonjour Dhany,

Le concept est super.

Juste 2 choses. malgré que j'ai placé les 2 fichiers dans le même dossier, le 2ème fichier ne s'ouvre pas toujours.

(voir pièce jointe), ensuite est-on obligé d'ouvrir le 2ème fichier à chaque fois?

Merci pour ton aide

Charly65

erreur

Bonjour Charly,

la procédure normale est celle-ci : ça ouvre le 2ème fichier que s'il est pas déjà chargé (= présent en mémoire vive) ; c'est seulement lors de l'ouverture du 1er fichier que ça ouvre le 2ème fichier s'il est non présent ; donc après avoir ouvert une 1ère fois le 1er fichier, on est sûr que le 2ème fichier est présent et c'est pas nécessaire d'ouvrir à chaque fois le 2ème fichier ... mais si tu as fermé manuellement le 2ème fichier, c'est à toi de l'ouvrir à nouveau manuellement.

dans ton fichier actuel, le code VBA de ThisWorkbook est celui-ci (je l'ai pas modifié) :

Option Explicit

Private Sub Workbook_Open()
  Dim wd As Workbook: On Error GoTo OpenWd
  If Dir(ThisWorkbook.Path & "\" & wb2) = "" Then
    MsgBox wb2 & " n'existe pas.", 48, "Erreur": Exit Sub
  End If
  Set wd = Workbooks(wb2): Exit Sub 'échec si non ouvert
OpenWd:
  Workbooks.Open wb2: ThisWorkbook.Activate 'open & wb1
End Sub

regarde cette instruction avec ThisWorkbook.Path : If Dir(ThisWorkbook.Path & "\" & wb2) = "" Then

c'est elle qui fait que ça doit marcher si les 2 fichiers sont dans le même dossier.

dhany

ajout : j'ai vu que tu as ajouté une image avec un message d'erreur.

le code VBA de Module1 est celui-ci (non modifié) :

Option Explicit

Public Const wb2$ = "Suivi.xlsx"

Sub CpyLig2()
  Dim lig&: Application.ScreenUpdating = 0
  With Workbooks(wb2).Worksheets("Ref Suivi")
    lig = .Cells(Rows.Count, 1).End(xlUp).Row + 1
    [A2:C2].Copy .Cells(lig, 1)
  End With
  [A2].Select
End Sub

note bien que la constante wb2 est le nom exact de ton 2ème fichier : "Suivi.xlsx"

(wb2 est mon abréviation pour workbook n° 2 = 2ème classeur)

wb2 est une constante publique afin d'être visible également pour Workbook_Open()

dhany

avant ouverture du 1er fichier "Produits.xlsm", que j'ai chargé manuellement ou non le 2ème fichier "Suivi.xlsx", je n'ai jamais ton message d'erreur ; seule condition à respecter : les 2 fichiers doivent être placés dans le même dossier ; si tu as bien fait cela, je ne comprends pas pourquoi tu as ce message d'erreur.

à moins que tu fermes manuellement "Suivi.xlsx" puis que tu utilises "Produits.xlsm" ?


en tout cas, j'suis ravi qu'tu aies trouvé le concept super !

dhany

Désolé, cela ne fonctionne toujours pas.

J'ai créer de nouveaux dossiers, j'ai rtéléchargé les 2 fichiers et toujours le même message d'erreur

Charly65

Sinon, nous sommes nous obligés d'ouvrir le 2ème pour l'enregistrement?

Charly65

ah si ! c'que j'ai fait marche uniquement avec un 2ème classeur ouvert ! et c'est bien pour ça qu'j'ouvre ce 2ème fichier dès l'ouverture, s'il a pas déjà été ouvert manuellement par l'utilisateur (avant l'ouverture du 1er fichier).

dhany

Et éventuellement, dans le même esprit mais sans avoir à ouvrir le 2ème fichier, est-ce réalisable?

Merci

pour lire des infos d'un classeur fermé, c'est possible via une méthode ADO (ActiveX Data Object), mais j'm'y connais pas bien ; pour l'écriture dans un classeur fermé, j'sais pas si c'est possible (même avec ADO).

mais la solution la plus simple est celle-ci : ouvrir le 1er fichier ; si ça fait comme sur mon PC, ça ouvrira forcément le 2ème fichier automatiquement (si non déjà ouvert) ; et si le 2ème fichier n'a pas été ouvert, fais-le manuellement ; d'autre part, si t'as un doute et qu'ça t'ennuie d'vérifier si l'2ème fichier a été ouvert ou non, alors j'te propose de supprimer le code VBA d'ouverture automatique du fichier ; tu devras alors ouvrir manuellement le fichier "Suivi", puis le fichier "Produits".

dans les 2 cas ci-dessus, ne pas fermer le classeur "Suivi" tant qu't'as pas fini d'travailler avec le classeur "Produits" !

dhany

ajout : ah si, l'écriture dans un classeur fermé est possible via ADO.

lien sur le site de Jacques BOISGONTIER (un prestigieux nouveau membre de ce forum ) :

http://boisgontierjacques.free.fr/pages_site/ado.htm#ModifCellule

dhany

[quote="dans ton post de 10:40, tu"]Désolé, cela ne fonctionne toujours pas.

J'ai créé de nouveaux dossiers, ...[/quote]

j'ai pas compris pourquoi tu as utilisé le pluriel « nouveaux dossiers » alors que j'ai bien précisé qu'il faut mettre les 2 fichiers dans le même dossier ! le mêmeun seul dossier, pas plus ! mon code VBA n'a pas été conçu pour 2 dossiers différents.

mais si t'as besoin que "Produits.xlsm" soit dans un dossier et que "Suivi.xlsx" soit dans un autre dossier, dis-moi quel doit être le dossier de "Suivi.xlsx" et je ferai le code VBA adéquat (mais pour un classeur ouvert, pas fermé).

dhany

Bonjour Charly,

lis d'abord mes 3 posts précédents, à partir de celui-ci :

https://forum.excel-pratique.com/viewtopic.php?p=697013#p697013


je te propose cette autre version du fichier "Produits" :

3produits.xlsm (17.18 Ko)

* c'est toujours pour : 1 seul dossier ; les 2 fichiers dans ce même dossier ; écrire dans un classeur ouvert

* la différence est que j'ai supprimé tout le code de ThisWorkbook ➯ lors de l'ouverture du 1er fichier

"Produits.xlsm", ça n'ouvre plus le 2ème fichier "Suivi.xlsx"

* j'ai déplacé tout le code de la sub Workbook_Open() dans la nouvelle sub privée VérifClasseur2(),

et maintenant, c'est la sub CpyLig2() qui appelle VérifClasseur2()

* ainsi, quand tu fais Ctrl e, ça lance CpyLig2(), et pour chaque exécution de cette sub, avant écriture dans

"Suivi.xlsx", ça vérifie s'il est présent ou non, et s'il est absent en RAM, ça le charge ; donc cette fois,

tu es assuré que ça marchera et que tu n'auras plus ton erreur 1004 "Nous ne trouvons pas Suivi.xlsx"

(cela même si quelqu'un a fermé ce 2ème fichier entre-temps)

cette méthode est donc plus sûre, mais je ne l'aime pas du tout, car je trouve que c'est vraiment très lourd de faire une vérif du 2ème fichier avant chaque écriture ! je préfère largement la méthode précédente où la vérif n'est faite qu'à l'ouverture du 1er fichier, et y'a ensuite aucune raison qu'ça marche plus si personne ne ferme le 2ème fichier tant que le 1er est en cours d'utilisation.

merci de me donner ton avis, et si tu préfères utiliser un 2ème dossier pour "Suivi.xlsx", tu dois m'indiquer quel est ce dossier pour pouvoir faire l'adaptation du code VBA ; indique-moi aussi quel est le 1er dossier de "Produits.xlsm" car ça peut aider si le début des 2 chemins est identique ; dans les 2 cas, je parle des chemins complets ; remplace juste ton vrai UserName par ton pseudo Charly : C:\Users\Charly\Documents\...

dhany

Bonjour Dhany,

Malheureusement cela ne fonctionne pas comme prévu, du moins comme chez toi.

J'enregistre les fichiers Source et Destination dans le même Dossier cela ne fonctionne pas chez moi.

J'ai bien lu tes posts précédents et les ai appliqués mais sans succès.

J'ai bien réussi moi même a faire ouvrir le fichier source, enregistrer et refermer à travers une macro et je regrette que ton exemple

ne fonctionne pas sur mon PC.

Merci pour ton aide

Tours la même Erreur 1004 ...

(voir pièce jointe)

capture
Rechercher des sujets similaires à "macro incrementation lignes"