Recuperer valeur sans guillemets

Résolu
thanae Messages postés 11 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 7 mai 2010 - 18 févr. 2008 à 19:03
thanae Messages postés 11 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 7 mai 2010 - 26 févr. 2008 à 15:28
Bonjour,

J'ai chercher partour sur le net et ne trouve pas la solution.
J'ai besoin d'indiquer dans un champ texte, voir mémo, du texte ET le nom de champs d'une table, puis récupérer le tout en VBA.
Je m'explique, j'ai des tables pour des projets avec les coordonnées de personnes (titre, nom, prenom, email, etc..).
J'ai fait un form pour automatiser l'envois d'email. Donc en fonction du type de mail choisi, j'ai dans une table, le contenus et les champs qui irons dans le TO, le CC, le Sujet et le Corps des mail a créer.
example:
Type Mail<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

, SiAttach

, NomAttach

, TO

, CC

, Sujet

, Corps

, ----
Lettre1

, non

,  

, <Mailpers1>

, <Mailpers2>

, <Sujet1> - Info about ….

, Cher <Titrepers1> <Nompers1>,

Vous trouverez ..

, ----
Lettre2

, oui

, Document1.doc

, <Mailpers2>

, <Mailpers1>,<Mailpers3>

, Invitation ….

, Dear  <Titrepers1> <Nompers1>,

We inform ...

J'ai donc comme ca des mail de tout type avec 1 personne ou plusieur dans le TO ou le CC des sujets avec l'info d'un champ, le corps du mails avec des info de champs n'importe ou.

Dans mon form j'ai une combo "Lst_Lettre" avec la liste des diférents type de lettre
Donc mon code est:

Set rst = CurrentDb.OpenRecordset("tmp_Query", dbReadOnly)
rst.MoveFirst
Do Until rst.EOF
        Set olApp = CreateObject("Outlook.Application")
        Set olMail = olApp.CreateItem(OlMailItem)
        With olMail
            .SentOnBehalfOfName = "[mailto:MailboxGen@xxx.com MailboxGen@xxx.com]"
            .To = Me.Lst_Lettre.Column(4)                  ' mais ici pour le 1er je devrais avoir rst.fields("TO")
            .CC = Me.Lst_Lettre.Column(5)                 ' ici 1er : rst.fields("CC") & ";" & rst.fields("CC") 
            .Subject = Me.Lst_Letter.Column(6)           ' rst.fields("NUM_PROJET") & "- (reste du texte)
           .Body =  Me.Lst_Lettre.Column(7)           ' idem
            If Me.Lst_Lettre.Column(2)  Then .attachments.Add iDirDest & "" & _
                          rst.Fields("NUM_PROJET") & Me.Lst_DocWd.Column(3)                                          
            .Save
        End With
        rst.MoveNext
Loop
rst.Close
Set rst = Nothing
Set olApp = Nothing
Set olMail = Nothing

Alors soit je mets rst.field("") dans la table, alors vba ne prent pas l'objet ou alors il faut que récupérer les nom des champs dans le texte pour ensuitre refaire le texte.

Je vois pas tres bien comment m'en sortir, alors si vous avez une petite idée, ca m'aiderai, merci.

6 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
20 févr. 2008 à 02:36
Ok, j'ai compris
Tu voudrais que la ligne paramètrée remplace les champs par leurs valeurs.
Pas évident à expliquer, je te comprends, lol

Dans ta table, tu as un texte qui ressemble à ça :
   "Dear " & rst.Field("Titrepers1") & " " & rst.Field("Nompers1") & ",  We inform ..."

et tu voudrais que, lors de l'écriture dans .body, il écrive ça :
   "Dear Sir Thanae,  We inform ..."

sachant que Sir est le contenu de la colonne Titrepers1 de l'enregistrement courant de ton RecordSet, et Thanae dans la colonne Nompers1

-1- Reconnaissance des variables dans un texte :
Je pense qu'il va falloir remodeler la chaine initiale.
Le principal est que, dans la chaine, ton programme sache reconnaitre le nom de la colonne à utiliser pour le remplacer par la donnée.
Comme pour les analyseurs syntaxiques (voir peut-être Expressions régulières), il faut facilement retrouver le nom de ton champ parmi ton texte. Je te propose d'encadrer le nom de ces champs par un (ou plusieurs) caractères que tu as peu de chance de retrouver dans un texte standard : Exemple (mal choisi) : 3 slash ///
Ta ligne mémorisée pourra donc ressembler à ça :
   monPattern = "Dear ///Titrepers1/// ///Nompers1///,  We inform ..."
Ensuite, il te suffit d'isoler les paramètres insérés dans ton texte initial avec un simple Split :
   Dim monTableau() As String
   monTableau = Split(monPattern, "///")
Tu récupèreras ainsi :
   Titrepers1  dans monTableau(0)
   Nompers1  dans monTableau(1)

-2- Recherche de la valeur associée au nom du Champ :
Le problème, c'est qu'il n'est pas possible syntaxiquement de rendre variable le nom du champ. Exemple : ceci ne peut pas fonctionner :
   Dim xxx As String
   xxx = "Titrepers1"
   Debug.Print rst.Fields(xxx)
Il va te falloir, pour chaque paramètre, rechercher son index parmi toutes les colonnes de ton RecordSet. Exemple :
   ' Tu récupères Titrepers1 dans une variable xxx
   xxx = "Titrepers1"
   monIndex = -1   ' par défaut, pas d'index
   For r = 0 To (rst.Fields.Count - 1)
      If rst.Fields(r).Name = xxx Then
         monIndex = r
         Exit For
      End If
   Next r
En sortie, monIndex contient :
   -1  s'il ne l'a pas trouvé parmi les noms de colonnes de ton RecordSet
   x    s'il a trouvé la colonne : cool
Ensuite, tu n'as plus qu'à utiliser   rst.Fields(monIndex).Value  pour récupérer le contenu de la colonne Titrepers1 dans l'enregistrement en cours de ton RecordSet.

-3- Réincrustation des valeurs de champs dans le texte original :
On a 
   monPattern = "Dear ///Titrepers1/// ///Nompers1///,  We inform ..."
Et on sait que le numéro de colonne correspond au champ Titrepers1 est dans monIndex
On sait aussi que Titrepers1 est le texte contenu dans monTableau(0)
Suffit ensuite de demander le remplacement :
   monTexteFinal = monPattern
   monTexteFinal = Replace(monTexteFinal, "///" & monTableau(0) & "///", rst.Fields(monIndex).Value

Voilà
Alors bien sûr, il va falloir faire une boucle de recherche pour chacun des éléments composant monTableau.
UBound(monTableau) te renverra le dernier index de ce Array, sachant que le premier index est en LBound(monTableau) qui devrait valloir 0
A toi de jongler avec les boucles imbriquées et les énumérations de RecordSet !
Puisque ces boucles For-Next tournent pour peu de valeurs (au maxi une dizaine par ligne et encore), cette méthode devrait être rapide à l'exécution.
Il faudra bien sûr recalculer monTexteFinal pour chaque enregistrement de ton RecordSet.
Pour être efficace et ne pas recalculer toujours les mêmes choses, il vaudra mieux faire en 2 étapes :
- repérer les noms des champs, en déduire les index dans le RecordSet pour chaque champ repéré
- en ensuite pour chaque enregistrement de ton RecordSet, opérer les remplacements

Vala
Bon courage

Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
18 févr. 2008 à 19:15
si tu es en VBA pourquoi mettre en VB.NET ?!!!
déplacé

c'est 1 message sur 2 aujourd'hui !!!
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
18 févr. 2008 à 21:44
Salut
Malgré tes explications complètes, je n'ai pas bien saisi ton problème.
J'ai gardé "J'ai besoin d'indiquer dans un champ texte du texte ET le nom de champs d'une table"
"du texte" :
   facile, suffit d'écrire   "mon texte"  (je ne t'apprends rien)
"le nom de champ d'une table" : 
   Soit tu connais le nom du champ   rst.Fields("TOTO")
   Soit tu connais son numéro d'ordre dans le RecordSet   rst.Fields(2)
      PS : Je crois que le premier à l'index 0 - à vérifier
   Je suis sûr que  rst.Fields(2).Name  fonctionne pour renvoyer le nom du champ
   Par contre, je ne sais pas si ça marche aussi avec les noms  rst.Fields("TOTO").Name

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
thanae Messages postés 11 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 7 mai 2010
19 févr. 2008 à 09:50
Oui, ca ok. Je pense effectivement m'etre mal exprimer.
Mon probleme se situe sur le faite que dans le texte, example le corps du mail, les champs a inserer peuvent etre situé a différent endroit selon le type de mail.
Donc quant je récupere mon texte du combo "Lst_lettre"(qui reprend toute la table Tbl_Mail) il est en format texte, on est bien d'accord. Mais alors, comment dire au code:
...
.Body =  Me.Lst_Lettre.Column(7)
....

qu'en fait ca doit etre, pour le TypeMail: Lettre1 (Tbl_Mail = tableau précédent post):
....
.body =  "Dear " & rst.field("Titrepers1") & " " & rst.field("Nompers1") & ", 
We inform ..."
....

Puisque si je mets dans ma table le texte:  
"Dear " & rst.field("Titrepers1") & " " & rst.field("Nompers1") & ", 
We inform ..."

il récupere les rst.field("Titrepers1"), dont Titrepers1 vient d'un query "tmp_Query", comme du texte et pas comme une commande.

J'ai pense a faire un Select Case pour les TypeMail et mettre le début du texte ou se trouves les champs a insérer et puis mettre le texte prevenant de la tbl_Mail, car pour le moment j'en ai pas encore bcp de record dans cette table, mais au fure a mesure que ca augementera, ca va pas etre pratique et ca va alourdir tres fort le code. Puis comme je l'ai dit, les champs à inserer ne vont pas toujours etre au début du corps, mais pourront etre en plein millieux.

Voila, j'ai essayer d'etre plus claire, mais pas facile a expliquer, vu que ca doit etre assez rare comme procedé.

Thanae
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
thanae Messages postés 11 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 7 mai 2010
20 févr. 2008 à 10:54
Ok, je pense avoir compris, je vais tester tout ca et ensuite si ca marche, je préviendrai.
En tout cas un grand MERCI! je commencais a desesperer, car la, j'ai encore d'autres enregistrements de "TypeMail" qui s'ajoute et le code avec des Case devient impossible et lourd.

Thanae
0
thanae Messages postés 11 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 7 mai 2010
26 févr. 2008 à 15:28
Encore merci Jack , j'ai tester et super ca marche.
Du coup j'en ai fait une petite fonction que j'ai ajouter dans les sources :

http://www.vbfrance.com/codes/RECUPERE-CONTENU-AVEC-CHAMPS-PARAMETRE_45863.aspx

Thanae
0
Rejoignez-nous