Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/12/2011, 16h16   #1
Invité de passage
 
Inscription : octobre 2009
Messages : 4
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 4
Points : 1
Points : 1
Par défaut Macro publipostage avec plage excel nommée

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.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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 variables
ACTI = 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
gbdos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2011, 15h16   #2
Membre chevronné
 
Avatar de defluc
 
Architecte
Inscription : mai 2002
Messages : 1 057
Détails du profil
Informations personnelles :
Âge : 62

Informations professionnelles :
Activité : Architecte

Informations forums :
Inscription : mai 2002
Messages : 1 057
Points : 745
Points : 745
essaies en remplaçant
Code :
ActiveSheet.Names("publipost").Delete
par
Code :
 ActiveWorkBook.Names("publipost").Delete
defluc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 14h39   #3
Invité de passage
 
Inscription : octobre 2009
Messages : 4
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 4
Points : 1
Points : 1
Bonjour defluc,

Merci d'avoir répondu.
J'ai testé avec ta réponse et ça fonctionne.

Je t'avoue qu'entre-temps, j'ai eu une autre idée, un peu loufoque, mais qui fonctionne aussi.
Après le traitement de ma macro, (à la fin) je sélectionne ma zone de données pour mon publipostage et je détruis les cellules. Comme ça je suis sûre au prochain lancement de ma macro, la zone prise pour le publipostage n'aura que les données qui viennent de s'y mettrent.

Encore merci pour ta réponse.

Cordialement
gbdos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 17h34   #4
Membre chevronné
 
Avatar de defluc
 
Architecte
Inscription : mai 2002
Messages : 1 057
Détails du profil
Informations personnelles :
Âge : 62

Informations professionnelles :
Activité : Architecte

Informations forums :
Inscription : mai 2002
Messages : 1 057
Points : 745
Points : 745
Content d'avoir pu te rendre service.
Ceci dit, il est plus élégant d'effacer toutes les cellules en une fois en supprimant la plage que d'effacer les cellules une à une.
Et puis, si la plage change de position ou de dimension, le programme reste opérant.

N'oublies pas de marquer le sujet comme résolu.

Bonne année
defluc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h42.


 
 
 
 
Partenaires

Hébergement Web