Macro publipostage avec plage excel nommée

Résolu/Fermé
gbdos Messages postés 59 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 15 janvier 2024 - 21 déc. 2011 à 16:05
gbdos Messages postés 59 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 15 janvier 2024 - 28 déc. 2011 à 11:27
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



A voir également:

1 réponse

gbdos Messages postés 59 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 15 janvier 2024 2
28 déc. 2011 à 11:27
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
0