"publipostage" excel vers excel

lulu502

XLDnaute Nouveau
Bonjour,

Je me permets de vous solliciter car j'ai beau chercher sur le forum, essayer de faire des macros et autres, je n'y arrive pas.

J'ai 2 fichiers, ma base de données (nom de propriétaire, prénom, adresse, et autres informations) et un document type.
Je souhaiterais que les informations pour chaque propriétaire de ma base de données viennent s'intégrer dans mon document type.
Ensuite, je souhaiterais créer un bouton qui permet d'ouvrir un nouveau fichier excel, avec par onglet le document concernant chaque propriétaire.

je mets à votre disposition les pièces jointes.

J'espere que quelqu'un pourra m'aider.

Merci d'avance
 

Pièces jointes

  • base de données.xls
    33 KB · Affichages: 423
  • document type.xls
    27.5 KB · Affichages: 430
  • base de données.xls
    33 KB · Affichages: 435
  • base de données.xls
    33 KB · Affichages: 431

Gurgeh

XLDnaute Occasionnel
Re : "publipostage" excel vers excel

Salut lulu502,

Est-il important pour toi que le document final soit sous Excel ?

Parce que sous Word, il y a une fonction "publipostage" qui est faite exactement pour cela, et ce sera beaucoup plus simple...

Gurgeh
 

lulu502

XLDnaute Nouveau
Re : "publipostage" excel vers excel

en fait c'est pour un collègue de boulot mais du coup, je viens de négocier pour le faire sur word !! ça m'aide beaucoup car je sais comment faire.

Ceci dit si quelqu'un peut quand meme m'aider à trouver la solution sur Excel, ça me permettrait de savoir pour une prochaine fois !!!
 
C

Compte Supprimé 979

Guest
Re : "publipostage" excel vers excel

Bonjour Lulu502, bonjour à tous

Voici un code qui peux te permettre de faire ça sur Excel,
bien que le publipostage sur word est nettement préférable ;)
VB:
Sub PublipostageSurExcel()
  Dim sPath As String, sFicBdD As String
  Dim ShtD As Worksheet
  Dim DLig As Long, Lig As Long
  ' Définir le chemin d'accès et le nom du fichier de données
  ' Avec ce code, les 2 fichiers doivent être au même endroit
  sPath = ThisWorkbook.Path & "\"
  ' sPath = "C:\" ' Chemin en dur
  sFicBdD = "base de données.xls"
  ' Ouvrir le classeur de données
  Workbooks.Open sPath & sFicBdD
  ' Définir l'objet feuille de données
  Set ShtD = ActiveWorkbook.Sheets("données")
  ' Trouver la dernière ligne du tableau
  DLig = ShtD.Range("A" & Rows.Count).End(xlUp).Row
  ' Activer ce classeur
  ThisWorkbook.Activate
  ' Lancer le travail
  With ThisWorkbook.Sheets("Type")
    ' Pour chaque ligne du tableau de donnée
    For Lig = 2 To DLig
      ' Inscrire les valeurs contenues dans le tableau
      ' Le point devant range indique que l'on travaille avec l'objet compris dans With
      .Range("B9") = ShtD.Range("G" & Lig)
      .Range("B11") = ShtD.Range("H" & Lig)
      .Range("B13") = "M. DUPONT" ' pas de colonne définit pour ce champ
      .Range("B9") = ShtD.Range("K" & Lig)
      ' Etc ...
      ' On lance l'impression
      .PrintOut
    Next Lig
  End With
  ' On peut ferme le classeur des données
  Workbooks("base de données.xls").Close SaveChanges:=False
End Sub

A+
 

lumiexcel

XLDnaute Nouveau
Re : "publipostage" excel vers excel

Bonjour,
Je suis très intéressée par cette possibilité, mais comme je débute juste dans les macro, j'aimerais avoir des précisions :

1/ Est-ce que la macro est faite dans le document à remplir ou dans le document de données?
(hrem, si la réponse est "dans le document à remplir" j'ai plein de question complémentaire sur à quoi se réfère "Activeworkbook" après)

2/ dans le code suivant, nous sommes d'accord qu'il s'agit de la plage de données complète, pas seulement la ligne qui m’intéresse pour le développement de la première macro ?
2bis/ (sur le format A12:N250 ?)
VB:
' Définir l'objet feuille de données
 Set ShtD = ActiveWorkbook.Sheets("données")

3/ dans la formule suivante, mon A est correct (va bien chercher la dernière ligne où A est remplit) si mon range est A12:N250 ?
VB:
' Trouver la dernière ligne du tableau
 DLig = ShtD.Range("A" & Rows.Count).End(xlUp).Row

4/ que signifie le "Type" dans :
VB:
With ThisWorkbook.Sheets("Type")
    ' Pour chaque ligne du tableau de donnée

5 / Please help (#perdue) :
5.1 comment gère t'on le document source/bdd et le document "fils/à remplir" ? (c'est le .range, c'est ça? je pense que ça reste toujours embrouillée avec cette idée que je ne sais pas sur lequel des classeur est ma macro et comme j'intègre les lien avec la bdd ? en dur ? j'imagine que non le plus possible...)

5.2 'Lig' c'est pour récuperer des infos sur une ligne ??

VB:
With ThisWorkbook.Sheets("Type")
    ' Pour chaque ligne du tableau de donnée
   For Lig = 2 To DLig
      ' Inscrire les valeurs contenues dans le tableau
     ' Le point devant range indique que l'on travaille avec l'objet compris dans With
     .Range("B9") = ShtD.Range("G" & Lig)
      .Range("B11") = ShtD.Range("H" & Lig)
      .Range("B13") = "M. DUPONT" ' pas de colonne définit pour ce champ
     .Range("B9") = ShtD.Range("K" & Lig)
      ' Etc ...
     ' On lance l'impression
     .PrintOut
    Next Lig
  End With


Question subsidiaire :
Est-ce qu'il y a moyen de modifier le code pour qu'il ne génère que la dernière ligne ou la ligne sélectionnée ?

Bon, je m'arrête là pour le moment ;-)

Autres précisions, je suis assez noob dans excel et n'ai jamais fait de macro, donc désolé si je pose des questions bêtes
sinon j'avoue, ce ne doit pas être facile de travailler sans fichier exemple, mais je n'ai pas trop le temps de "maquiller" mes fichiers, et les règles de confidentialité sont toujours importantes... même si un fichier vide...donc si vraiment nécessaire je verrai mais j'ai essayée de me concentrer sur le code plutôt que sur mon fichier, pour simplifier
 
Dernière édition:

fjio

XLDnaute Nouveau
Bonjour
je me permet de remonter ce pot si je souhaite générer des fichiers Excel en lieu et place d'imprimer comment je fais ?
je souhaiterai avoir les fichiers de publipostage individualisés comme sur word
j'ai regardé les alternatives a printout en vain , je vous remercie infiniment si vous trouvez une solution : )
j'ai mis print preview pour éviter de faire bugger l'imprimante
J
VB:
Sub publi()
  Dim sPath As String, sFicBdD As String
  Dim ShtD As Worksheet
  Dim DLig As Long, Lig As Long
  ' Définir le chemin d'accès et le nom du fichier de données
  ' Avec ce code, les 2 fichiers doivent être au même endroit
  sPath = ThisWorkbook.Path & "\"
  ' sPath = "C:\" ' Chemin en dur
  sFicBdD = "2022_Transferts Directions_Suivi.xlsx"
  ' Ouvrir le classeur de données
  Workbooks.Open sPath & sFicBdD
  ' Définir l'objet feuille de données
  Set ShtD = ActiveWorkbook.Sheets("Suivi Transfert")
  ' Trouver la dernière ligne du tableau
  DLig = ShtD.Range("A" & Rows.Count).End(xlUp).Row
  ' Activer ce classeur
  ThisWorkbook.Activate
  ' Lancer le travail
  With ThisWorkbook.Sheets("AP-AE")
    ' Pour chaque ligne du tableau de donnée
    For Lig = 2 To DLig
      ' Inscrire les valeurs contenues dans le tableau
      ' Le point devant range indique que l'on travaille avec l'objet compris dans With
      .Range("A6") = ShtD.Range("I" & Lig)
      .Range("B6") = ShtD.Range("J" & Lig)
      .Range("G6") = ShtD.Range("N" & Lig)
      .Range("A22") = ShtD.Range("F" & Lig)
      .Range("C22") = ShtD.Range("E" & Lig)
      .Range("B23") = ShtD.Range("B" & Lig)
      .Range("D23") = ShtD.Range("A" & Lig)
      .Range("C24") = ShtD.Range("C" & Lig)
      .Range("I20") = ShtD.Range("N" & Lig)
      ' Etc ...
      ' On lance l'impression a changer  pour generer
      .PrintPreview
    Next Lig
  End With
  ' On peut ferme le classeur des données
  Workbooks("base de données.xls").Close SaveChanges:=False

End Sub
 
Dernière édition:
C

Compte Supprimé 979

Guest
Bonjour fjio

Permettez moi de vous dire que vous vous y prenez doublement mal :rolleyes:

1) remonter un sujet de 2014, franchement à ne pas faire, on créé un nouveau post et on site celui-ci à la rigueur.

2) vouloir créer des fichiers Excel individuels pour un publipostage avec Word est une aberration :eek:
d'où vous vient cette idée saugrenue 🤔
 

fjio

XLDnaute Nouveau
Bonjour en réalité c'est pas vraiment du publipostage mais le même principe .
J'ai un tableau a 5 colonnes vierge et je voudrais qu'il utilise chaque ligne de la base de données.
J'aimerais que ça crée des fichiers excel individuel avec date + numéro incrémenté
 

fjio

XLDnaute Nouveau
Bonjour Ci joint les fichiers :)
Le fichier de base de données Transfert
et la fiche TC qui reçoit les données ligne par ligne ou j'aimerai a chaque fois un fichier excel avec les deux feuilles présents à chaque fois dans les nouveaux documents générés

J'ai essayé save as en vain
 

Pièces jointes

  • Fiche TC_AE_CP.xls
    86 KB · Affichages: 7
  • 2022_Transferts Directions_Suivi.xlsx
    22.1 KB · Affichages: 6
Dernière édition:

Sequoyah

XLDnaute Nouveau
Bonjour fjio et le Forum,
voici ma proposition, je pense que c’est plus facile et plus rapide à partir d’un seul fichier, ci-dessous le code et en annexe un exemple de fichier.
VB:
Sub test()
'https://excel-downloads.com/threads/publipostage-excel-vers-excel.189427/

    Dim v As Variant
    Dim i As Long, lastRow As Long
    Dim WksSuivi As Worksheet, WksAP As Worksheet, WksCP As Worksheet
   
    Set WksSuivi = ThisWorkbook.Sheets("Suivi Transfert")
    Set WksAP = ThisWorkbook.Sheets("AP-AE")
    Set WksCP = ThisWorkbook.Sheets("CP")
   
    With Application
        .ScreenUpdating = False
        .Calculation = xlManual
        .DisplayAlerts = False
    End With

    lastRow = WksSuivi.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
   
    'Stocker les valeurs dans une variable tableau (Array)
    v = WksSuivi.Range("A1:S" & lastRow).Value
   
    For i = 2 To lastRow
        WksAP.Range("A6").Value = v(i, 9) 'Colonne I
        WksAP.Range("B6").Value = v(i, 10) 'Colonne J
        WksAP.Range("G6").Value = v(i, 14) 'Colonne N
        WksAP.Range("A22") = v(i, 6) 'Colonne F
        WksAP.Range("C22") = v(i, 5) 'Colonne E
        WksAP.Range("B23") = v(i, 2) 'Colonne B
        WksAP.Range("D23") = v(i, 1) 'Colonne A
        WksAP.Range("C24") = v(i, 3) 'Colonne C
        WksAP.Range("I20").Value = v(i, 14) 'Colonne N
       
    Sheets(Array("AP-AE", "CP")).Copy
   
    With ActiveWorkbook
        .SaveAs ThisWorkbook.Path & "\" & "Fiche TC_AE_CP " & Format(i - 1, "00") & ".xlsx", FileFormat:=xlWorkbookDefault
        .Close
    End With
     
    With WksAP
        .Range("A6, B6, G6, A22,  B23, D23, C24, I20").ClearContents
        .Cells(22, 3).MergeArea.ClearContents
    End With
     
    Next i
   
    With Application
        .ScreenUpdating = True
        .Calculation = xlAutomatic
        .DisplayAlerts = True
    End With
   
End Sub
Cordialement
 

Pièces jointes

  • Publipostage Forum 2022.xlsm
    48.3 KB · Affichages: 16

fjio

XLDnaute Nouveau
merci infiniment effectivement je pense que c'est plus simple de faire avec la feuille inclut dans l'active workbook

ça marche sans problème et remplit , j'ai légèrement modifié le code pour que les 2 feuilles soient remplies j'ai du rajouter un 0 dans Format(i - 1, "000") pour éviter 1 bug
Par contre lorsque j'essaie de supprimer le contenu du workbook
With WksAP
.Range("A6, B6, G6, A22, C22, B23, D23, C24, I20, B19, H19, N23, I20").ClearContents
.Cells(22, 3).MergeArea.ClearContents
WksCP
.Range("A7, J7, B7, D7").ClearContents
.Cells(22, 3).MergeArea.ClearContents

j'ai 1 erreur execution 1004 "cette action ne peut pas être appliquée à une cellule fusionée "
j'ai enlevé les fusion de cellule en vain

VB:
Sub test()
Sub test()

    Dim v As Variant
    Dim i As Long, lastRow As Long
    Dim WksSuivi As Worksheet, WksAP As Worksheet, WksCP As Worksheet
   
    Set WksSuivi = ThisWorkbook.Sheets("Suivi Transfert")
    Set WksAP = ThisWorkbook.Sheets("AP-AE")
    Set WksCP = ThisWorkbook.Sheets("CP")
   
    With Application
        .ScreenUpdating = False
        .Calculation = xlManual
        .DisplayAlerts = False
    End With

    lastRow = WksSuivi.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
   
    'Stocker les valeurs dans une variable tableau (Array)
    v = WksSuivi.Range("A1:S" & lastRow).Value
   
    For i = 2 To lastRow
        WksAP.Range("A6").Value = v(i, 9) 'Colonne I Programme
        WksAP.Range("B6").Value = v(i, 10) 'Colonne J AP
        WksAP.Range("G6").Value = v(i, 14) 'Colonne N Montant
        WksAP.Range("A22") = v(i, 6) 'Colonne F BDC
        WksAP.Range("C22") = v(i, 8) 'Colonne E Objet
        WksAP.Range("B23") = v(i, 2) 'Colonne B Direction Origine
        WksAP.Range("D23") = v(i, 1) 'Colonne A direction Transfert
        WksAP.Range("C24") = v(i, 3) 'Colonne C contact transfert
        WksAP.Range("B19") = v(i, 7) 'Colonne C fournisseur
        WksAP.Range("H19") = v(i, 5) 'Colonne C evenement
        WksAP.Range("N23").Value = Format(Now, "mm/dd/yyyy") 'Colonne C date
        WksAP.Range("I20").Value = v(i, 14) 'Colonne N Montant talon
        WksCP.Range("A7").Value = v(i, 9) 'Colonne I Programme
        WksCP.Range("J7").Value = v(i, 14) 'Colonne N Montant
        WksCP.Range("B7").Value = v(i, 12) 'Colonne N LC
        WksCP.Range("D7").Value = v(i, 13) 'Colonne N Montant
       
    Sheets(Array("AP-AE", "CP")).Copy
   
    With ActiveWorkbook
        .SaveAs ThisWorkbook.Path & "\" & "Fiche TC_AE_CP " & Format(i - 1, "000") & ".xlsx", FileFormat:=xlWorkbookDefault
        .Close
    End With
     
    With WksAP
        .Range("A6, B6, G6, A22, C22, B23, D23, C24, I20, B19, H19, N23, I20").ClearContents
        .Cells(22, 3).MergeArea.ClearContents
        WksCP
        .Range("A7, J7, B7, D7").ClearContents
        .Cells(22, 3).MergeArea.ClearContents
               
    End With
     
    Next i
   
    With Application
        .ScreenUpdating = True
        .Calculation = xlAutomatic
        .DisplayAlerts = True
    End With
   
End Sub

je regarde pour faire référence a une ou 2 cellule de la feuille de base pour le nommage mais pour l'instant je ne trouve rien :p
 
Dernière édition:

Discussions similaires

Réponses
10
Affichages
301

Statistiques des forums

Discussions
314 486
Messages
2 110 107
Membres
110 666
dernier inscrit
Yaya123