Envoyer un résumé d'une partie d'un TCD par email sous forme d'un tableau
Bonjour au forum,
Je fais encore appelle à vous pour un problème de taille...
Dans un fichier qui me permet de faire un suivi de stock quotidien par importation d'une liste de données via un fichier .txt convertit par macro en .xlsx, j'aurais besoin d'en envoyer un résumé de l'état du stock du jour par email à plusieurs destinataires.
Dans le fichier .xlsm joint, en cliquant sur le bouton "Import de données", on sélectionne le fichier en .txt à convertir (joint également si besoin) en .xlsx, puis une fois la conversion terminée, on sélectionne le fichier .xlsx nouvellement crée pour que l'import se fasse.
On visualise les résultats sur les onglets TCD et/ou GCD.
Jusque là, tout va bien.
J'aimerais maintenant créer une procédure me permettant d'envoyer un résumé de ce stock par email, selon cet exemple :
Groupe | Dépôt 1 | Dépôt 2 | ...etc. |
---|---|---|---|
A RhD+ | nombre d'itération selon le nombre de prélèvement | nombre d'itération selon le nombre de prélèvement | nombre d'itération selon le nombre de prélèvement |
A RhD- | nombre d'itération selon le nombre de prélèvement | nombre d'itération selon le nombre de prélèvement | nombre d'itération selon le nombre de prélèvement |
...etc. | nombre d'itération selon le nombre de prélèvement | nombre d'itération selon le nombre de prélèvement | nombre d'itération selon le nombre de prélèvement |
Difficulté supplémentaire, le nombre d'itération doit être calculé uniquement concernant les codes produit = E3846V00
Pour résumer, avoir le résultat comme présenté dans l'onglet "TCD" du fichier mais uniquement pour la date du jour, et sous forme d'un tableau.
Merci d'avance pour l'aide que vous pourriez m'apporter
Re,
petit up pour les motivés...
Bonjour
Tu travailles avec 2007 ou 2016 ?
Tu travailles avec des paramètres régionaux anglo-saxons ?
Si 2016 tu pourrais directement importer le txt via PowerQuery et construire TCD/GCD directement sur la requête au lieu de toutes ces transformations et copie
Pour le tableau à envoyer tu peux soit le faire par PowerQuery, soit par un second TCD
Comme la date du jour n'existe pas dans le fichier, je n'ai pu appliquer le filtre
en vert PowerQuery, en bleu TCD
Bonjour 78chris,
Merci pour ta réponse.
Tu travailles avec 2007 ou 2016 ?
Avec 2013 concernant ce fichier.
Tu travailles avec des paramètres régionaux anglo-saxons ?
Franco-suisse, si tu parles bien des paramètres de windows ?
Si 2016 tu pourrais directement importer le txt via PowerQuery et construire TCD/GCD directement sur la requête au lieu de toutes ces transformations et copie
Mon rêve.... Nous n'avons malheureusement pas PowerQuery dans l'institution, je pourrais peut-être demander à l'IT si c'est envisageable mais je suis très sceptique.
Donc pour le TCD à envoyer, tu suggères de le génèrer au moment de l'envoi du mail, ou d'avoir un autre onglet permanant reprenant les données du jour ?
RE
PowerQuery est disponible en add on sur 2013 (c'est gratuit et à télécharger chez Microsoft)
Tes dates Excel ne ont pas considérées comme des dates quand j'ouvre le fichier. D'où ma question
Le second TCD peut être permanent. Il faudra juste ajouter un bout de code pour le filtre
Merci pour ta réponse.
Option Explicit
Private Sub email()
Dim olApp As Outlook.Application
Dim olMail As Outlook.MailItem
Set olApp = CreateObject("outlook.application")
Set olMail = olApp.CreateItem(olMailItem)
With olMail
.Subject = "Suivi de Stock quotidien"
.To = "adresse@mail.com"
'.CC = Range("L" & Ligne) 'ou .BCC pour Cci
.Body = "Chers collègues," & vbCrLf & vbCrLf & "Veuillez trouver ci-dessous l'état des stocks du jour, le " _
& maDate & "." & vbCrLf & vbCrLf & Stock & vbCrLf & vbCrLf & "Bonne fin de journée !"
.Send '.Display
End With
End Sub
Donc si je génère un second TCD à partir de la même source (dans un onglet que j'appellerai "Résumé" par exemple), comment pourrais-je l'intégrer dans ce code pour l'envoi de l'email (dans l'hypothèse où celui-ci fonctionne) ?
PowerQuery est disponible en add on sur 2013 (c'est gratuit et à télécharger chez Microsoft)
Je contacterai l'IT demain pour savoir si c'est envisageable de l'installer.
RE
Dans ton code que je n'ai pas testé sur outlook, avec le TCD tel que sur l'image qui commence en colonne I avec les noms de dépôts en ligne 5 de Feuil2, une solution avec des tabulations
Option Explicit
Private Sub email()
Dim Ligne2 As Integer, colonne As Integer, yy As Integer, xx As Integer, DataN As Long
Dim olApp As Outlook.Application
Dim olMail As Outlook.MailItem
Dim Messag
Dim c As Long
Dim ws As Worksheet, Tabl As String
'Verification si données pour la date du jour
DataN = WorksheetFunction.CountIfs([Data].ListObject.ListColumns("Date").DataBodyRange, ">=" & Date, [Data].ListObject.ListColumns("Date").DataBodyRange, "<" & 1 * (Date + 1))
If DataN = 0 Then Exit Sub
Set ws = Worksheets("Feuil2")
ws.PivotTables("Tableau croisé dynamique1").PivotFields("Date").CurrentPage = Date
yy = ws.Range("J" & Rows.Count).End(xlUp).Row
xx = WorksheetFunction.CountA(ws.Range("K5:Q5"))
If yy > 6 And xx >= 1 Then
Set olApp = CreateObject("outlook.application")
Set olMail = olApp.CreateItem(olMailItem)
With olMail
.Subject = "Suivi de Stock quotidien"
.To = "adresse@mail.com"
'.CC = Range("L" & Ligne) 'ou .BCC pour Cci
For Ligne2 = 5 To yy
For colonne = 9 To xx + 11
Tabl = Tabl & ws.Cells(Ligne2, colonne).Value & IIf(colonne < xx + 11, Chr(9), Chr(10))
Next colonne
Next Ligne2
.Body = "Chers collègues," & vbCrLf & vbCrLf & "Veuillez trouver ci-dessous l'état des stocks du jour, le " _
& Date & "." & vbCrLf & vbCrLf & Tabl & vbCrLf & vbCrLf & "Bonne fin de journée !"
.Send '.Display
End With
End If
End Sub
Edit : finalement j'ai retrouvé le mail dans outlook
Les tabulations nécessitent une police à pas fixe et les libellés du champ rhésus champs en étiquettes de ligne est long donc il faudrait plus de tabulations
ll y a peut-être moyen de faire un tableau mais je ne sais pas faire
Bonjour Nrev74, bonjour Chris
On pourrait aussi adopter une présentation en html sus forme de tableau
Dans ce cas, utilise
.htmlbody = "______tout_le_texte_________" & .htmlbody
pour avoir aussi ta signature en fin de mail
et transforme ta plage de données que tu veux passer en table html
Function tableauhtml(plage As Range) As String
Dim cel As Range
Set cel = plage.Cells(1, 1)
tableauhtml = "<table>"
For i = 1 To plage.Rows.Count
tableauhtml = tableauhtml & "<tr>"
For j = 1 To plage.Columns.Count
tableauhtml = tableauhtml & "<td>" & texthtml(cel.Offset(i - 1, j - 1).Value) & "</td>"
Next
tableauhtml = tableauhtml & "</tr>"
Next
tableauhtml = tableauhtml & "</table>"
End Function
Function texthtml(texte As String)
texthtml = ""
For i = 1 To Len(texte)
Select Case Asc(Mid(texte, i, 1))
Case Is = 10
texthtml = texthtml & "<br/>"
Case Is = 39
texthtml = texthtml & "" & Application.Trim(Str(Asc(Mid(texte, i, 1)))) & ";"
Case Is > 127
texthtml = texthtml & "" & Application.Trim(Str(Asc(Mid(texte, i, 1)))) & ";"
Case Else
texthtml = texthtml & Mid(texte, i, 1)
End Select
Next
End Function
Bonjour 78chris, Steelson,
Un tout grand merci à vous pour vos réponses. et pour le temps que vous me consacrez.
J'essaie depuis quelques jours d'avancer mais j'avoue ne pas être encore assez à l'aise avec VBA pour me débrouiller avec vos propositions
Je vais encore essayer de négocier avec mon IT pour installer Power Query, ce sera peut-être plus simple pour moi (dans l'hypothèse où son utilisation l'est, ne connaissant pas
Merci encore à vous