<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - MarcelG</title>
		<link>https://www.developpez.net/forums/blogs/319586-marcelg/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Wed, 29 Apr 2026 10:10:03 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - MarcelG</title>
			<link>https://www.developpez.net/forums/blogs/319586-marcelg/</link>
		</image>
		<item>
			<title><![CDATA[Suppression des doublons d'un tableau structuré, gestion d'un array]]></title>
			<link>https://www.developpez.net/forums/blogs/319586-marcelg/b9888/suppression-doublons-d-tableau-structure-gestion-d-array/</link>
			<pubDate>Mon, 09 Nov 2020 22:32:50 GMT</pubDate>
			<description>Bonsoir à tous, 
 
La méthode...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonsoir à tous,<br />
<br />
La méthode RemoveDuplicates peut très bien s'affecter à un tableau structuré.<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p583509d1604960887/autres-langages/assembleur/x86-16-bits/retour-mode-texte-defaut/billet_remove_1_20201109.jpg/" border="0" alt="Nom : billet_remove_1_20201109.JPG
Affichages : 1662
Taille : 15,8 Ko"  style="float: CONFIG" /><br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">Sub billet_remove()
Worksheets(&quot;mafeuille&quot;).ListObjects(&quot;T_monbotablo&quot;).Range.RemoveDuplicates Columns:=Array(1,4), Header:=xlYes
End Sub</pre></td></tr></table></pre>
</div>Rien d'original si ce n'est que<br />
- le paramètre Header doit être affecté de la valeur xlYes<br />
- pour rappel, la méthode n'est pas sensible à la casse (majuscules = minuscules)<br />
<br />
Mais, comme je l'ai reporté dans mon précédent billet (sur les filtres de tableau structuré), je n'aime paaaaaaaaaas le type de notation 1,4<br />
1ère et 4ème colonnes, pour ce qui me concerne, ne veut pas dire grand chose.<br />
Je préfère retourner la place du nom de champ (colonne) par sa propriété Index<br />
<br />
A priori, je voulais créer un array à partir des champs souhaités, non de leur place.<br />
Et intégrer cet array à une procédure générique.<br />
<br />
De plus, l'array pourrait être de dimension variable.<br />
On peut vouloir, en effet, supprimer les doublons sur un nombre de colonnes variable.<br />
Or, le paramètre Columns de la méthode RemoveDuplicates accepte un array.<br />
En résumé, on passe l'array, de dimension variable donc ParamArray, en paramètre de la procédure et elle est affectée au paramètre Columns.<br />
<br />
Or:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">Worksheets(&quot;mafeuille&quot;).ListObjects(&quot;T_monbotablo&quot;).Range.RemoveDuplicates Columns:=tabarray, Header:=xlYes</pre>
</div>Je m'y suis pris à plusieurs fois mais, ainsi codée, cette méthode retourne une erreur <br />
<br />
<img src="https://www.developpez.net/forums/attachments/p583508d1604960524/autres-langages/assembleur/x86-16-bits/retour-mode-texte-defaut/billet_remove_2_20201109.jpg/" border="0" alt="Nom : billet_remove_2_20201109.JPG
Affichages : 604
Taille : 21,2 Ko"  style="float: CONFIG" /><br />
<br />
En fait, VBA ne considère pas l'Array défini comme un Array :koi:<br />
L'on doit donc évaluer cet Array soit en écrivant le nom de la méthode <div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">Evaluate(tabarray)</pre>
</div> soit, en plus concis, (je ne suis pas fan)<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">(tabarray)</pre>
</div>Ce qui donne<br />
<br />
Procédure d'appel<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">Sub épure_doublons()

Call billet_remove(&quot;parent&quot;, &quot;ville&quot;)

End Sub</pre></td></tr></table></pre>
</div>Procédure paramétrée<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td valign="top"><pre style="margin: 0">Sub billet_remove(ParamArray listechamps() As Variant)

ReDim tabarray(0 To UBound(listechamps)) As Variant

Dim i As Long

With Worksheets(&quot;mafeuille&quot;).ListObjects(&quot;T_monbotablo&quot;)
      
        For i = 0 To UBound(tabarray)
               tabarray(i) = .ListColumns(listechamps(i)).Index
        Next i
         
        .Range.RemoveDuplicates Columns:=Evaluate(tabarray), Header:=xlYes

End With

End Sub</pre></td></tr></table></pre>
</div>Par avance, je vous remercie pour vos précieuses remarques.<br />
<br />
Bonne fin de soirée à tous.</blockquote>

]]></content:encoded>
			<dc:creator>MarcelG</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/319586-marcelg/b9888/suppression-doublons-d-tableau-structure-gestion-d-array/</guid>
		</item>
		<item>
			<title>Filtre sur tableau structuré, recherche du champ où affecter le critère</title>
			<link>https://www.developpez.net/forums/blogs/319586-marcelg/b9882/filtre-tableau-structure-recherche-champ-affecter-critere/</link>
			<pubDate>Thu, 05 Nov 2020 10:48:07 GMT</pubDate>
			<description>Bonjour, 
 
En consultant mon...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour,<br />
<br />
En consultant mon dossier utilitaire à la rubrique Tableaux Structurés, j'ai observé ce développement<br />
(Je n'en suis pas l'auteur, et, contrairement à mes habitudes, je n'ai pas reporté la source. Nul, Marcel!) <br />
<br />
A partir d'un tableau structuré nommé monbotablo<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p583082d1604571743/c-cpp/c/sortir-d-progamme-boucle-refresh/billet_tblostruc_filtre_20201105.jpg/" border="0" alt="Nom : Billet_tblostruc_filtre_20201105.JPG
Affichages : 1018
Taille : 18,6 Ko"  style="float: CONFIG" /><br />
<br />
Si l'on souhaite appliquer un filtre sur le pays<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td valign="top"><pre style="margin: 0">Option Explicit

Sub FiltreTableau()

   Dim cellRésult As Range
    
    With ThisWorkbook.Worksheets(&quot;Feuil1&quot;)
    
    If .FilterMode = True Then
            .ListObjects(&quot;monbotablo&quot;).Range.AutoFilter
    End If
    
    .ListObjects(&quot;monbotablo&quot;).Range.AutoFilter _
        Field:=1, Criteria1:=&quot;=be*&quot;
 
    'Renvoie la plage de cellules visibles après l'application du filtre.
    Set cellRésult = .ListObjects(&quot;monbotablo&quot;).Range.Cells.SpecialCells(xlCellTypeVisible).Cells
    
    End With

End Sub</pre></td></tr></table></pre>
</div>Or, je suis adepte d'une bonne visibilité dans tout code, et <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">Field:= 1</pre>
</div>me gêne quelque peu.<br />
<br />
Je proposerais de paramétrer le numéro de champ (Column) par sa proprété Index<br />
<br />
Soit, avec une procédure argumentée<br />
<br />
Appel<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">Option Explicit

Public Sub filter_tablostruc()
        Call FiltreTableau(lechamp:=&quot;pays&quot;, lecritère:=&quot;It*&quot;)
End Sub</pre></td></tr></table></pre>
</div>Procédure<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br /></div></td><td valign="top"><pre style="margin: 0">Public Sub FiltreTableau(lechamp As String, lecritère As String)
   
Dim numchamp As Integer
Dim cellRésult As Range

'Filtre la colonne du tableau correspondant au paramètre &quot;lechamp&quot;,
'avec pour crtitère le paramètre &quot;lecritère&quot;
'sensible à la casse.

With Worksheets(&quot;Feuil1&quot;)

        'Efface le filtre éventuel
        If .FilterMode = True Then _
                .ListObjects(&quot;monbotablo&quot;).Range.AutoFilter
        'Recherche la colonne où se trouve le champ souhaité
        numchamp = .ListObjects(&quot;monbotablo&quot;).ListColumns(lechamp).Index
        'Filtre
        .ListObjects(&quot;monbotablo&quot;).Range.AutoFilter _
                Field:=numchamp, Criteria1:=lecritère
        
        'Renvoie la plage de cellules visibles après l'application du filtre
        
        '1 -avec la ligne de titre
        Set cellRésult = .ListObjects(&quot;monbotablo&quot;).Range.Cells.SpecialCells(xlCellTypeVisible).Cells
        Debug.Print &quot;1ère cellule des titres: &quot; &amp; cellRésult.Cells(1, 1).Value
        
        '2 -sans la ligne de titre
        Set cellRésult = .ListObjects(&quot;monbotablo&quot;).DataBodyRange.Cells.SpecialCells(xlCellTypeVisible).Cells
        Debug.Print &quot;1ère cellule des enregistrements: &quot; &amp; cellRésult.Cells(1, 1).Value

End With

End Sub</pre></td></tr></table></pre>
</div>Dans un premier temps, j'avais opté pour la recherche du nom de champ dans la plage des titres du tableau structuré<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">numchamp = Application.WorksheetFunction.Match(lechamp, .ListObjects(&quot;monbotablo&quot;).HeaderRowRange, 0)</pre>
</div>Bien entendu, la propriété Index est plus appropriée (Inutile d'inventer la roue :))<br />
<br />
J'ai cru utile d'ajouter une définition de la plage cellRésult.<br />
En effet, les objets Range et DataBodyRange n'ont pas la même portée.</blockquote>

]]></content:encoded>
			<dc:creator>MarcelG</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/319586-marcelg/b9882/filtre-tableau-structure-recherche-champ-affecter-critere/</guid>
		</item>
		<item>
			<title>Déclarer ses paramètres pour gagner en rigueur et lisibilité</title>
			<link>https://www.developpez.net/forums/blogs/319586-marcelg/b9836/declarer-parametres-gagner-rigueur-lisibilite/</link>
			<pubDate>Tue, 06 Oct 2020 09:31:44 GMT</pubDate>
			<description>Bonjour à tous, 
 
Que ce...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour à tous,<br />
<br />
Que ce soit pour une fonction ou une procédure, pour ma part, la complète déclaration des paramètres est, pour ainsi dire, obligatoire.<br />
<br />
En effet, l'on voit trop de lignes de code contenant ce type de syntaxe<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">macel = laplage.fonctionx(« Toto », , , , False)</pre>
</div>De quoi se gratter la tête !! :koi:<br />
<br />
Si les paramètres ont été définis, alors la lecture du code est d’autant plus facilitée lorsqu’ils sont mentionnés<br />
Exemple :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:132px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0">Dim lemessage As Variant         
lemessage = MsgBox( _
                    Prompt:=&quot;Une extraction est possible&quot; &amp; Chr(13) &amp; _
                                   &quot;Souhaitez-vous la créer?&quot;, _
                    Buttons:=vbYesNo, _
                    Title:=&quot;Tableau récapitualatif.&quot;)
        
If lemessage = vbYes Then……</pre></td></tr></table></pre>
</div>Pour une procédure (ou une fonction) paramétrée, cela devient encore plus évident.<br />
<br />
Supposons une procédure - basique - ayant pour objet la protection de certaines cellules d’une feuille de travail à définir.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td valign="top"><pre style="margin: 0">Option Explicit

Public Sub protéger(lafeuil As String, motpasse As String, celdep As String, laprotection As Boolean, Optional nblignes As Long, Optional nbcolonnes As Integer)

With Worksheets(lafeuil)
        
        .Unprotect Password:= motpasse
        .Cells.Locked = False
        
        'Pour contrôle
         Debug.Print .Range(celdep).Resize(IIf(nblignes = 0, 1, nblignes), IIf(nbcolonnes = 0, 1, nbcolonnes)).Address
        
        .Range(celdep).Resize(IIf(nblignes = 0, 1, nblignes), IIf(nbcolonnes = 0, 1, nbcolonnes)).Locked = laprotection
        .Protect Password:= motpasse

End With

End Sub</pre></td></tr></table></pre>
</div><b>Il est certain</b> que le code suivant est effectif<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">Sub essai()

protéger &quot;VENETA&quot;, &quot;PUGLIA&quot;, &quot;A1&quot;, True, , 10

End Sub</pre></td></tr></table></pre>
</div>L’on remarquera au passage <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">, ,</pre>
</div>Ce qui signifie qu’un paramètre optionnel n’a pas été informé.<br />
<br />
Mais que voit-on ?<br />
Un mot « protéger » qui signifie sans-doute qu’une procédure est appelée, 2 chaînes de caractères, une adresse, une valeur booléenne, un blanc et un nombre.<br />
<br />
Explicite, non ?<br />
Réponse: non!<br />
<br />
De – très - loin, ma préférence va à<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">Sub essai()

Call protéger(lafeuil:=&quot;VENETA&quot;, motpasse:=&quot;PUGLIA&quot;,  celdep:=&quot;A1&quot;, laprotection:=True, nbcolonnes:=10)

End Sub</pre></td></tr></table></pre>
</div><b>Et ce d’autant plus que la saisie semi-automatique au sein de l’éditeur VBE reporte, en info-bulle, les paramètres à considérer</b><br />
<br />
Dès que l’appel de procédure suivi d’une parenthèse est saisi, alors l’éditeur reportera successivement, comme pour toute propriété ou méthode natives de VBA, la nature des paramètres à considérer, chacun en caractères gras. Les paramètres optionnels figurent entre crochets.<br />
Il suffit alors, comme ci-dessus, de les reporter, suivis de « <b>:=</b> »<br />
<br />
Certes, pour des méthodes simples (Offset...), la lisibilité n'est pas affectée si ces paramètres (RowOffset, ColumnOffset) sont implicites.<br />
<br />
<b>Une exception</b>, qui est pour ma part, un anomalie.<br />
La précision des paramètres ne peut être effectuée dès lors que l'un d'eux est de nature Paramarray<br />
Voir <a href="https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/a-procedure-with-a-paramarray-argument-cannot-be-called-with-named-arguments" target="_blank">l'explication de Microsof</a>t.<br />
<br />
Au demeurant, pour des procédures comme pour des fonctions (personnalisées ou non), il ne faut pas perdre de vue qu’un code peut être consulté (<u>d’abord à postériori pour soi-même</u>) et peut évoluer.<br />
<br />
Pour un code VBA, rigueur et lisibilité vont de pair.<br />
La déclaration des paramètres est donc un apport constructif pour pouvoir facilement se repérer dans nos développements, surtout s’ils sont complexes. <br />
<br />
Voilà.<br />
C’était l’humeur du jour.<br />
<br />
Par avance, je vous remercie pour vos remarques constructives.</blockquote>

]]></content:encoded>
			<dc:creator>MarcelG</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/319586-marcelg/b9836/declarer-parametres-gagner-rigueur-lisibilite/</guid>
		</item>
		<item>
			<title>Les connaissances de base avant de poster puis la démarche</title>
			<link>https://www.developpez.net/forums/blogs/319586-marcelg/b9006/connaissances-base-poster-puis-demarche/</link>
			<pubDate>Fri, 28 Feb 2020 11:30:40 GMT</pubDate>
			<description><![CDATA[Bonjour, 
 
L'objet de tel ou...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour,<br />
<br />
L'objet de tel ou tel Forum est l'entraide, pas l'assistance.<br />
<br />
Ce n'est pas faire injure aux nouveaux arrivants que de leur conseiller d'acquérir un minimum de connaissances avant de commencer à poster.<br />
<br />
Trop de discussions, du moins sur le Forum que je fréquente le plus, à savoir Excel VBA, débutent par<br />
&quot;Je n'y connais rien. Voilà ce que je veux faire. Merci.&quot; <br />
Parfois, un code comblé d'horreurs accompagne cette demande. Parfois aussi, un fichier sans procédure aucune (xlsx) est joint.<br />
<br />
Il n'est vraiment pas original de préciser le raisonnement suivant:<br />
- De quoi je dispose?<br />
- Vers quel résultat je souhaite m'orienter?<br />
- De quel moyens (d'abord Excel avant VBA) je dispose pour parvenir à celui-ci?<br />
<br />
A mon avis, toute démarche constructive comporterait ces étapes:<br />
- La lecture des bases du développement<br />
- L'essai de quelques procédures simples avec un souci constant d'amélioration au vu de ses lectures et, sans doute, de la consultation du Forum.<br />
- Après cette initiation, à la première difficulté rencontrée, effectuer la recherche <u>par tous les moyens possibles et imaginables</u> (le Forum, les espaces Microsoft, la toile Internet … ) d'une résolution éventuelle.<br />
Je l'ai souvent exprimé. C'est, comme en mathématiques, la recherche qui fait progresser. Et ce même si celle-ci ne porte pas, du moins dans l'immédiat, les fruits attendus.<br />
- Ensuite seulement ouvrir une discussion.<br />
<br />
Pour ce dernier point, la précision de quelques règles serait utile:<br />
- Précéder tout exposé par un adresse délicate (Salut, Bonjour…)<br />
- S'exprimer dans un langage clair <br />
- Illustrer si nécessaire le post par une capture d'écran<br />
- Etre précis quant à la difficulté rencontrée (Quelle ligne de code pose problème? Quel message d'erreur s'affiche?)<br />
- Enfin, un petit merci à la résolution de la problématique est toujours le bienvenu<br />
<br />
Sur les fichiers joints, pour ma part, je ne les lis pas en début de discussion, conformément d'ailleurs aux règles du Forum.<br />
Au demeurant, je reconnais leur utilité après une dizaine d'échanges afin de ne pas polluer la discussion en multipliant des post infructueux.<br />
<br />
Certes, ce que j'expose ici l'est sans doute déjà par le Forum lui-même.<br />
J'ai cru bon de reprendre peut-être ces règles pour les illustrer, voire, modestement, les compléter.<br />
<br />
Voilà. C'était le ressenti du jour. ;)<br />
<br />
Par avance, merci pour vos commentaires.<br />
<br />
En pièce jointe, figure une liste de raccourcis vers des espaces utiles à tout débutant.<br />
On ne peut que lui conseiller de les reporter sur son bureau d'ordinateur afin de les rendre disponibles à tout moment. <br />
<br />
Bonne journée.<br />
<br />
Marcel</blockquote>


<!-- attachments -->
	<div class="blogattachments">
		
		
		
		
			<fieldset class="blogcontent">
				<legend>Fichiers attachés</legend>
				<ul>
					
				</ul>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>MarcelG</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/319586-marcelg/b9006/connaissances-base-poster-puis-demarche/</guid>
		</item>
		<item>
			<title><![CDATA[Gestion de contrôles ActiveX par classe d'objets]]></title>
			<link>https://www.developpez.net/forums/blogs/319586-marcelg/b8990/gestion-controles-activex-classe-d-objets/</link>
			<pubDate>Wed, 26 Feb 2020 13:01:06 GMT</pubDate>
			<description><![CDATA[Bonjour, 
 
Au sein d'un même...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour,<br />
<br />
Au sein d'un même classeur, certains contrôles ActiveX peuvent avoir la même fonctionnalité.<br />
Autrement dit, les mêmes actions leur sont affectées.<br />
<br />
Dès lors, 1 processus peut à priori être envisagé:<br />
- Affecter la même procédure évènementielle au contrôle soit en rédigeant le même code (par copier/coller) soit en faisant appel à la même procédure rédigée, elle, dans un module standard.<br />
<br />
1 autre possibilité, qui aurait ma préférence, serait de gérer ces contrôles par une classe d'objets.<br />
L'affectation à cette classe peut être exécutée à l'ouverture du classeur <br />
<br />
Hypothèse:<br />
3 feuilles de travail contiennent chacune un bouton nommé &quot;Btn_Bonjour&quot;<br />
<br />
Dans un module de classe nommé &quot;Class_boutons&quot;<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:180px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td valign="top"><pre style="margin: 0">Option Explicit

Public WithEvents lebouton As CommandButton

Private Sub lebouton_Click()

MsgBox _
        Prompt:=&quot;Bonjour le Forum&quot;, _
        Buttons:=vbInformation, _
        Title:=&quot;Message d'accueil&quot;

End Sub</pre></td></tr></table></pre>
</div>Dans l'objet &quot;ThisWorkbook&quot;<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:168px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0">Option Explicit

Dim clsbtn() As New Class_boutons

Private Sub Workbook_Open()
Dim b As Byte
For b = 1 To 3
        ReDim Preserve clsbtn(1 To b)
        Set clsbtn(b).lebouton = Worksheets(&quot;Wks_&quot; &amp; b).OLEObjects(&quot;Btn_Bonjour&quot;).Object
Next b
End Sub</pre></td></tr></table></pre>
</div><b>L'avantage de ce processus:</b><br />
<br />
Simplifier la copie ou le déplacement de la feuille de travail. Seul le contrôle serait à supprimer.<br />
En effet, une feuille de travail déplacée ou copiée amène avec elle les codes qui lui sont associés.<br />
Certes, la gestion de VBA par VBA est possible. Il reste néanmoins plus confortable de s'en passer.;)<br />
<b><br />
Conclusion:</b><br />
<br />
Ce qui est vrai pour un contrôle peut l'être également, du moins à priori, pour tout autre objet.<br />
Exemple: une feuille de travail<br />
La gestion en serait, comme pour les contrôles, d'autant plus facilitée.<br />
<br />
Par avance, merci pour vos commentaires.</blockquote>

]]></content:encoded>
			<dc:creator>MarcelG</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/319586-marcelg/b8990/gestion-controles-activex-classe-d-objets/</guid>
		</item>
		<item>
			<title>Envoi instantané de plusieurs mails avec destinataires, objets, pièces jointes et corps de texte différents</title>
			<link>https://www.developpez.net/forums/blogs/319586-marcelg/b8983/envoi-instantane-plusieurs-mails-destinataires-objets-pieces-jointes-corps-texte-differents/</link>
			<pubDate>Tue, 25 Feb 2020 09:18:54 GMT</pubDate>
			<description><![CDATA[*CE BILLLET A FAIT L'OBJET...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><font color="#FF0000"><b>CE BILLLET A FAIT L'OBJET D'UNE MISE A JOUR DANS <a href="https://www.developpez.net/forums/d2093470/logiciels/microsoft-office/excel/contribuez/gestion-tableaux-structures-envois-instantanes-mails-differencies/" target="_blank">CETTE CONTRIBUTION</a></b></font><br />
<br />
Bonjour à tous,<br />
<br />
Sur une même base de données, des états peuvent être différents s’ils sont destinés à des interlocuteurs différents.<br />
(Somme des appellations pour un Directeur Marketing, Somme des chiffres d’affaires d’une aire de chalandise pour un Directeur Régional, etc….)<br />
<br />
Ces derniers seront ainsi destinataires de courriels ayant<br />
-	Des destinataires différents<br />
-	Des objets différents<br />
-	Des pièces jointes différentes<br />
-	Des corps de texte différents<br />
<br />
A chaque fois, c’est la même base de données qui est traitée à des échéances variables (jour, mois, semaine). Cette échéance est susceptible, d'ailleurs, de modifier la pièce jointe et donc son nom.<br />
<br />
Le présent billet a pour sujet la diffusion d’un bloc de tous ces éléments Outlook générée par une seule procédure.<br />
<br />
Architecture du projet:<br />
<br />
Une cellule désignera une liste (exemple liste1).<br />
<br />
A celle-ci est associée un objet de mail, une pièce jointe, un détail de destinataires qui la composent et un corps de texte.<br />
<u>Les noms de plage affectées à ces éléments comprennent cette valeur de cellule</u> <br />
Ainsi, à la valeur de cellule liste1 correspondront les plages nommées détail_liste1 (liste des destinataires) et corps_liste1 (corps de texte).<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p540697d1582558321/c-cpp/outils-c-cpp/cppbuilder/creer-serie-chart/img_billet_messagerie.png/" border="0" alt="Nom : Img_billet_messagerie.PNG
Affichages : 886
Taille : 347,6 Ko"  style="float: CONFIG" /><br />
<br />
Ainsi, pour la valeur de cellule liste1, 2 destinataires (mercatog et Marcel) recevront un mail avec <br />
-	Pour pièce jointe, le document Pdf « Menu »<br />
-	Pour objet, « Le menu du jour »<br />
-	Pour corps de mail, la partie du document sur fond jaune, image de Venise comprise <br />
<br />
Même cas de figure pour la valeur de cellule liste2<br />
<br />
Bien entendu, la rigueur au niveau des noms de plage est nécessaire. Comme toujours. <br />
<br />
Aussi, par mesure de souplesse, cette cellule sera-t-elle « typée » par ses différents composants.<br />
Partant, une fonction peut dès lors être envisagée pour le report de ceux-ci.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br /></div></td><td valign="top"><pre style="margin: 0">Option Explicit

Dim fullname_img As String

Public Type destinataire
        obj As String
        lapj As String
        lalistedest As Range
        lecorps As Range
End Type

Public Function données_dest(ledest As String) As destinataire

Dim lawks As Worksheet
Set lawks = ThisWorkbook.Worksheets(&quot;liste_mails&quot;)

Dim t As Range

Set t = lawks.Range(&quot;liste_dest&quot;).Find(what:=ledest, lookat:=xlWhole, LookIn:=xlValues)

With données_dest
        Set .lalistedest = lawks.Range(&quot;Détail_&quot; &amp; CStr(t.Value))
        .obj = t.Offset(0, 1).Value
        .lapj = t.Offset(0, 2).Value
        Set .lecorps = lawks.Range(&quot;corps_&quot; &amp; t.Value)
End With

Set t = Nothing

Set lawks = Nothing

End Function</pre></td></tr></table></pre>
</div>Le corps de texte Excel (qui peut contenir comme ici une image) sera enregistré en tant qu’image.<br />
Celle-ci sera importée dans le mail au moment de l’envoi. <br />
Ce processus évite la gestion, parfois fastidieuse, d’un corps de texte dans Outlook.<br />
<br />
L’activation de 3 références est nécessaire<br />
- Microsoft Scripting Run Time (pour la gestion des images enregistrées)<br />
- Library Outlook (pour la gestion de l’item)<br />
- Library Word (pour la gestion de du corps de texte)<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br /></div></td><td valign="top"><pre style="margin: 0">Public Sub envoi_mails_groupés()

Dim c As Range

For Each c In Worksheets(&quot;liste_mails&quot;).Range(&quot;liste_dest&quot;)

        Call Envoi_Mail(c.Value)

Next c

Application.DisplayAlerts = True

End Sub

Sub Envoi_Mail(letoto As String)

 Dim lobjet As String
 Dim str_pj As String
 Dim rng_dest As Range
 Dim rng_body As Range
 
With données_dest(letoto)
        lobjet = .obj
        str_pj = .lapj
        Set rng_dest = .lalistedest
        Set rng_body = .lecorps
End With

Dim lapj As String
lapj = ThisWorkbook.Path &amp; Application.PathSeparator &amp; str_pj &amp; &quot;.pdf&quot;

Dim MonItem As Outlook.MailItem

'Requiert une référence à la bibliothèque d'objets Outlook
Dim Applic_Outlook As Outlook.Application
Dim édit_ol As Outlook.Inspector
'Requiert une référence à la bibliothèque d'objets Word
Dim wdDoc As Word.Document

Dim liste_adresses As String

liste_adresses = &quot;&quot;
'For Each c In données_dest(letoto).lalistedest
'        liste_adresses = liste_adresses &amp; c.Value &amp; &quot;;&quot;
'Next c
Dim tb() As Variant
ReDim tb(1 To rng_dest.Count)
tb = Application.Transpose(rng_dest)

liste_adresses = Join(tb, &quot;;&quot;)

Application.ScreenUpdating = False

'Crée l'objet Outlook
Set Applic_Outlook = CreateObject(&quot;Outlook.Application&quot;)

'Créer l'élément de mail et le transmettre
Set MonItem = Applic_Outlook.CreateItem(olMailItem)

With MonItem
        
        '.BodyFormat = olFormatHTML
        .To = liste_adresses
        .Subject = lobjet
        .Display
        .Attachments.Add Source:=lapj

        On Error Resume Next
        AppActivate lobjet &amp; &quot; - Message (HTML)&quot; ' Active Outlook
        AppActivate lobjet &amp; &quot; - Message&quot; ' Active Outlook
        On Error GoTo 0
        
        Set édit_ol = .GetInspector
        
        'Portée module
        Set wdDoc = édit_ol.WordEditor
        
        'importation du corps de texte dans le corps de message
        Call save_img(données_dest(letoto).lecorps)

        With wdDoc
                'New 10 Décembre 2019
                .InlineShapes.AddPicture Filename:=fullname_img
                'Image redimensionnée
                .InlineShapes(1).Width = 600
        End With

        Set wdDoc = Nothing
        Set édit_ol = Nothing

        .Send
        
        Application.CutCopyMode = False
        
End With

Set MonItem = Nothing
Set Applic_Outlook = Nothing

Set rng_dest = Nothing
Set rng_body = Nothing

ActiveWindow.DisplayGridlines = True

End Sub

Public Sub save_img(corpstexte As Range)

'Création d'un fichier image sur le répertoire de ce classeur

'---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Dim s As Shape
With Worksheets(&quot;liste_mails&quot;)
        
        .Activate
        
        ActiveWindow.DisplayGridlines = False
        
        'Précaution
        If .Shapes.Count &gt; 0 Then
                For Each s In .Shapes
                        With s
                                If (InStr(.Name, &quot;Venise&quot;) + InStr(.Name, &quot;Rome&quot;)) = 0 Then .Delete
                        End With
                Next s
        End If
        
End With

'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Dim texte_date As String, name_img As String

texte_date = Format(Date, &quot;yyyymmdd&quot;)
name_img = &quot;Image_&quot; &amp; texte_date &amp; &quot;.jpg&quot;
fullname_img = ThisWorkbook.Path &amp; &quot;\&quot; &amp; name_img

'----------------------
Dim Fso As Scripting.FileSystemObject
Dim SourceFolder As Scripting.Folder
Dim FileItem As Scripting.file
 
Set Fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set SourceFolder = Fso.GetFolder(ThisWorkbook.Path)
 
For Each FileItem In SourceFolder.Files
 
        With FileItem
               'Debug.Print .Name
               If InStr(.Name, &quot;jpg&quot;) &gt; 0 Then
                     If InStr(.Name, name_img) = 0 Then Kill .Path
               End If
        End With
 
Next FileItem

Set SourceFolder = Nothing
Set Fso = Nothing
 
'----------------------

Application.ScreenUpdating = False

'Dim lechart As Object, hPicAvail As Long
Dim lechart As Object

With Worksheets(&quot;liste_mails&quot;)

    
    Set lechart = .ChartObjects.Add(0, 0, 1, 1).Chart
    
         CreateObject(&quot;htmlfile&quot;).parentwindow.clipboardData.clearData (&quot;Text&quot;)  'on vide le clipboard entre chaque copie pour tester vraiment le available
        
        With lechart.Parent
                 
                 .Width = corpstexte.Width
                 .Height = corpstexte.Height
                 .Left = corpstexte.Left + corpstexte.Width + 20:
                 
                 corpstexte.CopyPicture Appearance:=xlScreen, Format:=xlPicture
                 
                 .Select
                 
                 Do
                       DoEvents
                 Loop Until .Chart.Pictures.Count = 0
                 
                 .Chart.Paste
                 
                 'Do
                 '      DoEvents
                 'Loop While .Chart.Pictures.Count = 0
                 
                 With .Chart
                       .Export Filename:=fullname_img, FilterName:=&quot;jpg&quot;
                 End With
                 
                 .Delete
                 
           End With
           
      Set lechart = Nothing
      
End With

End Sub</pre></td></tr></table></pre>
</div>A noter, en ce qui concerne les destinataires, plutôt que boucler sur une suite de valeurs pour constituer, par concaténation, une chaîne de caractères, je préfère lier les éléments d'une variable tableau par le séparateur &quot;;&quot;.<br />
Ceci par la fonction &quot;Join&quot;.<br />
<br />
Par la simple activation d'un bouton de commande, la procédure &quot;envoi_mails_groupés&quot; procèdera à l'adresse des 2 mails.<br />
<br />
2 développements annexes à toute fin utile<br />
<br />
<u><b>1 - Suppression signature par défaut </b></u>(peut être pratique si celle-ci fait partie du corps de texte dans le cas, par exemple, d’expéditeurs différents<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td valign="top"><pre style="margin: 0">Sub TestDeleteSig()
    Dim objMsg As Outlook.MailItem
    Set objMsg = Application.CreateItem(olMailItem)
    objMsg.Display
    Call DeleteSig(objMsg)
    Set objMsg = Nothing
End Sub

Sub DeleteSig(msg As Outlook.MailItem)
    Dim objDoc As Word.Document
    Dim objBkm As Word.Bookmark
    On Error Resume Next
    Set objDoc = msg.GetInspector.WordEditor
    Set objBkm = objDoc.Bookmarks(&quot;_MailAutoSig&quot;)
    If Not objBkm Is Nothing Then
        objBkm.Select
        objDoc.Windows(1).Selection.Delete
    End If
    Set objDoc = Nothing
    Set objBkm = Nothing
End Sub</pre></td></tr></table></pre>
</div>Des variantes existent à ce sujet.<br />
Notamment, avec ma préférence car il n'y a pas obligation de sélectionner l'objet<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">Dim objBkm As Word.Bookmark
 
           With wdDoc
                    If .bookmarks.Exists(Name:=&quot;_MailAutoSig&quot;) Then _
                                .bookmarks(Index:=&quot;_MailAutoSig&quot;).Range.Delete
            End With</pre></td></tr></table></pre>
</div>ou bien<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">    Set objBkm = wdDoc.bookmarks(&quot;_MailAutoSig&quot;)
    If Not objBkm Is Nothing Then objBkm.Range.Delete
    Set objBkm = Nothing</pre></td></tr></table></pre>
</div>Ce dernier code est sans doute adaptable à d'autres objets, comme une feuille de travail par exemple.<br />
<br />
<u><b>2 - Gestion d’Outlook</b></u> (ouverture si fermé, fermeture puis ouverture afin d’obtenir une session propre) <br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br /></div></td><td valign="top"><pre style="margin: 0">Option Explicit
 
 Public Declare Function SetWindowPos _
        Lib &quot;user32&quot; ( _
            ByVal Hwnd As Long, _
            ByVal hWndInsertAfter As Long, _
            ByVal x As Long, ByVal y As Long, _
            ByVal cx As Long, ByVal cy As Long, _
            ByVal wFlags As Long) _
    As Long

Public Const SWP_NOSIZE = &amp;H1
Public Const SWP_NOMOVE = &amp;H2
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2

Sub Test_Open_Outlook()

Dim Chemin As String
Chemin = &quot;C:\Program Files (x86)\Microsoft Office\root\Office16\OUTLOOK.exe&quot;
 
Dim Appli As Object
Dim session_Outlook As New Outlook.Application
Dim Ole_appli As Object
 
Dim typouv As Byte
typouv = 1

On Error Resume Next
Set Appli = GetObject(, &quot;Outlook.Application&quot;)
 
Call ShowXLOnTop(True)

If Appli Is Nothing Then

      'Ouvre Outlook
        session_Outlook = Shell(Chemin, typouv)

Else
        
        'Fermeture de l'application Outlook si ouverte et réouverture d'une nouvelle
        Call KillProcess(&quot;Outlook.exe&quot;)
        
        session_Outlook = Shell(Chemin, typouv)

End If
 
Set Ole_appli = Nothing
Set Appli = Nothing

Call ShowXLOnTop(False)

End Sub

Sub ShowXLOnTop(ByVal OnTop As Boolean)
    Dim xStype As Long

Dim xHwnd As Long

If OnTop Then
        xStype = HWND_TOPMOST
    Else
        xStype = HWND_NOTOPMOST
    End If
    Call SetWindowPos(Application.Hwnd, xStype, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)
End Sub

 Public Function KillProcess(ByVal ProcessName As String) As Boolean
    Dim svc As Object
    Dim sQuery As String
    Dim oproc
    Set svc = GetObject(&quot;winmgmts:root\cimv2&quot;)
    sQuery = &quot;select * from win32_process where name='&quot; &amp; ProcessName &amp; &quot;'&quot;
    For Each oproc In svc.execquery(sQuery)
        oproc.Terminate
    Next
    Set svc = Nothing
End Function</pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>MarcelG</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/319586-marcelg/b8983/envoi-instantane-plusieurs-mails-destinataires-objets-pieces-jointes-corps-texte-differents/</guid>
		</item>
	</channel>
</rss>
