VBA: Créer et remplir automatiqmt des fiches
Résolu
Andréa
-
Andréa -
Andréa -
A voir également:
- VBA: Créer et remplir automatiqmt des fiches
- Excel compter cellule couleur sans vba - Guide
- Incompatibilité de type vba ✓ - Forum VB / VBA
- Mkdir vba ✓ - Forum VB / VBA
- Erreur 13 incompatibilité de type VBA excel ✓ - Forum Excel
- Vba range avec variable ✓ - Forum VB / VBA
3 réponses
Alors, je ne peux pas tester, ne disposant pas de lotus...
Mais essaye de ton côté.
Il y a trois constantes à adapter à ton cas. Voir dans le code l'entête.
Il te faut ajouter également les adresses mail dans ton fichier initial, en colonne H par exemple.
Cf fichier exemple : https://www.cjoint.com/c/ECqoOeyA0Y9
Le code :
Mais essaye de ton côté.
Il y a trois constantes à adapter à ton cas. Voir dans le code l'entête.
Il te faut ajouter également les adresses mail dans ton fichier initial, en colonne H par exemple.
Cf fichier exemple : https://www.cjoint.com/c/ECqoOeyA0Y9
Le code :
Option Explicit Const EMBED_ATTACHMENT As Long = 1454 'A ADAPTER***************************************** 'objet du mail : Const stSubject As String = "Envoi fiche membre" 'corps du mail Const vaMsg As Variant = "Bonjour," & vbCrLf & vbCrLf & vbCrLf & "Voici votre fiche membre." & vbCrLf & vbCrLf & "Cordialement" 'copie à : Const vaCopyTo As Variant = "name@mail.com" 'FIN ADAPTATIONS*********************************** Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim bCpt As Byte, reponse As Integer, dest As String If Target.Count > 1 Then Exit Sub If Target.Column < 2 And Target.Row > 1 And Target.Row < 1500 And Target.Value <> "" Then If MsgBox("Voulez-vous envoyer la fiche de : " & Target.Value & "?", vbYesNo, "Envoi par mail") = vbYes Then With Sheets("Fiche") For bCpt = 3 To 9 .Range("C" & bCpt) = Target.Offset(0, bCpt - 3) Next dest = Target.Offset(0, 7).Value .Copy Call Send_Active_Sheet(dest) End With End If End If End Sub Sub Send_Active_Sheet(destinataire As String) Dim stFileName As String Dim vaRecipients As Variant Dim noSession As Object Dim noDatabase As Object Dim noDocument As Object Dim noEmbedObject As Object Dim noAttachment As Object Dim stAttachment As String 'Copy the active sheet to a new temporarily workbook. With ActiveSheet .Copy stFileName = .Range("C3").Value End With stAttachment = ThisWorkbook.Path & "\" & stFileName & ".xls" 'Save and close the temporarily workbook. With ActiveWorkbook .SaveAs stAttachment .Close End With 'Instantiate the Lotus Notes COM's Objects. Set noSession = CreateObject("Notes.NotesSession") Set noDatabase = noSession.GetDatabase("", "") 'If Lotus Notes is not open then open the mail-part of it. If noDatabase.IsOpen = False Then noDatabase.OPENMAIL 'Create the e-mail and the attachment. Set noDocument = noDatabase.CreateDocument Set noAttachment = noDocument.CreateRichTextItem("stAttachment") Set noEmbedObject = noAttachment.EmbedObject(EMBED_ATTACHMENT, "", stAttachment) 'Add values to the created e-mail main properties. With noDocument .Form = "Memo" .SendTo = destinataire '.CopyTo = vaCopyTo .Subject = stSubject .Body = vaMsg .SaveMessageOnSend = True .PostedDate = Now() .Send 0, vaRecipients End With 'Delete the temporarily workbook. Kill stAttachment 'Release objects from memory. Set noEmbedObject = Nothing Set noAttachment = Nothing Set noDocument = Nothing Set noDatabase = Nothing Set noSession = Nothing MsgBox "Email crée et envoyé avec succès", vbInformation End Sub
Bonjour,
Voici un petit truc rapide, mais qui peut certainement être améliorer par des experts (je suis loin d'en être une).
Voici un petit truc rapide, mais qui peut certainement être améliorer par des experts (je suis loin d'en être une).
Sub Macro2()
Application.ScreenUpdating = False
Sheets("Données").Select
Range("A2").Select
Do Until ActiveCell.Value = ""
Nom = ActiveCell.Value
Prénom = ActiveCell.Offset(0, 1).Value
Genre = ActiveCell.Offset(0, 2).Value
Date_N = ActiveCell.Offset(0, 3).Value
Adresse = ActiveCell.Offset(0, 4).Value
CP = ActiveCell.Offset(0, 5).Value
Ville = ActiveCell.Offset(0, 6).Value
Sheets.Add.Name = Nom
Sheets("Fiche").Select
Cells.Select
Selection.Copy
Sheets(Nom).Select
ActiveSheet.Paste
Range("C3").Value = Nom
Range("C4").Value = Prénom
Range("C5").Value = Genre
Range("C6").Value = Date_N
Range("C7").Value = Adresse
Range("C8").Value = CP
Range("C9").Value = Ville
Sheets("Données").Select
ActiveCell.Offset(1, 0).Select
Loop
End Sub
La solution proposée tient vraiment la route, je n'ai constaté ni incohérence dans le résultat, ni message d'erreur, merci! J'ai simplement ajouté les deux lignes suivantes après "Loop" afin que mes deux feuilles initiales ne soient pas déplacées à la fin:
Merci encore!
Sheets("Données").Move before:=Sheets(1)
Sheets("Fiche").Move after:=Sheets("Données")
Merci encore!
Bonjour,
Pourquoi vouloir créer une fiche par membre?
Essaye cette macro :
Pour le faire fonctionner, sélectionner une cellule non vide de la colonne A de la feuille Données...
Pourquoi vouloir créer une fiche par membre?
Essaye cette macro :
- Clic droit sur l'onglet de la feuille Données
- visualiser le code
- copier-coller ce code :
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim bCpt As Byte If Target.Column < 2 And Target.Row > 1 And Target.Row < 1500 And Target.Count = 1 And Target.Value <> "" Then With Sheets("Fiche") For bCpt = 3 To 9 .Range("C" & bCpt) = Target.Offset(0, bCpt - 3) Next .Select End With End If End Sub
Pour le faire fonctionner, sélectionner une cellule non vide de la colonne A de la feuille Données...
Je voudrais les envoyer par mail à chaque membre concerné sans que celui-ci ait connaissance des données des autres membres, d'où la nécessité de les séparer.
Pour la séparation, j'ai trouvé le code suivant, qui semble répondre à mon besoin:
Pour la séparation, j'ai trouvé le code suivant, qui semble répondre à mon besoin:
Sub ExportGroupe()
'créer des classeurs à partir de feuilles
Application.ScreenUpdating = False
Dim Feuille As Worksheet
Dim Nom2 As String
Nom2 = InputBox("Combien de feuilles exporter?" & Chr(10) & "Indiquer le nombre de feuilles en partant de la fin", "Export")
If Nom2 = "" Then
Exit Sub
End If
For Each Feuille In ActiveWorkbook.Sheets
If Feuille.Index > Sheets.Count - Nom2 Then
Feuille.Copy
With ActiveWorkbook
.Title = Feuille.Name
.Subject = Feuille.Name
.SaveAs Filename:=ThisWorkbook.Path & "\" & Feuille.Name + ".xlsx"
End With
End If
Next
Application.ScreenUpdating = True
End Sub
Je voudrais les envoyer par mail à chaque membre concerné sans que celui-ci ait connaissance des données des autres membres, d'où la nécessité de les séparer.
Je ne vois toujours pas l'intérêt ni la nécessité de les séparer...
Quel logiciel de messagerie?
Outlook?
ou alors un mail style gmail ou hotmail??
Je ne vois toujours pas l'intérêt ni la nécessité de les séparer...
Quel logiciel de messagerie?
Outlook?
ou alors un mail style gmail ou hotmail??
Je viens de faire l'essai du code avec Lotus Notes et ça marche!!!
Par contre, vu sa complexité, il me sera difficile de le réadapter à d'autres formulaires, mais j'essaierai de le décortiquer.
Merci encore!
N'hésite pas à demande...
En gros, tu ne dois rien changer dans la procédure Send_Active_Sheet(destinataire) qui envoie, la feuille active, par mail lotus au ... destinataire.
Par contre, si tu souhaites adapter à d'autres formulaires, il conviendra de modifier, le cas échéant, la procédure événementielle Worksheet_SelectionChange
A+
J'ai par ailleurs un cas à vous soumettre dans le même esprit que celui-ci, mais en plus complexe je pense. J'en indiquerai le lien ici des que j'aurai préparé le fichier de test.
Je l'ai fait sous forme de boucle :
cela se traduit par :
A toi de l'écrire, rigoureusement comme cela.
Target = cellule cliquée dans la procédure événementielle Worksheet_SelectionChange
Offset(Ligne, Colonne) décale d'autant de lignes et de colonnes qu'indiqué.
Target.Offset(3, 5) désigne la cellule 3 lignes en dessous et 5 colonnes à droite...
Target.Offset(-2, 0) désigne la cellule située deux lignes au dessus et dans la même colonne...