Macro publipostage avec plage excel nommée
Résolu
gbdos
Messages postés
65
Date d'inscription
Statut
Membre
Dernière intervention
-
gbdos Messages postés 65 Date d'inscription Statut Membre Dernière intervention -
gbdos Messages postés 65 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai réalisé une macro VBA dans Excel pour faire un publipostage sur Word automatiquement.
J'ai 2 problèmes :
1- Ma plage de données se trouve sur la feuille Feuil4 de mon fichier Excel, mais suivant les paramètres que j'inscris avant de lancer mon publipostage, la plage n'a pas la même longueur.
J'ai défini un nom de plage "publipost" et j'ai mis dans ma macro, le nom de la plage pour la fusion, mais ça ne fonctionne pas.
Word me donne une fenêtre "Table" où je dois sélectionner je ne sais pas quoi, mais où de toute façon je ne peux rien sélectionner!!
2- Pour éviter des plages en "double", je voudrai suprimer la plage "publipost" en début de macro, mais il me donne une erreur.
Voici le code de ma macro, quelqu'un peut-il m'aider?
J'ai mis en italique les commentaires et en gras les lignes que je voudrai mettre et qui ne fonctionnent pas.
Merci d'avance de votre aide, ma macro actuelle est nickel par rapport à la façon de faire que l'on avait avant, mais j'aimerai vraiment l'améliorer encore.
Sub etiquette22x144()
'Mise à Zéro des noms de plage
'"ActiveSheet.Unprotect ("etiquette")
'"Sheets("Feuil4").Select
'"ActiveSheet.Names("publipost").Delete
'"Sheets("Feuil1").Select
'"ActiveSheet.Protect ("etiquette")
'Sélection de la feuille de paramètre
Sheets("Feuil1").Select
'Définition des variablesACTI = Range("C5").Value
ZONE = Range("C7").Value
ALLEE1 = Range("C9").Value
ALLEE2 = Range("G9").Value
DEPL1 = Range("C11").Value
DEPL2 = Range("G11").Value
NIV1 = Range("C13").Value
NIV2 = Range("G13").Value
x = Range("L9").Value
y = Range("L11").Value
Z = Range("L13").Value
'Sélection de la feuille de calcul
Sheets("Feuil2").Select
Cells.Select
Selection.ClearContents
Sheets("Feuil3").Select
Rows("1:2").Select
Selection.Copy
Sheets("Feuil2").Select
Rows("1:1").Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Range("A2").Select
For allee = ALLEE1 To ALLEE2 Step x
For depl = DEPL1 To DEPL2 Step y
For niv = NIV1 To NIV2 Step Z
ActiveCell.Value = ACTI
ActiveCell.Offset(, 1).Select
ActiveCell.Value = ZONE
ActiveCell.Offset(, 1).Select
ActiveCell.Value = allee
ActiveCell.Offset(, 1).Select
ActiveCell.Value = depl
ActiveCell.Offset(, 1).Select
ActiveCell.Value = niv
ActiveCell.Offset(1, -4).Select
Next niv
Next depl
Next allee
'Copie des formules pour code128
der = Range("A50000").End(xlUp).Row
Range("F2:O2").Select
Selection.AutoFill Destination:=Range("F2:O" & der)
'Copie du tableau
Sheets("Feuil4").Select
Cells.Select
Selection.ClearContents
Sheets("Feuil2").Select
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Feuil4").Select
Range("A1").Select
ActiveSheet.Paste
'"Dim DerLig As Long, DerCol As String
'" DerLig = Range("A1").End(xlDown).Row
'" Range("A1").End(xlToRight).Select
'" n = ActiveCell.Address
'" DerCol = Right(Left(n, 2), 1)
'" ActiveSheet.Names.Add Name:="publipost", RefersTo:=Range("A1:" & DerCol & DerLig)
'" ActiveSheet.Names("publipost").Comment = ""
Sheets("Feuil1").Select
Range("A1").Select
'Ouverture de Word
Dim WordApp As Word.Application
Dim WordDoc As Word.Document
Set WordApp = CreateObject("Word.Application")
WordApp.Visible = True
' Ouverture de la fenêtre de sélection du fichier pour le publipostage dans le répertoire C:\etiquette2\
Dim dlg As FileDialog
Dim strPath As String
Set dlg = WordApp.FileDialog(msoFileDialogFilePicker)
With dlg
.InitialFileName = "C:\etiquette2\"
.AllowMultiSelect = False
.Title = "ouvrir"
.Show
End With
strPath = dlg.SelectedItems(1)
Set WordDoc = WordApp.Documents.Open(strPath)
' Publipostage à partir des données de la feuil4 du fichier macro etiquette.xlsm situé dans le répertoire C:\etiquette2\
' lignes à remplacer dans le texte ci-dessous pour utiliser la plage "publipost"
' , SQLStatement:="SELECT * FROM 'publipost'", SQLStatement1:="", SubType:= _
' , SQLStatement:="SELECT * FROM 'Feuil4$'", SQLStatement1:="", SubType:= _
ActiveDocument.MailMerge.MainDocumentType = wdMailingLabels
ActiveDocument.MailMerge.OpenDataSource Name:= _
"C:\etiquette2\macro etiquette.xlsm", _
ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
Format:=wdOpenFormatAuto, Connection:= _
"Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=C:\etiquette2\macro etiquette.xlsm;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=" _
, SQLStatement:="SELECT * FROM 'Feuil4$'", SQLStatement1:="", SubType:= _
wdMergeSubTypeAccess
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With
' Fermeture du fichier de base du publipostage
WordDoc.Close False
' Fermeture du fichier Excel (macro etiquette.xlsm) et suppression des fenêtres d'alerte lors de la fermeture
Application.DisplayAlerts = False
Application.CutCopyMode = False
ActiveWorkbook.Close True
End Sub
J'ai réalisé une macro VBA dans Excel pour faire un publipostage sur Word automatiquement.
J'ai 2 problèmes :
1- Ma plage de données se trouve sur la feuille Feuil4 de mon fichier Excel, mais suivant les paramètres que j'inscris avant de lancer mon publipostage, la plage n'a pas la même longueur.
J'ai défini un nom de plage "publipost" et j'ai mis dans ma macro, le nom de la plage pour la fusion, mais ça ne fonctionne pas.
Word me donne une fenêtre "Table" où je dois sélectionner je ne sais pas quoi, mais où de toute façon je ne peux rien sélectionner!!
2- Pour éviter des plages en "double", je voudrai suprimer la plage "publipost" en début de macro, mais il me donne une erreur.
Voici le code de ma macro, quelqu'un peut-il m'aider?
J'ai mis en italique les commentaires et en gras les lignes que je voudrai mettre et qui ne fonctionnent pas.
Merci d'avance de votre aide, ma macro actuelle est nickel par rapport à la façon de faire que l'on avait avant, mais j'aimerai vraiment l'améliorer encore.
Sub etiquette22x144()
'Mise à Zéro des noms de plage
'"ActiveSheet.Unprotect ("etiquette")
'"Sheets("Feuil4").Select
'"ActiveSheet.Names("publipost").Delete
'"Sheets("Feuil1").Select
'"ActiveSheet.Protect ("etiquette")
'Sélection de la feuille de paramètre
Sheets("Feuil1").Select
'Définition des variablesACTI = Range("C5").Value
ZONE = Range("C7").Value
ALLEE1 = Range("C9").Value
ALLEE2 = Range("G9").Value
DEPL1 = Range("C11").Value
DEPL2 = Range("G11").Value
NIV1 = Range("C13").Value
NIV2 = Range("G13").Value
x = Range("L9").Value
y = Range("L11").Value
Z = Range("L13").Value
'Sélection de la feuille de calcul
Sheets("Feuil2").Select
Cells.Select
Selection.ClearContents
Sheets("Feuil3").Select
Rows("1:2").Select
Selection.Copy
Sheets("Feuil2").Select
Rows("1:1").Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Range("A2").Select
For allee = ALLEE1 To ALLEE2 Step x
For depl = DEPL1 To DEPL2 Step y
For niv = NIV1 To NIV2 Step Z
ActiveCell.Value = ACTI
ActiveCell.Offset(, 1).Select
ActiveCell.Value = ZONE
ActiveCell.Offset(, 1).Select
ActiveCell.Value = allee
ActiveCell.Offset(, 1).Select
ActiveCell.Value = depl
ActiveCell.Offset(, 1).Select
ActiveCell.Value = niv
ActiveCell.Offset(1, -4).Select
Next niv
Next depl
Next allee
'Copie des formules pour code128
der = Range("A50000").End(xlUp).Row
Range("F2:O2").Select
Selection.AutoFill Destination:=Range("F2:O" & der)
'Copie du tableau
Sheets("Feuil4").Select
Cells.Select
Selection.ClearContents
Sheets("Feuil2").Select
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Feuil4").Select
Range("A1").Select
ActiveSheet.Paste
'"Dim DerLig As Long, DerCol As String
'" DerLig = Range("A1").End(xlDown).Row
'" Range("A1").End(xlToRight).Select
'" n = ActiveCell.Address
'" DerCol = Right(Left(n, 2), 1)
'" ActiveSheet.Names.Add Name:="publipost", RefersTo:=Range("A1:" & DerCol & DerLig)
'" ActiveSheet.Names("publipost").Comment = ""
Sheets("Feuil1").Select
Range("A1").Select
'Ouverture de Word
Dim WordApp As Word.Application
Dim WordDoc As Word.Document
Set WordApp = CreateObject("Word.Application")
WordApp.Visible = True
' Ouverture de la fenêtre de sélection du fichier pour le publipostage dans le répertoire C:\etiquette2\
Dim dlg As FileDialog
Dim strPath As String
Set dlg = WordApp.FileDialog(msoFileDialogFilePicker)
With dlg
.InitialFileName = "C:\etiquette2\"
.AllowMultiSelect = False
.Title = "ouvrir"
.Show
End With
strPath = dlg.SelectedItems(1)
Set WordDoc = WordApp.Documents.Open(strPath)
' Publipostage à partir des données de la feuil4 du fichier macro etiquette.xlsm situé dans le répertoire C:\etiquette2\
' lignes à remplacer dans le texte ci-dessous pour utiliser la plage "publipost"
' , SQLStatement:="SELECT * FROM 'publipost'", SQLStatement1:="", SubType:= _
' , SQLStatement:="SELECT * FROM 'Feuil4$'", SQLStatement1:="", SubType:= _
ActiveDocument.MailMerge.MainDocumentType = wdMailingLabels
ActiveDocument.MailMerge.OpenDataSource Name:= _
"C:\etiquette2\macro etiquette.xlsm", _
ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
Format:=wdOpenFormatAuto, Connection:= _
"Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=C:\etiquette2\macro etiquette.xlsm;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=" _
, SQLStatement:="SELECT * FROM 'Feuil4$'", SQLStatement1:="", SubType:= _
wdMergeSubTypeAccess
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With
' Fermeture du fichier de base du publipostage
WordDoc.Close False
' Fermeture du fichier Excel (macro etiquette.xlsm) et suppression des fenêtres d'alerte lors de la fermeture
Application.DisplayAlerts = False
Application.CutCopyMode = False
ActiveWorkbook.Close True
End Sub
A voir également:
- Macro publipostage avec plage excel nommée
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Publipostage mail - Accueil - Word
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Déplacer colonne excel - Guide
1 réponse
Bonjour à tous,
En fait j'ai résolu mon problème avec un petit truc sioux !
A la fin de ma macro, je sélectionne la plage des données qui servent au publipostage et je la détruis.
Comme ça à chaque démarrage de la macro, la plage de publipostage est uniquement la zone où des nouvelles valeurs viennent de s'inscrirent.
Cordialement
En fait j'ai résolu mon problème avec un petit truc sioux !
A la fin de ma macro, je sélectionne la plage des données qui servent au publipostage et je la détruis.
Comme ça à chaque démarrage de la macro, la plage de publipostage est uniquement la zone où des nouvelles valeurs viennent de s'inscrirent.
Cordialement