Générer des courriers types word à partir d'excel

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

Super Martial pour ton fichier, merci d'avoir répondu si vite.

Je viens de voir que pour le tri alphabétique c'est ok, j'ai regardé dans la macro pour comprendre, mais dur dur, par contre j'ai l'impression que tout se fait à partir de la feuille "base", mais faut il commencer par cette feuille lorsque je rentre un nouveau stagiaire ?
ou alors est ce que le schéma est le suivant :
1 : je rentre le nouveau bénéficiaire dans la feuille générale "liste participants"
2 : la ligne va d'abord se copier dans la feuille "base"
3 : ensuite se répercute dans la feuille "affectation" en faisant le tri ?

Pour ce qui concerne les croix comme je te l'avais expliqué dans l'un de mes posts précédents, il n'y aura pas de numéro de semaines dans la feuille "affectations" car se sont en général toujours les mêmes personnes pour les mêmes ateliers (ils viennent toutes les semaines), donc le conseiller renseigne par une croix (c'est beaucoup plus simplement. A partir de là je peux vérifier qui devait assister à tel atelier.

J'ai bien l'impression que cette histoire de croix pose soucis, mais on pourrait faire plus simple :
Moi je voudrais juste que dans la feuille "affectation" et "suivi" soient recopiés uniquement les colonnes CT, NOM et Prénom, le reste sera fait manuellement.

D'autre part, j'ai remarqué aussi lors d'un essai dans la feuille "affectation" j'ai rentré une semaine dans la première ligne dans une des colonnes "ateliers", sans rien avoir changé après sur les autres feuilles, lorsque je clique à nouveau sur la feuille "affectation" cette dernière se rafraîchit donc et là je constate que la semaine que j'ai rentrée à disparue.

Voila je te donne encore du fil à retordre, merci pour tous tes efforts, j'apprécie beaucoup o)
 
Dernière édition:

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

Bonjour Martial,

J'ai regardé le premier fichier que tu avais joint aussi et ce dernier n'a pas le problème que j'avais cité plus haut à savoir :

D'autre part, j'ai remarqué aussi lors d'un essai dans la feuille "affectation" j'ai rentré une semaine dans la première ligne dans une des colonnes "ateliers", sans rien avoir changé après sur les autres feuilles, lorsque je clique à nouveau sur la feuille "affectation" cette dernière se rafraîchit donc et là je constate que la semaine que j'ai rentrée à disparue.
Donc je suis en train de travailler dessus, j'essaye de reproduire la recopie des noms et prénoms dans la feuille suivi, c'est long mais j'avance on dirait ;) je te l'enverrais en espérant avoir trouvé la solution.

Bonne journée

Lou
 
Dernière édition:

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

Bonsoir Martial,

Me revoila enfin, difficile en ce moment de trouver un peu de temps.

J'ai quand même pas mal travailler sur le fichier, cela n'a pas été une mince affaire.

J'ai réussi à faire fonctionner la macro pour la feuille "suivi" , j'ai finalement crée toutes les semaines dans la feuille "base" car autrement ce que j'écrivais dans la feuille "suivi" disparaissait.

J'ai crée une nouvelle feuille nommée "typo". Là j'ai vraiment eu du mal pour trouver les bons codes mais j'y suis arrivée mais honnêtement je ne comprends pas comment j'ai fait.

Cela concerne la partie ACTIVATE

Voici celui j'ai mis dans la feuille TYPO :

Code:
Private Sub Worksheet_Activate()
Application.DisplayAlerts = 0: Application.EnableEvents = 0
'A l'activation de la feuille
  'On cherche la dernière ligne pleine pour supprimer les données
  j = [A65536].End(xlUp).Row
  If j > 4 Then Rows("5:" & j).ClearContents
  With Sheets("Base")
  'Pour toutes les lignes de "Base"
  For j = 3 To .[A65536].End(xlUp).Row
    If .Cells(j, 2) <> "" Then
      'On copie les données de Base dans la feuille activée
      i = [A65536].End(xlUp)(5).Row
      Cells(i, 1).Resize(, 5).Value = .Cells(j, 1).Resize(, 5).Value
      Cells(i, 6) = .Cells(j, 21)
      Cells(i, 7).Resize(, 22).Value = .Cells(j, 671).Resize(, 22).Value
  End If
  Next
  End With
Range("A5:AB" & [D65536].End(xlUp).Row).Sort [D5], xlAscending, [E5], , xlAscending, , , xlNo
Application.DisplayAlerts = -1: Application.EnableEvents = -1
End Sub
Au début je n'arrivais pas à recopier les données à partir de la 5ème ligne, ça mettait plus haut donc j'ai changé un peu les chiffres mais je voyais aucune différence.
Cela a fonctionné lorsque j'ai mis 5 au lieu de 2 sur cette ligne
Code:
 i = [A65536].End(xlUp)(5).Row
Alors que dans la feuille "SUIVI" c'est noté "2" et là les données sont pourtant recopiées à partir de la ligne 7.

De meme que j'ai écrit ceci :

Code:
If j > 4 Then Rows("5:" & j).ClearContents
J'avais changé par un 4 (j'ai tout tenté..) et là je viens de tester en remettant un 2 et ça fonctionne toujours ? j'aimerais bien comprendre ce qui change ?

J'avais une autre question, peut on mettre cette feuille TYPO dans un classeur à part ? cela aurait été plus simple car ce tableau doit être envoyé régulièrement pas mail, cela m'éviterrait de devoir à chaque fois masquer les autres feuilles et protéger le classeur .

Je te joins le tableau modifié.

Au plaisir de te lire.

Loulou
 

Fichiers joints

Staple1600

XLDnaute Barbatruc
Re : Générer des courriers types word à partir d'excel

Bonjour à tous

Une suggestion pour ce point:
J'avais une autre question, peut on mettre cette feuille TYPO dans un classeur à part ? cela aurait été plus simple car ce tableau doit être envoyé régulièrement pas mail, cela m'éviterrait de devoir à chaque fois masquer les autres feuilles et protéger le classeur .
Tu pourrais envisager de faire en VBA un export PDF de la feuille contenant le tableau à envoyer par mail.

Ou sinon toujours par VBA tu copies la feuille du tableau (en valeurs seules) et sans son VBA et c'est cette copie que tu envoies par mail (donc pas de feuilles à masquer et pas de protection à appliquer)
 

Staple1600

XLDnaute Barbatruc
Re : Générer des courriers types word à partir d'excel

Re


Voici un exemple de code pour copier une feuille en valeurs seules et sans macros
Code:
Sub CopierFeuilleValSeulesNoVBA()
Dim WbkCopy As Workbook
Sheets("Feuil1").Copy
Set WbkCopy = ActiveWorkbook
With WbkCopy
   With .ActiveSheet
    .UsedRange.Value = .UsedRange.Value
   End With
   Application.DisplayAlerts = False
   .SaveAs "c:\temp\test.xlsx", xlOpenXMLWorkbook
   End With
End Sub
 

Yaloo

XLDnaute Barbatruc
Re : Générer des courriers types word à partir d'excel

Bonsoir Loulou, Staple,

Code:
Private Sub Worksheet_Activate()
Application.DisplayAlerts = 0: Application.EnableEvents = 0
'A l'activation de la feuille
  'On cherche la dernière ligne pleine pour supprimer les données
  j = [A65536].End(xlUp).Row
  If j > 4 Then Rows("5:" & j).ClearContents
  With Sheets("Base")
  'Pour toutes les lignes de "Base"
  For j = 3 To .[A65536].End(xlUp).Row
    If .Cells(j, 2) <> "" Then
      'On copie les données de Base dans la feuille activée
      i = [A65536].End(xlUp)(5).Row
      Cells(i, 1).Resize(, 5).Value = .Cells(j, 1).Resize(, 5).Value
      Cells(i, 6) = .Cells(j, 21)
      Cells(i, 7).Resize(, 22).Value = .Cells(j, 671).Resize(, 22).Value
  End If
  Next
  End With
Range("A5:AB" & [D65536].End(xlUp).Row).Sort [D5], xlAscending, [E5], , xlAscending, , , xlNo
Application.DisplayAlerts = -1: Application.EnableEvents = -1
End Sub
VB:
j = [A65536].End(xlUp).Row
  If j > 4 Then Rows("5:" & j).ClearContents
Ces 2 lignes te permettent de trouver la dernière cellule pleine de la colonne A puis si cette ligne est supérieure à 4 (donc à partir de 5) de supprimer les lignes de 5 jusqu'à la dernière.

Maintenant pour la copie à partir de la ligne 5 :
Comme dans la macro tu demandes de supprimer les lignes au-delà de la ligne 4, ta première ligne vide est la 5

VB:
With Sheets("Base")
  For j = 3 To .[A65536].End(xlUp).Row
    If .Cells(j, 2) <> "" Then
      'On copie les données de Base dans la feuille activée
      i = [A65536].End(xlUp)(5).Row
      Cells(i, 1).Resize(, 5).Value = .Cells(j, 1).Resize(, 5).Value
Pour les lignes dans la feuille Base de 3 jusqu'à la dernière ligne pleine de la colonne A (variable j), si la cellule B de cette ligne n'est pas vide, alors on va copier ....
Mais copier où ? On recherche donc la première cellule vide de la colonne A (variable i)
Si tu mets
i = [A65536].End(xlUp).Row --> dernière cellule pleine de la colonne A
i = [A65536].End(xlUp)(2).Row --> première cellule vide de la colonne A
i = [A65536].End(xlUp)(3).Row --> deuxième cellule vide de la colonne A
i = [A65536].End(xlUp)(4).Row --> troisième cellule vide de la colonne A
i = [A65536].End(xlUp)(5).Row --> quatrième cellule vide de la colonne A

Dans ta macro, les lignes sont copiées à la quatrième cellule vide de la colonne A, mais comme en dernière ligne de ta macro, tu fais un tri, les lignes vides de ta feuille sont supprimées.
Fais un essai en supprimant la ligne de tri ou en mettant ' pour la passer en commentaire.

Tu peux voir l'action de chaque ligne de code en faisant avancer la macro en pas à pas, mets toi sur une ligne en début de macro puis fais F9, la ligne va être surlignée en foncé (avec un point dans la marge) (tu peux aussi directement cliquer dan la lmarge) puis lances la macro (il suffit d'activer ta feuille), la macro va s'arrêter au point d'arrêt, ensuite avances en faisant F8, la ligne est en jaune, si tu réduit ta fenêtre VBE, tu vas voir ce qui se passe dans ton fichier.
Capture.JPG
Tu peux aussi voir les données de tes variables, en cliquant sur "Affichage" (dans la barre de menu) puis "Fenêtre variables locales", une fenêtre s'ouvre, à chaque fois que tu fera F8 pour avancer d'une ligne si une variable prend une valeur, cela sera inscrit dans la fenêtre.

J'avais une autre question, peut on mettre cette feuille TYPO dans un classeur à part ? cela aurait été plus simple car ce tableau doit être envoyé régulièrement pas mail, cela m'éviterrait de devoir à chaque fois masquer les autres feuilles et protéger le classeur .
Comme l'a indiqué Staple, il est possible de créer un nouveau fichier avec seulement la feuille active (soit au format Excel soit en PDF), il est même possible de l'envoyer directement avec une macro dans Excel.

A te relire

Martial
 

Fichiers joints

Dernière édition:

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

Bonsoir Staple, Bonsoir Martial,

Merci à vous deux d'avoir pris le temps pour me répondre et pour tous ces renseignements.

Je vais regarder cela en détail ce week end. Je vais tester les manipulations pour mieux comprendre la logique des codes.

Pour ce qu concerne la possibilité de créer un fichier typo à part, en fait le tableau doit etre anonyme donc je dois masquer les noms et prénoms et aussi faire un tri et enlever les personnes qui sont sorties de l'action. Donc peut etre que ça serait plus simple de passer par une macro vers excel.

Encore merci pour votre aide.

Je vous souhaite une bonne soirée.
 

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

Bonjour Martial, bonjour Staple,

J'ai pu prendre un peu de temps pour suivre toutes vos suggestions.

Staple, j'ai essayé de mettre ton code mais je dois surement mal m'y prendre désolée je découvre au fur et à mesure les fonctionnalités d'excel.

En fait j'ai inséré le code dans la feuille nommée "typo" que je veux recopier comme ceci :

Code:
Sub CopierFeuilleValSeulesNoVBA()
Dim WbkCopy As Workbook
Sheets("typo").Copy
Set WbkCopy = ActiveWorkbook
With WbkCopy
   With .ActiveSheet
    .UsedRange.Value = .UsedRange.Value
   End With
   Application.DisplayAlerts = False
   .SaveAs "c:\lou\typotest.xlsx", xlOpenXMLWorkbook
   End With
End Sub
Mais rien ne se passe, pas de message d'erreur non plus.

J'ai cherché des infos sur le net j'ai lu que certains mettaient le code dans le fichier de destination, est ce que je me suis trompée ?

J'ai testé une autre méthode en suivant le tuto sur un site (je ne sais ps si je peux mettre le lien), c'est la méthode où l'on se positionne sur la feuille en faisant un clic droit "déplacer ou copier" et là on choisi l'autre classeur. C'est pas mal, mais il ne faut pas oublier de cocher "créer une copie" sinon celui de ma feuille source disparaît.

Mais j'avoue que j'aurais préféré une manipulation plus simple.

Martial, j'ai enfin compris mes erreurs !! surtout avec cette explication :

Code:
Pour les lignes dans la feuille Base de 3 jusqu'à la dernière ligne pleine de la colonne A (variable j), si la cellule B de cette ligne n'est pas vide, alors on va copier ....
Mais copier où ? On recherche donc la première cellule vide de la colonne A (variable i)
If .Cells(j, 2) <> "" Then

(j,2) : je pensais que cela correspondait au numéro de la ligne et non de la colonne. Donc en effet c'est plus logique !

Et pour l'histoire de la première cellule vide etc... ça y est j'ai saisi la formule.

J'ai testé avec ta méthode en me mettant dans la macro du code pour voir ce qui se passait, c'est vrai que ça aide bien.

Par contre j'ai pas réussi avec la méthode "Fenêtre variables locales" mais bon l'essentiel c'est qu'à présent ça me semble plus clair.

J'avais aussi une autre question, dans l'un de tes précédents posts tu m'avais conseillée ceci :

Code:
Si rien ne se passe lorsque tu fais des modifs ou lorsque tu actives les feuilles. Tu lances la macro Relance ou tu fais Ctrl + n.
Chez moi ça ne fonctionne pas, lorsque je fais Ctrl+n j'ai un nouveau classeur qui s'ouvre. et je n'ai pas trouvé le bouton "Relance'.

En tout cas un grand merci pour votre aide, c'est vraiment très agréable de trouver des personnes disponibles et volontaires.

Au plaisir de vous lire.

Bonne soirée.
 

Yaloo

XLDnaute Barbatruc
Re : Générer des courriers types word à partir d'excel

Bonsoir Loulou,

Lorsque je disais d'utiliser ctrl + n, c'était uniquement dans mon fichier. Cela permettant de réactiver la gestion des évènements.

Pour lancer la macro de Staple, il te faut un évènement, soit tu crées un Bouton et lorsque tu cliques sur le bouton tu crées un évènement, soit la macro est déclenchée lorsque tu changes de sélection, de valeur dans une cellule, tu double-clic, tu clic-droit etc...

Pour la macro de Staple, toutes les données de la feuille sont copiées dans un nouveau fichier.

Si tu veux modifier certaines données tu peux le faire avant l'enregistrement .SaveAs ....

A+

Martial
 

Staple1600

XLDnaute Barbatruc
Re : Générer des courriers types word à partir d'excel

Bonsoir à tous, Yaloo ;)

loulouange
.../...
En fait j'ai inséré le code dans la feuille nommée "typo" que je veux recopier comme ceci :

Code:
Sub CopierFeuilleValSeulesNoVBA()
Dim WbkCopy As Workbook
Sheets("typo").Copy
Set WbkCopy = ActiveWorkbook
With WbkCopy
   With .ActiveSheet
    .UsedRange.Value = .UsedRange.Value
   End With
   Application.DisplayAlerts = False
   .SaveAs "c:\lou\typotest.xlsx", xlOpenXMLWorkbook
   End With
End Sub
Mais rien ne se passe, pas de message d'erreur non plus.
.../...
Tu as été dans le répertoire C:\lou si il n'y a pas un classeur nommé typotest.xlsx?
NB: Le répertoire C:\lou existe bien sur ton PC?
 

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

bonjour,

Martial, pour la touche CTRL+N désolée je n'avais pas vu que cela concernait ton fichier. Je vais d'ailleurs créer une touche raccourcis pour le mien ça peut être utile.

Staple : oui j'ai bien un répertoire c:\lou seulement j'avais simplement mis le code dans la feuille typo mais je ne savais pas comment la déclencher. Mais là je viens de l'activer via un bouton et là ça fonctionne ! encore merci pour ton aide o)

Mon projet arrive quasiment à sa fin, j'ai à présent un outil de travail vraiment génial qui va me rendre grand service.

Je pourrais encore automatiser les tâches mais je crains que cela ne provoque des conflits, car nous travaillons en réseau, j'espère que cela n'est pas un problème.

En effet, ce qui aurait été vraiment le top, c'est que certaines données soient recopiées à partir d'un autre classeur, mais ce dernier est protégé avec macro et mot de passe donc je ne peux pas intervenir dessus.

Je suis en train d'essayer de le faire à partir du fichier de destination, qui est en fait le fichier sur lequel nous avons travaillé ici à savoir "suivi atelier avec id".

Mon autre fichier que je vais appeler "sources1" est en fait le premier fichier que j'utilise lorsque j'enregistre un nouveau stagiaire. Sur ce fichier il y a des données qui sont reprises dans "suivi ateliers avec id" sur la première feuille.

J'aimerais essayer de trouver par moi meme le code, ça me permettrait de voir si j'ai bien compris les macros.
Je voulais juste savoir si cela est bien réalisable bien que nous soyons en réseau et que le fichier source soit protégé.

Dans l'attente de vous lire.


Bonne journée.
 

Yaloo

XLDnaute Barbatruc
Re : Générer des courriers types word à partir d'excel

Bonsoir Loulou, Staple,

Normalement, même en réseau tu dois pouvoir recueillir les données d'un autre classeur, il faut seulement avec le mot de passe de protection.

A+

Martial
 

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

ok super je vais continuer mes essais et reviendrais pour donner des nouvelles.

bonne soirée.

loulou
 

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

Bonjour Martial, le forum,

Me revoici avec mon fichier qui m'a donnée pas mal de fil à retordre :eek:

J'ai enfin réussi à créer un bouton qui me permettait de rajouter à partir d'un autre fichier la dernière ligne de ce dernier dans le fichier sur lequel nous avons travaillé ensemble.

Au départ je pensais qu'il fallait mettre des variables, comme dans le code que tu avais fait pour la recopie des données de la feuille "Base" vers les autres feuilles, avec "i" et "j" mais je n'y suis pas arrivée.

J'ai fait de cette manière, je ne sais pas si c'est la plus simple mais ça fonctionne !!

Code:
Sub Coller()
Set Source = Workbooks("sources1.xlsm")
Set Destin = ThisWorkbook
i = Destin.Worksheets(1).Range("A65536").End(xlUp).Row + 1
derlig = Source.Sheets(3).[D65536].End(xlUp).Row
Source.Sheets(3).Range("D" & derlig).Rows.Copy _
          Destination:=Destin.Sheets(1).Cells(i, 4)
Source.Sheets(3).Range("E" & derlig).Rows.Copy _
          Destination:=Destin.Sheets(1).Cells(i, 5)
Source.Sheets(3).Range("F" & derlig).Rows.Copy _
          Destination:=Destin.Sheets(1).Cells(i, 11)
Source.Sheets(3).Range("G" & derlig).Rows.Copy _
          Destination:=Destin.Sheets(1).Cells(i, 8)
Source.Sheets(3).Range("N" & derlig).Rows.Copy _
          Destination:=Destin.Sheets(1).Cells(i, 22)
     
    'On trie par rapport au Nom puis Prénom
  Range("A3:AA" & [A65536].End(xlUp).Row).Sort [D3], xlAscending, [E3], , xlAscending, , , xlNo
End Sub
Par contre, j'aurais vu que cela copie les données sans les mises en forme et là je ne sais pas comment faire, je pense qu'il faut utiliser i=j mais voila je n'ai pas trouvé la formule.


J'avais une autre question au niveau des mises en forme conditionnelles qui appliquent une couleur différente selon le choix de la liste déroulante. Existe t'il une astuce permettant de reproduire les mêmes conditions sur les autres feuilles sans devoir tout refaire manuellement ?

Je te remercie par avance de l'aide que tu pourras m'apporter.

Au plaisir de te lire.

Loulou
 

Yaloo

XLDnaute Barbatruc
Re : Générer des courriers types word à partir d'excel

Bonjour Loulou,

Vois comme ça, ça doit le faire.

VB:
Sub Coller()
Set Source = Workbooks("sources1.xlsm")
Set Destin = ThisWorkbook
i = Destin.Worksheets(1).Range("A65536").End(xlUp)(2).Row
  derlig = Source.Sheets(3).[D65536].End(xlUp).Row
  Destin.Sheets(1).Cells(i, 4) = Source.Sheets(3).Range("D" & derlig)
  Destin.Sheets(1).Cells(i, 5) = Source.Sheets(3).Range("E" & derlig)
  Destin.Sheets(1).Cells(i, 11) = Source.Sheets(3).Range("F" & derlig)
  Destin.Sheets(1).Cells(i, 8) = Source.Sheets(3).Range("G" & derlig)
  Destin.Sheets(1).Cells(i, 22) = Source.Sheets(3).Range("N" & derlig)
      
  'On trie par rapport au Nom puis Prénom
  Range("A3:AA" & [A65536].End(xlUp).Row).Sort [D3], xlAscending, [E3], , xlAscending, , , xlNo
End Sub
A+

Martial
 

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

Super Martial quelle rapidité !!

Je vais tester ton code ... je n'étais pas loin lol encore merci pour ton aide.

A +

Loulou
 

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

Bonjour Martial, le forum

J'ai fais plusieurs tests, et pour le code que tu m'as transmis ça fonctionne parfaitement.

Mais il y a toujours un truc qui coince grrrrr on trouve une solution et moi je reviens avec d'autres problèmes désolée je suis vraiment pas douée :(

En fait j'ai crée donc un bouton avec ce code qui recopie la dernière ligne à partir d'un autre fichier. J'en ai fait meme deux puisque il existe deux sources différentes.

J'ai du toutefois enlever le code de tri qui se trouvait à la base dans la feuille "Liste participants" ci-dessous :

VB:
Option Explicit
Dim Id&, i&, j&
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.DisplayAlerts = 0: Application.EnableEvents = 0
i = Target.Row
'Récupération de l'Identifiant de la ligne modifiée
Id = Cells(i, 1)
  'On met en majuscule ou en nom propre les colonnes D, E, F, G et I
  Cells(i, 4) = StrConv(Cells(i, 4), 1)
  Cells(i, 5) = StrConv(Cells(i, 5), 3)
  Cells(i, 6) = StrConv(Cells(i, 6), 3)
  Cells(i, 7) = StrConv(Cells(i, 7), 3)
  Cells(i, 9) = StrConv(Cells(i, 9), 1)
  'On cherche l'Id dans la colonne A de Base
  'Si on le trouve
  If Not IsError(Application.Match(Id, Sheets("Base").Columns(1), 0)) Then
    'On copie les données de la ligne modifiée
    j = Application.Match(Id, Sheets("Base").Columns(1), 0)
    Sheets("Base").Cells(j, 2).Resize(, 22).Value = Cells(i, 2).Resize(, 22).Value
  'Si l'Id n'est pas trouvé
  Else
    'Si la colonne est D (Nom) et l'Id est vide
    If Target.Column = 4 And Cells(i, 1) = "" Then
      With Sheets("Base")
        'Dans la Base on crée un nouvel Identifiant
        j = .[A65536].End(xlUp)(2).Row
        .Cells(j, 1) = .Cells(j - 1, 1) + 1
        'On copie le nouvel Identifiant dans "Général"
        Cells(i, 1) = .Cells(j, 1)
        'On copie le nouveau nom dans Base
        .Cells(j, 4) = Cells(i, 4)
       End With
    End If
  End If
  'On trie par rapport au Nom puis Prénom
  Range("A3:AA" & [A65536].End(xlUp).Row).Sort [D3], xlAscending, [E3], , xlAscending, , , xlNo
Application.DisplayAlerts = -1: Application.EnableEvents = -1
End Sub
En effet, lorsque j'utilisais le bouton pour coller la ligne : le tri se faisait de suite à partir de la colonne D (Nom) et donc les données qui suivaient a la suite de la colonne D restaient sur la dernière ligne.

Une petite explication pour comprendre la suite :

J'ai donc deux fichiers sources qui sont remplies selon le lieu où réside le stagiaire.

J'ai donc crée deux boutons : sources1 et sources2

Donc lors de l'enregistrement d'un nouveau stagiaire j'ouvre soit le fichier source1 ou source2 je remplie ma ligne, ensuite l'idée est d'avoir le fichier "suivi ateliers...." ouvert et de là je clique sur le bouton correspondant pour rajouter ma ligne dans ce tableau, et ainsi de suite.
A la fin de ma mise à jour, je termine en triant par ordre alphabétique mon fichier sources1 ou sources2.

Mais si par erreur ou oubli, je devais rajouter la ligne manuellement, j'aimerais que le tri se fasse aussi mais je n'arrive pas à trouver le code afin que le tri ne se fasse que lorsque la colonne V ou W soient remplie.

Je pourrais autrement passer encore par un autre bouton pour faire le tri mais bon s'il y a plus simple je préférerais.

Autres soucis que j'ai rencontré : j'ai voulu avoir un fichier vierge pour pouvoir repartir de zéro, mais il semblerait qu'il y ai un conflit avec le renvoi dans la feuille "base" et l'attribution du numéro d'identifiant, j'ai le message suivant lorsque j'ai commencé à rentrer un premier contact dans la feuille "liste participants :

"erreur d'exectuion "13"
Ce qui me renvoie à cette ligne qui est en jaune

Code:
.Cells(j, 1) = .Cells(j - 1, 1) + 1
Je te joins le fichier vierge pour que tu puisses mieux comprendre le problème.

Voila où j'en suis, encore merci pour ton aide.

Bonne soirée.

Loulou
 

Fichiers joints

Yaloo

XLDnaute Barbatruc
Re : Générer des courriers types word à partir d'excel

Bonjour Loulou,

Pour ton problème de mise à jour et de tri, essaies de mettre Application.EnableEvents = 0 en début de macro et Application.EnableEvents = -1 en fin de macro, cela permet de suspendre les macros évènementielles. Par contre, comme le tri normalement se fait lorsque tu ajoutes un stagiaire (cela ne va pas se faire) donc je pense qu'il faut que tu mettes un tri à la fin de ta macro, juste avant Application.EnableEvents = -1.

Dans le fichier ci-joint j'ai modifié la mise à jour du N° d'identifiant, ainsi que la suppression des données ou l'envoi de données lorsqu'il n'y a pas de stagiaire.

Pour tes histoires de tri et d'oubli je n'ai pas tout compris dans quel fichier tu te trouves et ce que tu veux faire.

A te relire

Martial
 

Fichiers joints

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

je continue mes recherches et je me posais la question :

N'y a t'il pas moyen de demander dans le code TRI de la feuille "liste participants" de ne débuter que le tri que lorsque la cellule V ou W soient replies ?

J'ai essayé de faire un code mais c'est pas gagné...

Code:
If .Cells(i,22) or Cells(i,23)= "X" Then
Range("A3:AA" & [A65536].End(xlUp).Row).Sort [D3], xlAscending, [E3], , xlAscending, , , xlNo
bon c'est clair ça ne fonctionne pas, est ce possible ?
 
Dernière édition:

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

oups je sais pas ce que j'ai fabriqué mais mon message précédent a disparu, je vais essayé de le remettre car j'avais un autre onglet d'ouvert avec mon post :

Code:
rebonjour Martial,

Merci de t'être penché sur mon problème.

J'ai essayé de rentrer des nouveaux contacts, je n'ai plus le message d'erreur "13" et l'id semble être bien pris en compte dès le départ.

J'ai remis donc la ligne comme tu me l'a suggérée, à la fin de la macro Worksheet Chante

Code vba:
Option Explicit
Dim Id&, i&, j&
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.DisplayAlerts = 0: Application.EnableEvents = 0
i = Target.Row
'Récupération de l'Identifiant de la ligne modifiée
Id = Cells(i, 1)
  'On met en majuscule ou en nom propre les colonnes D, E, F, G et I
 Cells(i, 4) = StrConv(Cells(i, 4), 1)
  Cells(i, 5) = StrConv(Cells(i, 5), 3)
  Cells(i, 6) = StrConv(Cells(i, 6), 3)
  Cells(i, 7) = StrConv(Cells(i, 7), 3)
  Cells(i, 9) = StrConv(Cells(i, 9), 1)
  'On cherche l'Id dans la colonne A de Base
 'Si on le trouve
 If Not IsError(Application.Match(Id, Sheets("Base").Columns(1), 0)) Then
    'On copie les données de la ligne modifiée
   j = Application.Match(Id, Sheets("Base").Columns(1), 0)
    Sheets("Base").Cells(j, 2).Resize(, 22).Value = Cells(i, 2).Resize(, 22).Value
  'Si l'Id n'est pas trouvé
 Else
    'Si la colonne est D (Nom) et l'Id est vide
   If Target.Column = 4 And Cells(i, 1) = "" Then
      With Sheets("Base")
        'Dans la Base on crée un nouvel Identifiant
       j = .[A65536].End(xlUp)(2).Row
        .Cells(j, 1) = .Cells(j - 1, 1) + 1
        'On copie le nouvel Identifiant dans "Général"
       Cells(i, 1) = .Cells(j, 1)
        'On copie le nouveau nom dans Base
       .Cells(j, 4) = Cells(i, 4)
       End With
    End If
  End If
  'On trie par rapport au Nom puis Prénom
 Range("A3:AA" & [A65536].End(xlUp).Row).Sort [D3], xlAscending, [E3], , xlAscending, , , xlNo 
Application.DisplayAlerts = -1: Application.EnableEvents = -1
End Sub

Mais on revient à la case de départ, comme je te l'avais dis dans mon précédent post je l'avais enlevée cette ligne de tri car ça me décalait tout concernant les lignes qui étaient rajoutées via les boutons.

Si le nom était par exemple "BLANCHARD", la ligne remontait tout de suite dès que la colonne D étaient remplie (celle du nom donc) ce qui fait que les autres données des colonnes E à W restaient sur la dernière ligne du tableau. Je parle toujours du fichier "Suivi ateliers" et non des fichiers Sources

Pour le problème d'erreur ou de tri, qui concerne donc le fichier "suivi ateliers", à présent le problème à ce niveau est réglé puisque nous avons remis la ligne tri a la fin de la macro.

Par contre maintenant j'ai des problèmes avec mes boutons :
- la macro ne prend plus en compte la ligne qui se rajoute : pas d'id attribué et ni d'enregistrement dans la feuille base.
- le tri ne se fait plus non plus.

Autrement comme je le disais dans mon précédent post, je peux remplacer la ligne tri en fin de macro de la feuille "liste participants" et remplacer par un bouton tri. Et remettre les codes tri dans les boutons comme auparavant.

Qu'en penses tu ?
et la suite est dans mon dernier post. désolée pour la boulette.
 

Discussions similaires


Haut Bas