Bonsoir,
Tout nouveau sur ce forum, je me permets de vous exposer mon problème, car je pense que vous pourrez y trouver une solution.
Je cherche, à partir d’un fichier Excel, à générer automatiquement des courriers sous Word, qui peuvent être différents selon les cas (macros variant selon les résultats d'une liste déroulante).
En allant voir dans différents forums, j’ai réussi à créer les macros qui génèrent les courriers, j’ai mis des signets … Tout fonctionne parfaitement.
Seulement, je cherche depuis plusieurs jours à résoudre plusieurs problèmes qui empêchent mon projet d’aboutir. Je suis loin d’être un pro des macros. Ceci explique donc cela !
1°) La 1ère partie de code (de Private Sub Worksheet_Change(ByVal Target As Range) à End Sub) fonctionne parfaitement. Tant que la colonne N n’est pas atteinte, il ne se passe rien.
En revanche, la macro Vérification_Complétude fonctionne très bien, mais ne se lance pas automatiquement.
Pourriez-vous me dire comment faire pour que, quand l’utilisateur met « Oui » dans la colonne AE (colonne 31), la macro se déclenche ? Je sais qu’on ne peut pas mettre plusieurs Private Sub Worksheet_Change, mais je ne sais pas comment faire autrement.
2°) Dans la même macro, j’ai une msgbox qui indique les colonnes qui doivent être imprimées. Comme il y en a beaucoup, je voudrais que l’utilisateur sache quelles colonnes sont vides. Je complète ma msgbox comme ceci : "Or, vous n'avez pas rempli la/les colonne(s) :". Mais, je ne sais pas comment dire « si telle case est vide, mets le titre de la colonne ». J’ai essayé avec des « if », à l’intérieur de la msgbox, mais ça ne fonctionne pas. Cela peut se répéter jusqu’à 13 fois, en fonction du non remplissage des colonnes.
Là aussi, comment pourrais-je faire ?
3°) Enfin, je voudrais que la macro d’édition de courrier se lance à chaque fin de ligne, quand l’utilisateur a fini de remplir les informations. Pour l’instant, quelle que soit la ligne, seules les données de la ligne 4 sont imprimées. Forcément, puisque c’est ce que je lui demande ! Mais, je ne sais pas comment faire autrement ? Il faut aussi que je modifie la macro VérificationComplétude et la Private Sub Worksheet_Change(ByVal Target As Range). Mais, comment faire ? Peut-être une boucle ?
Mon Code est le suivant :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 14 Then Exit Sub
If [N4] <> "" And [O4] <> "" Then
Dim Rep As Integer
Rep = MsgBox("Vous avez saisi le n° d'identifiant suivant" & vbLf & [N4] & "." & vbLf & "Cela a généré la clé" & vbLf & [O4] & "." & vbLf & "Confirmez-vous ces informations ?", vbOKCancel + vbQuestion)
If Rep = vbOK Then Exit Sub
If Rep = vbCancel Then Range("N4").ClearContents
End If
End Sub
Sub VérificationComplétude()
If [AE4] = “Oui” And [A4] = "" Or [C4] = "" Or [D4] = "" Or [E4] = "" Or [G4] = "" Or [H4] = "" Or [J4] = "" Or [K4] = "" Or [P4] = "" Or [R4] = "" Or [Y4] = "" Or [Z4] = "" Or [AA4] = "" Then
Dim Rep As Integer
Rep = MsgBox("Attention, " & [AA4] & " !" & vbLf & "Pour que le courrier soit imprimé, il faut que les colonnes suivantes soient renseignées : " & vbLf & "- 1°) " & [$A$3] & "," & vbLf & "- 2°) " & [$C$3] & "," & vbLf & "- 3°) " & [$D$3] & "," & vbLf & "- 4°) " & [$E$3] & "," & vbLf & "- 5°) " & [$G$3] & "," & vbLf & "- 6°) " & [$H$3] & "," & vbLf & "- 7°) " & [$J$3] & "," & vbLf & "- 8°) " & [$K$3] & "," & vbLf & "- 9°) " & [$P$3] & "," & vbLf & "- 10°) " & [$Q$3] & "," & vbLf & "- 11°) " & [Y3] & "," & vbLf & "- 12°) " & [Z3] & "," & vbLf & "- 13°) Départ de l'impression." & vbLf & "Or, vous n'avez pas rempli la/les colonne(s) :", vbOKOnly + vbExclamation)
Else
DemandeInstruction
End If
End Sub
‘Lancement de la macro
Sub LancementMacro()
If [R4] = "Macro1" Then Macro1
If [R4] = "Macro2" Then Macro2
…
End Sub
Pour chacune de ces macros, j’ai répété le même code. Exemple :
Sub Macro1()
'Déclaration des variables
Dim wApp As Word.Application
Dim oDoc As Word.Document
'Affectation des données aux variables
Set wApp = New Word.Application
Set oDoc = wApp.Documents.Add("G:\...\Macro1.doc")
'Affectation des données Excel aux signets
oDoc.Bookmarks("Type1").Range.Text = ActiveWorkbook.ActiveSheet.Range("C4")
oDoc.Bookmarks("Localisation").Range.Text = ActiveWorkbook.ActiveSheet.Range("D4")
oDoc.Bookmarks("Adresse").Range.Text = ActiveWorkbook.ActiveSheet.Range("E4")
oDoc.Bookmarks("Complément").Range.Text = ActiveWorkbook.ActiveSheet.Range("F4")
oDoc.Bookmarks("CP").Range.Text = ActiveWorkbook.ActiveSheet.Range("G4")
oDoc.Bookmarks("Ville").Range.Text = ActiveWorkbook.ActiveSheet.Range("H4")
oDoc.Bookmarks("Traité_par").Range.Text = ActiveWorkbook.ActiveSheet.Range("Z4")
oDoc.Bookmarks("Type2").Range.Text = ActiveWorkbook.ActiveSheet.Range("P4")
oDoc.Bookmarks("Prénom").Range.Text = ActiveWorkbook.ActiveSheet.Range("K4")
oDoc.Bookmarks("Nom").Range.Text = ActiveWorkbook.ActiveSheet.Range("J4")
oDoc.Bookmarks("Date_étab").Range.Text = ActiveWorkbook.ActiveSheet.Range("A4")
oDoc.Bookmarks("Interv").Range.Text = ActiveWorkbook.ActiveSheet.Range("AA4")
oDoc.Bookmarks("Ref").Range.Text = ActiveWorkbook.ActiveSheet.Range("Y4")
'Rendre Word Visible
wApp.Visible = True
'Impression du document
oDoc.PrintOut
' Fermeture du document
wApp.ActiveDocument.Close (False)
' Fermeture de Word
wApp.Quit
End Sub
Je vous remercie beaucoup pour l’aide que vous pourrez m’apporter, car je patauge vraiment !! Je préfèrerais ne pas vous transmettre le fichier, car il contient des données confidentielles. Mais, si besoin, je vous le transfèrerai en les enlevant.
Je m’excuse par avance si les questions que je soulève ont déjà été traitées.
Bonne soirée.
Tout nouveau sur ce forum, je me permets de vous exposer mon problème, car je pense que vous pourrez y trouver une solution.
Je cherche, à partir d’un fichier Excel, à générer automatiquement des courriers sous Word, qui peuvent être différents selon les cas (macros variant selon les résultats d'une liste déroulante).
En allant voir dans différents forums, j’ai réussi à créer les macros qui génèrent les courriers, j’ai mis des signets … Tout fonctionne parfaitement.
Seulement, je cherche depuis plusieurs jours à résoudre plusieurs problèmes qui empêchent mon projet d’aboutir. Je suis loin d’être un pro des macros. Ceci explique donc cela !
1°) La 1ère partie de code (de Private Sub Worksheet_Change(ByVal Target As Range) à End Sub) fonctionne parfaitement. Tant que la colonne N n’est pas atteinte, il ne se passe rien.
En revanche, la macro Vérification_Complétude fonctionne très bien, mais ne se lance pas automatiquement.
Pourriez-vous me dire comment faire pour que, quand l’utilisateur met « Oui » dans la colonne AE (colonne 31), la macro se déclenche ? Je sais qu’on ne peut pas mettre plusieurs Private Sub Worksheet_Change, mais je ne sais pas comment faire autrement.
2°) Dans la même macro, j’ai une msgbox qui indique les colonnes qui doivent être imprimées. Comme il y en a beaucoup, je voudrais que l’utilisateur sache quelles colonnes sont vides. Je complète ma msgbox comme ceci : "Or, vous n'avez pas rempli la/les colonne(s) :". Mais, je ne sais pas comment dire « si telle case est vide, mets le titre de la colonne ». J’ai essayé avec des « if », à l’intérieur de la msgbox, mais ça ne fonctionne pas. Cela peut se répéter jusqu’à 13 fois, en fonction du non remplissage des colonnes.
Là aussi, comment pourrais-je faire ?
3°) Enfin, je voudrais que la macro d’édition de courrier se lance à chaque fin de ligne, quand l’utilisateur a fini de remplir les informations. Pour l’instant, quelle que soit la ligne, seules les données de la ligne 4 sont imprimées. Forcément, puisque c’est ce que je lui demande ! Mais, je ne sais pas comment faire autrement ? Il faut aussi que je modifie la macro VérificationComplétude et la Private Sub Worksheet_Change(ByVal Target As Range). Mais, comment faire ? Peut-être une boucle ?
Mon Code est le suivant :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 14 Then Exit Sub
If [N4] <> "" And [O4] <> "" Then
Dim Rep As Integer
Rep = MsgBox("Vous avez saisi le n° d'identifiant suivant" & vbLf & [N4] & "." & vbLf & "Cela a généré la clé" & vbLf & [O4] & "." & vbLf & "Confirmez-vous ces informations ?", vbOKCancel + vbQuestion)
If Rep = vbOK Then Exit Sub
If Rep = vbCancel Then Range("N4").ClearContents
End If
End Sub
Sub VérificationComplétude()
If [AE4] = “Oui” And [A4] = "" Or [C4] = "" Or [D4] = "" Or [E4] = "" Or [G4] = "" Or [H4] = "" Or [J4] = "" Or [K4] = "" Or [P4] = "" Or [R4] = "" Or [Y4] = "" Or [Z4] = "" Or [AA4] = "" Then
Dim Rep As Integer
Rep = MsgBox("Attention, " & [AA4] & " !" & vbLf & "Pour que le courrier soit imprimé, il faut que les colonnes suivantes soient renseignées : " & vbLf & "- 1°) " & [$A$3] & "," & vbLf & "- 2°) " & [$C$3] & "," & vbLf & "- 3°) " & [$D$3] & "," & vbLf & "- 4°) " & [$E$3] & "," & vbLf & "- 5°) " & [$G$3] & "," & vbLf & "- 6°) " & [$H$3] & "," & vbLf & "- 7°) " & [$J$3] & "," & vbLf & "- 8°) " & [$K$3] & "," & vbLf & "- 9°) " & [$P$3] & "," & vbLf & "- 10°) " & [$Q$3] & "," & vbLf & "- 11°) " & [Y3] & "," & vbLf & "- 12°) " & [Z3] & "," & vbLf & "- 13°) Départ de l'impression." & vbLf & "Or, vous n'avez pas rempli la/les colonne(s) :", vbOKOnly + vbExclamation)
Else
DemandeInstruction
End If
End Sub
‘Lancement de la macro
Sub LancementMacro()
If [R4] = "Macro1" Then Macro1
If [R4] = "Macro2" Then Macro2
…
End Sub
Pour chacune de ces macros, j’ai répété le même code. Exemple :
Sub Macro1()
'Déclaration des variables
Dim wApp As Word.Application
Dim oDoc As Word.Document
'Affectation des données aux variables
Set wApp = New Word.Application
Set oDoc = wApp.Documents.Add("G:\...\Macro1.doc")
'Affectation des données Excel aux signets
oDoc.Bookmarks("Type1").Range.Text = ActiveWorkbook.ActiveSheet.Range("C4")
oDoc.Bookmarks("Localisation").Range.Text = ActiveWorkbook.ActiveSheet.Range("D4")
oDoc.Bookmarks("Adresse").Range.Text = ActiveWorkbook.ActiveSheet.Range("E4")
oDoc.Bookmarks("Complément").Range.Text = ActiveWorkbook.ActiveSheet.Range("F4")
oDoc.Bookmarks("CP").Range.Text = ActiveWorkbook.ActiveSheet.Range("G4")
oDoc.Bookmarks("Ville").Range.Text = ActiveWorkbook.ActiveSheet.Range("H4")
oDoc.Bookmarks("Traité_par").Range.Text = ActiveWorkbook.ActiveSheet.Range("Z4")
oDoc.Bookmarks("Type2").Range.Text = ActiveWorkbook.ActiveSheet.Range("P4")
oDoc.Bookmarks("Prénom").Range.Text = ActiveWorkbook.ActiveSheet.Range("K4")
oDoc.Bookmarks("Nom").Range.Text = ActiveWorkbook.ActiveSheet.Range("J4")
oDoc.Bookmarks("Date_étab").Range.Text = ActiveWorkbook.ActiveSheet.Range("A4")
oDoc.Bookmarks("Interv").Range.Text = ActiveWorkbook.ActiveSheet.Range("AA4")
oDoc.Bookmarks("Ref").Range.Text = ActiveWorkbook.ActiveSheet.Range("Y4")
'Rendre Word Visible
wApp.Visible = True
'Impression du document
oDoc.PrintOut
' Fermeture du document
wApp.ActiveDocument.Close (False)
' Fermeture de Word
wApp.Quit
End Sub
Je vous remercie beaucoup pour l’aide que vous pourrez m’apporter, car je patauge vraiment !! Je préfèrerais ne pas vous transmettre le fichier, car il contient des données confidentielles. Mais, si besoin, je vous le transfèrerai en les enlevant.
Je m’excuse par avance si les questions que je soulève ont déjà été traitées.
Bonne soirée.