<?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 - patricktoulon</title>
		<link>https://www.developpez.net/forums/blogs/301978-patricktoulon/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Mon, 07 Sep 2026 15:34:50 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 - patricktoulon</title>
			<link>https://www.developpez.net/forums/blogs/301978-patricktoulon/</link>
		</image>
		<item>
			<title>un pseudo evenement Application_AfterResize</title>
			<link>https://www.developpez.net/forums/blogs/301978-patricktoulon/b7694/pseudo-evenement-application_afterresize/</link>
			<pubDate>Fri, 28 Jun 2019 08:36:09 GMT</pubDate>
			<description>bonjour a tous  
 
juste une...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">bonjour a tous <br />
<br />
juste une petite astuce pour créer un évènement AfterResize de l'application qui n'existe pas <br />
l'évènement window_Resize ne fonctionnant qu'avec le Windows du classeur il est donc inutilisable pour la fenêtre application<br />
<br />
cette méthode demande très peu de ressource puisque la surveillance se fait avec l'évènement on_update de la commandbars<br />
une alternative au timer (api) ou application ontime en boucle et autre <br />
de plus quand  le update est déclenché il est non bloquant pour le reste des macros  ou l'utilisation de Excel<br />
pour l'exemple je zoom une plage définie pour la garder visible entièrement a chaque instant <br />
<br />
a placer  dans le module thisworkbook<br />
<br />
[CODE=vba]<br />
Option Explicit<br />
Private WithEvents Cmbrs As CommandBars<br />
Dim oldwidth As Double<br />
Dim oldheight As Double<br />
'<br />
'evenement commandbars<br />
Private Sub Cmbrs_OnUpdate()<br />
    With Application<br />
        .CommandBars.FindControl(ID:=2040).Enabled = Not .CommandBars.FindControl(ID:=2040).Enabled<br />
        If oldheight &lt;&gt; .Height Or .Width &lt;&gt; oldwidth Then<br />
            Application_AfterResize<br />
        End If<br />
    End With<br />
End Sub<br />
'<br />
Private Sub Workbook_BeforeClose(Cancel As Boolean)<br />
 Application.CommandBars.FindControl(ID:=2040).Enabled = True<br />
End Sub<br />
'<br />
Private Sub Workbook_Open()<br />
    Set Cmbrs = Application.CommandBars<br />
End Sub<br />
'<br />
'<br />
Private Sub Application_AfterResize()<br />
   Dim cel As Range<br />
   Set cel = Selection<br />
    Range(&quot;A1:J30&quot;).Select<br />
    ActiveWindow.Zoom = True<br />
    oldheight = Application.Height<br />
    oldwidth = Application.Width<br />
    cel.Select<br />
End Sub<br />
[/CODE]<br />
<br />
testé sur 2007</blockquote>

]]></content:encoded>
			<dc:creator>patricktoulon</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/301978-patricktoulon/b7694/pseudo-evenement-application_afterresize/</guid>
		</item>
		<item>
			<title>un msgbox temporaire sans  boucle  ontime  sans wait  sans api SetTimer etc.. ..  dans un userform</title>
			<link>https://www.developpez.net/forums/blogs/301978-patricktoulon/b7163/msgbox-temporaire-boucle-ontime-wait-api-settimer-etc-userform/</link>
			<pubDate>Wed, 20 Mar 2019 12:28:14 GMT</pubDate>
			<description><![CDATA[[CENTER][B][SIZE=3]...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">[CENTER][B][SIZE=3] collection  boite de dialogue perso episode 7[/SIZE][/B][/CENTER]<br />
<br />
[QUOTE=patricktoulon;10836043]Bonjour a tous <br />
il y a beaucoup d'exemple  sur ce sujet m[B]ais celui la n'y est pas <br />
[/B]<br />
 je vous propose aujourd'hui  avec si peu de code un :[CENTER][SIZE=3][B]un msgbox temporaire [/B][B]avec un userform <br />
[/B][B]sans  boucle!! ,   sans app.ontime!!    ,   sans app.wait !!   ,   sans api SetTimer  !!!  etc.... <br />
[COLOR=#b22222]ET non!! bloquant<br />
que vous pouvez personaliser a votre gout <br />
<br />
[/COLOR][/B][/SIZE][/CENTER]<br />
[SIZE=3][SIZE=1]comment allons nous faireet bien dans une autre discussion qui n'avait rien a voir avec ce projet ,on m'a fait decouvrir quelque chose <br />
<br />
[/SIZE][/SIZE]<br />
[CENTER](((a savoir [B][I]classer la commandbars et créer l'evenement OnUpdate))) <br />
[/I][/B][/CENTER]<br />
[SIZE=3][SIZE=1]cet evenement se declenche quand on modifie un bouton dans la commandbars<br />
mais nous alons créer cet evenement[B] non pas dans un module classe mais [/B]dans le userform lui meme qui sera le msgbox <br />
apres tout il me semble avoir entendu dire que les modules userform sont des classes ;)<br />
 on va donc prendre un Userform  lui mettre un textbox multiligne  avec scroll vetical pour un eventuel grand texte ,avec saut de ligne  <br />
et un bouton( vous placez le textbox comme vous voulez)<br />
pour ma part je l'ai placé comme il est dans un msgbox classique <br />
<br />
voyons voir  une image parle mieux que des mots <br />
 [ATTACH=CONFIG]459601[/ATTACH]<br />
<br />
[B]Maintenant que nous avons notre msgbox(X)  ( je l'ai appelé [B][COLOR=#b22222]MsgBoxX[/COLOR])<br />
[/B] <br />
On va lui mettre ce code ci dessous <br />
<br />
[/B][CODE]Option Explicit<br />
Private WithEvents Cmbrs As CommandBars    'creation de l'object commandbars events<br />
Public delay As Long    ' delay d'affichage<br />
Public title As String    'titre  de la caption<br />
Public PosX As Long    'position horizontale<br />
Public PosY As Long    ' position verticale<br />
Dim t[/CODE][/SIZE][/SIZE][CODE]<br />
[SIZE=3][SIZE=1]'  !!!!!!!!!!!evenement commandbars!!!!!!!!!!!<br />
Private Sub Cmbrs_OnUpdate()<br />
    Application.CommandBars.FindControl(ID:=2040).Enabled = Not Application.CommandBars.FindControl(ID:=2040).Enabled<br />
    If Timer - t &gt;= delay - 0.5 Then Application.CommandBars.FindControl(ID:=2040).Enabled = True: Unload Me<br />
End Sub[/SIZE][/SIZE]<br />
[SIZE=3][SIZE=1]<br />
'l'ecriture dans le textbox est bloquée<br />
Private Sub message_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer): KeyCode = 0: End Sub[/SIZE][/SIZE]<br />
 <br />
Private Sub CommandButton1_Click(): Unload Me: End Sub    ' bouton fermer<br />
Private Sub UserForm_Activate()<br />
    Me.Caption = IIf(title &lt;&gt; &quot;&quot;, title, &quot;Message d' Alerte !!&quot;)<br />
    t = Timer<br />
    If PosX &lt;&gt; 0 And PosY &lt;&gt; 0 Then Me.Left = PosX: Me.Top = PosY<br />
    Set Cmbrs = Application.CommandBars<br />
    Application.CommandBars.FindControl(ID:=2040).Enabled = Not Application.CommandBars.FindControl(ID:=2040).Enabled' va avoir pour effet de declencher l'evenement de la commandbars<br />
End Sub<br />
[/CODE]<br />
<br />
voila pour le userform <br />
<br />
[B]voyons maintenant pour l'appel de ce [COLOR=#b22222][B]MsgBoxX[/B][/COLOR]<br />
[/B][CODE]<br />
Option Explicit<br />
'model MsgBoxX<br />
Sub test()<br />
    With MsgBoxX<br />
        With .message<br />
            .Value = &quot;ceci est une message test!!! &quot; &amp; vbCrLf &amp; &quot;temporaire &quot; &amp; vbCrLf &amp; &quot;DEVELOPPEZ.COM&quot;<br />
            'la ligne ci dessous est facultative c'est les options du textbox<br />
            .BackColor = vbBlue: .ForeColor = RGB(255, 200, 100): .Font.Name = &quot;arial black&quot;<br />
        End With<br />
        .title = &quot;message de test !&quot;    '(facultatif)<br />
        .PosX = 50    '(facultatif)<br />
        .PosY = 100    '(facultatif)<br />
        .delay = 3    '(obligatoire)<br />
        .Show 0<br />
    End With<br />
End Sub<br />
[/CODE]<br />
 tout les lignes taguées &quot;(facultatif)&quot; comme le mot l'indique ne sont pas obligatoire <br />
 <br />
une petite demo avec l'affichage  pendant 2 secondes <br />
<br />
[ATTACH=CONFIG]459605[/ATTACH]<br />
voila j'ai mon compteur Windows 7 qui bouge pas d'un poil  il n'y a donc pas de consomation excessive de processeur ou memoire  comme avec d'autre procédés <br />
<br />
pour info pour que ca fonctionne il faut que le userform soit non modal ([B].show [COLOR=#b22222]0[/COLOR])[/B]<br />
<br />
<br />
merci a [URL=&quot;https://www.developpez.net/forums/u901761/rafaaj2000/&quot;]RAFAAJ2000[/URL] de m'avoir fait decouvrir la possibilité de créer cet evenement commandbars ;)<br />
 comme lui en a trouvée une  je suppose que les idées  de mise en application  vont fleurir ( partagez)<br />
<br />
qu'en pensez vous <br />
 <br />
[SIZE=3] <br />
[SIZE=1] <br />
 <br />
[/SIZE][/SIZE][/QUOTE]</blockquote>


<!-- attachments -->
	<div class="blogattachments">
		
		
			<fieldset class="blogcontent">
				<legend>Images attachées</legend>
				
			</fieldset>
		
		
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>patricktoulon</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/301978-patricktoulon/b7163/msgbox-temporaire-boucle-ontime-wait-api-settimer-etc-userform/</guid>
		</item>
		<item>
			<title>collection boite de dialogue perso episode 6</title>
			<link>https://www.developpez.net/forums/blogs/301978-patricktoulon/b6972/collection-boite-dialogue-perso-episode-6/</link>
			<pubDate>Sun, 10 Feb 2019 15:43:35 GMT</pubDate>
			<description><![CDATA[[I][B][COLOR=#b22222][SIZE=2]...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">[I][B][COLOR=#b22222][SIZE=2] collection boite de dialogue perso episode 6<br />
[/SIZE][/COLOR][/B][/I]<br />
 un calendrier dans son propre formulaire utilisable sur sheets ou textbox et combobox<br />
<br />
et si au click droit sur cellule on avait un calendrier qui s'affiche pour mettre la date choisi dans celles ci<br />
<br />
et si  au click droit sur un textbox on avait  le calendrier qui s'affiche  pour choisir une date <br />
<br />
et pareil dans une combobox  a fin de ne pas etre obligé de derouler des kilometres une combo pour choisir une date <br />
<br />
et si on avait la possibilité de choisr sans sub ou fonction suplementaire  le format de sortie <br />
<br />
et si il semettais en francais ou en US(anglais) en fonction de la region parametrée dans le system <br />
<br />
je vous propose cette version de mon calendrier dans un userform <br />
<br />
elle peut  vous sortir les 3 format  application.international(xldateorder )<br />
<br />
et un dernier qui se contente de vous sortir la date en fonction de celle du system automatiquement <br />
<br />
<br />
je rapelle qu'il es question ici d'avoir un calendrier dispo meme pour ceux qui sont en 64 bits <br />
etant donné que je n'utilise toujours pas de control calendart et autre datepicker ,seulement des controls generiques dispos dans toute versions d'excel <br />
methode d'utilisation dans un sheets <br />
<br />
[CODE]Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)<br />
    Dim dat<br />
    If Target.Column = 1 And Target.Cells.Count = 1 Then<br />
        Cancel = True<br />
        With Calendrier<br />
            Set .Destination = Target<br />
            .Show<br />
            If .DateResult &lt;&gt; False Then Target = .DateResult<br />
            Unload Calendrier<br />
        End With<br />
    End If<br />
End Sub<br />
[/CODE]<br />
<br />
[ATTACH=CONFIG]448779[/ATTACH]<br />
<br />
<br />
<br />
<br />
exemple d'utilisation dans des textbox d'un userform  sous divers format <br />
<br />
<br />
[ATTACH=CONFIG]448783[/ATTACH]<br />
[CODE]Option Explicit<br />
'<br />
<br />
Private Sub ComboBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)<br />
    If Button = 2 Then<br />
        With Calendrier<br />
            Set .Destination = ComboBox1<br />
            .Show<br />
<br />
            If .DateResult &lt;&gt; False Then ComboBox1.Value = .DateResult: If ComboBox1.ListIndex = -1 Then ComboBox1.Value = &quot;Nofound!!&quot;<br />
            Unload Calendrier<br />
        End With<br />
    End If<br />
End Sub<br />
'<br />
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer): KeyCode = 0: End Sub<br />
Private Sub TextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)<br />
    If Button = 2 Then<br />
        With Calendrier<br />
            Set .Destination = TextBox1<br />
            .Show<br />
            If .DateResult &lt;&gt; False Then TextBox1.Value = .DateResult<br />
            Unload Calendrier<br />
        End With<br />
    End If<br />
End Sub<br />
'<br />
Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer): KeyCode = 0: End Sub<br />
Private Sub TextBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)<br />
    If Button = 2 Then<br />
        With Calendrier<br />
            Set .Destination = TextBox2<br />
            .region = 0<br />
            .Show<br />
            If .DateResult &lt;&gt; False Then TextBox2.Value = .regionDate0<br />
            Unload Calendrier<br />
        End With<br />
    End If<br />
End Sub<br />
'<br />
Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer): KeyCode = 0: End Sub<br />
Private Sub TextBox3_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)<br />
    If Button = 2 Then<br />
        With Calendrier<br />
            Set .Destination = TextBox3<br />
            .separateur = &quot;-&quot;<br />
            .region = 2<br />
            .Show<br />
<br />
            If .DateResult &lt;&gt; False Then TextBox3.Value = .regionDate2<br />
            Unload Calendrier<br />
        End With<br />
    End If<br />
End Sub<br />
 <br />
'<br />
Private Sub TextBox4_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)<br />
    If Button = 2 Then<br />
        With Calendrier<br />
            Set .Destination = TextBox4<br />
            .region = 1<br />
            .separateur = &quot;-&quot;<br />
            .Show<br />
<br />
            If .DateResult &lt;&gt; False Then TextBox4.Value = .regionDate1<br />
            Unload Calendrier<br />
        End With<br />
    End If<br />
End Sub<br />
[/CODE]<br />
exemple en piece jointe</blockquote>


<!-- attachments -->
	<div class="blogattachments">
		
		
			<fieldset class="blogcontent">
				<legend>Images attachées</legend>
				
			</fieldset>
		
		
		
			<fieldset class="blogcontent">
				<legend>Fichiers attachés</legend>
				<ul>
					
				</ul>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>patricktoulon</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/301978-patricktoulon/b6972/collection-boite-dialogue-perso-episode-6/</guid>
		</item>
		<item>
			<title>forcer la saisie de date avec masque dynamique</title>
			<link>https://www.developpez.net/forums/blogs/301978-patricktoulon/b6496/forcer-saisie-date-masque-dynamique/</link>
			<pubDate>Thu, 01 Nov 2018 16:15:44 GMT</pubDate>
			<description><![CDATA[[CENTER][B]UN DATEBOX MULTI...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">[CENTER][B]UN DATEBOX MULTI FORMAT DYNAMIQUE AVEC MASQUE DE SAISIE<br />
EPISODE 1[/B][/CENTER]<br />
<br />
bonjour a tous<br />
c'est un exercice qui a été compliqué au depart et nombreux ont été les essais qui ont pu sortir de ma tete et  bien mal pensés<br />
<br />
[B]cahier des charges pour ce projet <br />
[/B]<br />
[LIST=1][*][B]imposer et avoir le choix [/B]un format de date dans un textbox[*]avoir un [B]masque [/B]de saisie en l'occurence(&quot;__/__/____&quot;)[*][B]restreindre[/B] l'utilisation des touches  ( pavé numerique (haut du clavier  ou pavé a droite du clavier)) ,la touche back , suppr, fleche(droite et gauche)[*][B]avertir et annuler[/B] la frappe quand une date (completement rédigée ou pas)  est éronée[*][B]mise en evidence [/B]de l'erreur en selectionnant la partie de la date ou partie de date tapée en erreur[*][B]utilisation minimum [/B]de variable globale[B] voir pas du tout  [/B](economie memoire)[*][B]pouvoir naviguer [/B]entre les parties de la date avec les touche de navigation(TAB et fleches)[*][B]revenir en arriere[/B] avec la [B]touche back [/B]avec remise en place de la partie homologue du mask[*][B]transportabilité [/B][*]que ce ne soit pas une [B]usine a gaz [/B][*]j'ai mis en place le masque des la premiere touche tapée quelle quel soit ( vous n'avez donc pas a le mettre en mode edition dans VBE)[/LIST]<br />
<br />
bref rendre impossible de taper une date eronnée sans en etre averti<br />
<br />
et cela avec un seul evenement textbox (dans cet exercice j'ai choisi le [B]keydown)[/B]<br />
<br />
il y a divers exemple ici et la  je vous laisse le soins d'en apprecier  leur valeur en fonction du meme cahier des charges <br />
<br />
<br />
pour que ce code puisse servir a plusieur textboxs sur un meme [B]userform [/B]je l'ai fait dans une sub que l'on mettra dans un module standard<br />
<br />
rien ne vous empeche cela dit d'en faire une private sub et la mettre dans le [B]module du userform[/B]<br />
<br />
 j'ai aéré le code pour plus d'aisance dans la  lisibilité  du code <br />
<br />
voila donc la sub <br />
[CODE=vba]Option Explicit<br />
'Date:01/10/2018<br />
'auteur:-------------------------patricktoulon sur developpez.com et excel download<br />
'projet:-------------------------datebox multi format avec mask de saisie dynamique au format injecté dans l'appel<br />
'version:------------------------3.2<br />
'format de date accepté:---------&quot;dd/mm/yyyy&quot; : &quot;mm/dd/yyyy&quot; : &quot;yyyy/mm/dd&quot;<br />
'touche clavier utilisable:------TAB :ENTER :FLECHES (DROITE et GAUCHE) : pavé numerique (HAUT et BAS)<br />
'action 1:-----------------------positionnement automatique pendant la saisie<br />
'action 2:-----------------------navigation dans les parties de la date(jour/mois/année)avec les touches  TAB et fleches(droite et gauche)<br />
'action 3:-----------------------retour et selection automatique en cas d'erreur dans la partie qui viend d'etre tapée<br />
'modifications:le 07/10/2018-----ajout du Rollover sur les touches de navigation(ergonomie)<br />
'modifications le 08/10/2018-----amélioration de la gestion des touches de navigation et de la touche back(ergonomie)(le next segment pris en compte au selstart+1)<br />
'modifications le 08/10/2018-----ajout du test si le format injecté n'est pas accepté et de la sortie avec message<br />
'modifications le 12/10/2018-----correction l'erreur non relevée du &quot;00&quot; mois et jour<br />
<br />
Sub control_saisiex(txt, KeyCode, Optional Forme As String = &quot;dd/mm/yyyy&quot;)<br />
    Dim t$, xL&amp;, X&amp;, M&amp;, J&amp;, A&amp;, Ji&amp;, Mi&amp;, Ai&amp;, finD&amp;, ldate As Date, MasK$<br />
    'calcul des  selstart autorisés pour le keycode 96 to 105 en fonction du format<br />
    Ji = InStr(1, Forme, &quot;d&quot;): Mi = InStr(1, Forme, &quot;m&quot;): Ai = InStr(1, Forme, &quot;y&quot;)<br />
    'Création du  mask en fonction du format injecté dans l'apel<br />
    If Ai = 7 Then finD = 6 Else finD = 8    'repere pour le next selstart avec les touches de navigation<br />
    Select Case Forme<br />
    Case &quot;yyyy/mm/dd&quot;: MasK = &quot;____/__/__&quot;: Case &quot;dd/mm/yyyy&quot;, &quot;mm/dd/yyyy&quot;: MasK = &quot;__/__/____&quot;<br />
    Case Else: MsgBox &quot;le format demandé n'est pas accepté&quot;: KeyCode = 0: Exit Sub    'si un format injecté nest pas valide on sort<br />
    End Select<br />
    With txt<br />
        If .Value = &quot;&quot; Then .Value = MasK                                       'au cas ou le masque n'y serait pas au depart<br />
        t = .Value                                                              'T prend la valeur du textbox<br />
        If TypeName(.Parent) = &quot;UserForm&quot; Then .ControlTipText = Forme          ' bulle indiquant le format qui a été injecté<br />
        If t = MasK Then .SelStart = 0                                          ' on se positionne a gauche si pas de date(mask vierge)<br />
        X = .SelStart: xL = .SelLength                                          'on determine la position et le length de la selection<br />
        If KeyCode &gt;= 48 And KeyCode &lt;= 57 Then KeyCode = KeyCode + 48          ' pour ce qui n'ont pas le pavé numerique et se servent des chiffre en haut de clavier<br />
        Select Case KeyCode<br />
            '_____________________________________________________________________________________________________<br />
            'Gestion  des touches du  pavé numerique(haut et bas)<br />
        Case 96 To 105<br />
            Select Case X<br />
            Case Ji - 1 To Ji, Mi - 1 To Mi, Ai - 1 To Ai + 2<br />
                Mid$(t, X + 1, IIf(xL = 0, 1, xL)) = Chr(KeyCode - 48) &amp; Mid$(MasK, X + 2): .Value = t: .SelStart = X + 1<br />
            Case Else: KeyCode = 0<br />
            End Select<br />
            If Mid$(t, X + 2, 1) = &quot;/&quot; Then .SelStart = X + 2<br />
            KeyCode = 0<br />
            '_______________________________________________________________________________________<br />
            'controle de la validité de la date ici<br />
            J = Val(Mid$(t, Ji, 2)): M = Val(Mid$(t, Mi, 2)): A = IIf(Mid$(t, Ai, 4) Like &quot;*_*&quot;, 2000, Val(Mid$(t, Ai, 4)))    'récuperation du jour  mois année en fonction de l'etat de la saisie<br />
            J = IIf(J = 0, 1, J): M = IIf(M = 0, 1, M): ldate = DateSerial(A, M, J):  'date théorique ou reele dynamique<br />
            If Day(ldate) &lt;&gt; J Or Month(ldate) &lt;&gt; M Or Year(ldate) &lt;&gt; A Or Val(Mid$(t, Ji, 1)) &gt; 3 Or Val(Mid$(t, Mi, 1)) &gt; 1 Or Mid$(t, Ji, 2) = &quot;00&quot; Or Mid$(t, Mi, 2) = &quot;00&quot; Then  'Condition d 'erreur globale<br />
                X = InStrRev(Mid$(t, 1, X), &quot;/&quot;): xL = IIf(X = Ai - 1, 4, 2): Mid(t, X + 1, xL) = Mid(MasK, X + 1, xL): .Value = t: .SelStart = X: .SelLength = xL: Beep    'repositionnement et annulation de la partie en erreur<br />
            End If<br />
            '_____________________________________________________________________________________________________<br />
            'Gestion de la Touche back(retours en arrière)<br />
        Case 8<br />
            If InStr(Mid$(t, 1, X), &quot;/&quot;) &gt; 0 Then X = InStrRev(Mid$(t, 1, InStrRev(Mid$(t, 1, X), &quot;/&quot;) - IIf(Mid(t, X, 1) = &quot;/&quot;, 1, 0)), &quot;/&quot;) Else X = 0<br />
            KeyCode = 0: xL = IIf(X = Ai - 1, 4, 2): Mid$(t, X + 1, xL) = &quot;____&quot;: .Value = t: .SelStart = IIf(t = MasK, 0, X): .SelLength = IIf(t = MasK, 0, xL)<br />
            '_____________________________________________________________________________________________________<br />
            'Gestion de la Touche suppr(supprimer)remplace la partie selectionnée   par son homologue du  masque<br />
        Case 46<br />
            xL = IIf(xL = 0, 1, xL): KeyCode = 0: Mid$(t, X + 1, xL) = Mid$(MasK, X + 1, xL): .Value = t: .SelStart = IIf(t = MasK, 0, X)<br />
<br />
            '_____________________________________________________________________________________________________<br />
            'gestion de la Touche fleche gauche  deplacement vers la gauche et Rollover<br />
        Case 37<br />
             KeyCode = 0: X = InStrRev(t, &quot;/&quot;, IIf(X = 1, 2, X - 1)): xL = IIf(X = Ai - 1, 4, 2):<br />
            .SelStart = IIf(t = MasK, 0, X): .SelLength = IIf(t = MasK, 0, xL)<br />
<br />
            '_____________________________________________________________________________________________________<br />
            'Gestion de la Touche fleche droite et la touche tab deplacement vers la droite et Rollover<br />
        Case 39, 9<br />
            If InStr(Mid$(t, X + 1), &quot;/&quot;) &gt; 0 Then X = X + InStr(1, Mid$(t, X + 1), &quot;/&quot;) Else X = 0    'x=find si on veut pas que ca tourne<br />
            KeyCode = 0: .SelStart = IIf(t = MasK, 0, X): .SelLength = IIf(t = MasK, 0, IIf(X = Ai - 1, 4, 2))<br />
        Case 13<br />
            If InStr(txt.Value, &quot;_&quot;) Then KeyCode = 0<br />
            '_____________________________________________________________________________________________________<br />
            'Gestion des  autres touches<br />
        Case Else: KeyCode = 0<br />
        End Select<br />
    End With<br />
End Sub<br />
[/CODE] <br />
<br />
 et donc dans le userform OUpour un textbox dans un sheets on l'appelera comme suit avec l'evenement [B]keydown<br />
exemple :<br />
[/B][CODE=vba]Option Explicit<br />
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)<br />
control_saisiex TextBox1, KeyCode, &quot;yyyy/mm/dd&quot;<br />
End Sub<br />
Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)<br />
control_saisiex TextBox2, KeyCode, &quot;dd/mm/yyyy&quot;<br />
End Sub<br />
Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)<br />
control_saisiex TextBox3, KeyCode, &quot;yyyy/mm/dd&quot;<br />
End Sub<br />
Private Sub TextBox4_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)<br />
control_saisiex TextBox4, KeyCode 'sans argument le format par defaut est francais<br />
End Sub<br />
<br />
[/CODE]<br />
<br />
pour le cas ou avec la souris on clique sur un autre control et donc sortie du textbox en ayant pas une date correcte<br />
on bloque la sortie  avec le before update<br />
mais ca reste a la charge du developpeur: en effet les possibilité en fonction de la sortie peuvent etre diverses et variée<br />
le travaille ici a consisté uniquement a controler la saisie <br />
<br />
mais bien que l'on sorte de mon projet qui est l'utilisation du keydown , il est interessant et utile de le proposer<br />
un exemple selon pijaku :<br />
[CODE=vba]Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) <br />
   Cancel = Not IsDate(TextBox1.Value)<br />
End Sub<br />
[/CODE]<br />
<br />
et pour proteger le textbox contre la modification par vba <br />
<br />
[CODE=vba]Private Sub TextBox1_Change()<br />
   If TextBox1 &lt;&gt; ActiveControl Then<br />
      If Not IsDate(TextBox1.Value) Then TextBox1.Value = &quot;__/__/____&quot;<br />
   End If<br />
End Sub<br />
[/CODE]<br />
<br />
<br />
Merci pijaku pour les tests<br />
<br />
un classeur en exemple en piece jointe</blockquote>


<!-- attachments -->
	<div class="blogattachments">
		
		
		
		
			<fieldset class="blogcontent">
				<legend>Fichiers attachés</legend>
				<ul>
					
				</ul>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>patricktoulon</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/301978-patricktoulon/b6496/forcer-saisie-date-masque-dynamique/</guid>
		</item>
		<item>
			<title>Ma collection de boite de dialogue perso episode 2</title>
			<link>https://www.developpez.net/forums/blogs/301978-patricktoulon/b6274/collection-boite-dialogue-perso-episode-2/</link>
			<pubDate>Fri, 28 Sep 2018 14:13:15 GMT</pubDate>
			<description><![CDATA[[CENTER][B]Episode 2[/B]...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">[CENTER][B]Episode 2[/B]<br />
[COLOR=#b22222][SIZE=2][B]Un calendrier dynamique simple<br />
<br />
[/B][/SIZE][/COLOR][/CENTER]<br />
apres moulte versions dans la meme serie a savoir dans un userform dynamiquement créé voici le pseudo calendar <br />
la encore je n'utilise pas de module classe tout est dans la fonction <br />
<br />
[LIST=1][*]creation de l'userform[*]des bouton et listbox[*]ecriture du code[/LIST]<br />
<br />
la aussi rien n'existe avant /rien n'existe apres  autrement dit le fichier ne reste pas parasité par des modules classe ou userforms inutiles <br />
<br />
[CODE=vba]Option Explicit<br />
'**********************************************************************************************<br />
'                               COLLECTION DE BOITES DE DIALOG PERSO                          *<br />
' modele: calandrier dynamique                                                                *<br />
' version 4.0 07/02/2017 sans module classe                                                   *<br />
' author: patricktoulon sur DVP.com ;alias chamalin2@hotmail.com                              *<br />
'**********************************************************************************************<br />
Function calendrier()<br />
    Dim UsF, ObJ, i&amp;, L&amp;, Jo, J&amp;, t&amp;<br />
    Set UsF = ThisWorkbook.VBProject.VBComponents.Add(3)<br />
    With UsF<br />
        .Properties(&quot;Caption&quot;) = &quot;choisir une date&quot;: .Properties(&quot;Width&quot;) = 130: .Properties(&quot;Height&quot;) = 150:<br />
        .Properties(&quot;Backcolor&quot;) = RGB(230, 230, 230)<br />
        Set ObJ = UsF.Designer.Controls.Add(&quot;Forms.ComBobox.1&quot;)<br />
        With ObJ: .Left = 5: .Top = 5: .Width = 60: .Height = 15: .Name = &quot;mois&quot;: .ListRows = 12: End With<br />
        Set ObJ = UsF.Designer.Controls.Add(&quot;Forms.ComBobox.1&quot;)<br />
        With ObJ: .Left = 70: .Top = 5: .Width = 55: .Height = 15: .Name = &quot;an&quot;: End With<br />
        Jo = Array(, &quot;lun&quot;, &quot;mar&quot;, &quot;mer&quot;, &quot;jeu&quot;, &quot;ven&quot;, &quot;sam&quot;, &quot;dim&quot;)<br />
        L = -12:<br />
        For i = 1 To 7<br />
            L = L + 17<br />
            Set ObJ = UsF.Designer.Controls.Add(&quot;Forms.Label.1&quot;)<br />
            With ObJ: .Left = L: .Top = 22: .Width = 15: .Height = 13: .Name = &quot;tj&quot; &amp; i: .BorderStyle = 0:<br />
                .Caption = UCase(Jo(i)): .BackColor = RGB(100, 100, 200): .ForeColor = vbWhite: .TextAlign = 2<br />
            End With<br />
        Next<br />
<br />
        L = -12: t = 37<br />
        For i = 0 To 41<br />
            L = L + 17: If L &gt;= 119 Then L = 5: t = t + 15<br />
            Set ObJ = UsF.Designer.Controls.Add(&quot;Forms.Label.1&quot;)<br />
            With ObJ: .Left = L: .Top = t: .Width = 15: .Height = 13: .Name = &quot;jour&quot; &amp; i + 1:<br />
                .BorderStyle = 1: .BackColor = RGB(150, 150, 150): .ForeColor = vbWhite: .TextAlign = 2<br />
            End With<br />
        Next<br />
        With .CodeModule<br />
            J = .countoflines<br />
            .insertlines J + 1, &quot;public madate as variant&quot;<br />
            J = .countoflines<br />
            .insertlines J + 1, &quot;function nbjours ( A&amp;,M&amp;)&quot; &amp; vbCrLf &amp; &quot;nbjours = Day(DateSerial(A, M+1 , 0) )&quot; &amp; vbCrLf &amp; &quot;End Function&quot;<br />
            J = .countoflines<br />
            .insertlines J + 1, &quot;Private Sub UserForm_Activate()&quot; &amp; vbCrLf &amp; &quot;Dim i&amp;&quot; &amp; vbCrLf &amp; _<br />
                                &quot;With Me.an: .List = Evaluate(&quot;&quot;ROW(&quot;&quot; &amp; 1 &amp; &quot;&quot;:&quot;&quot; &amp; Year(Date) + 100 &amp; &quot;&quot;)&quot;&quot;): .Value = Year(Date): End With&quot; &amp; vbCrLf &amp; _<br />
                                &quot;With mois: For i = 1 To 12: .AddItem Format(&quot;&quot;01/&quot;&quot; &amp; i &amp; &quot;&quot;/2018&quot;&quot;, &quot;&quot;mmmm&quot;&quot;): Next: .Value = Format(Date, &quot;&quot;mmmm&quot;&quot;): End With&quot; &amp; vbCrLf &amp; &quot;End Sub&quot;<br />
            J = .countoflines<br />
            .insertlines J + 1, &quot;Private Sub grille(A, M&amp;)&quot; &amp; vbCrLf &amp; &quot;Dim NBJ&amp;, x&amp;,i&amp;&quot; &amp; vbCrLf &amp; &quot;NBJ = nbjours(Val(A), M)&quot; &amp; vbCrLf _<br />
                              &amp; &quot;For i = 1 To 42: Me.Controls(&quot;&quot;jour&quot;&quot; &amp; i).Caption = &quot;&quot;&quot;&quot;: Next&quot; &amp; vbCrLf _<br />
                              &amp; &quot;x = Weekday(DateSerial(A, M, 1), vbUseSystemDayOfWeek) - 1&quot; &amp; vbCrLf _<br />
                              &amp; &quot;For i = 1 To NBJ:  With Me.Controls(&quot;&quot;jour&quot;&quot; &amp; i + x): .Caption = i: .BackColor = &amp;H969696: .ForeColor = vbYellow: .TextAlign = 2: End With: Next&quot; &amp; vbCrLf _<br />
                              &amp; &quot;With Me.Controls(&quot;&quot;jour&quot;&quot; &amp; Day(Date) + x): If M = Month(Date) And A = Year(Date) Then .BackColor = vbWhite: .ForeColor = vbRed&quot; &amp; vbCrLf &amp; &quot;End With&quot; &amp; vbCrLf &amp; &quot;End Sub&quot;<br />
            J = .countoflines<br />
            .insertlines J + 1, &quot;Private Sub mois_Change()&quot; &amp; vbCrLf &amp; &quot;grille val(an.Value), mois.ListIndex + 1&quot; &amp; vbCrLf &amp; &quot;End Sub&quot;<br />
            J = .countoflines<br />
            .insertlines J + 1, &quot;Private Sub an_Change()&quot; &amp; vbCrLf &amp; &quot;grille val(an.Value), mois.ListIndex + 1&quot; &amp; vbCrLf &amp; &quot;End Sub&quot;<br />
            J = .countoflines<br />
            .insertlines J + 1, &quot;Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)&quot; &amp; vbCrLf _<br />
                              &amp; &quot;If CloseMode = 0 Then Cancel = True: madate = False: Me.Hide&quot; &amp; vbCrLf &amp; &quot;End Sub&quot;<br />
            J = .countoflines<br />
            For i = 1 To 42<br />
               J = .countoflines<br />
            .insertlines J + 1, &quot;Private Sub jour&quot; &amp; i &amp; &quot;_Click()&quot; &amp; vbCrLf &amp; &quot; If jour&quot; &amp; i &amp; &quot;.Caption &lt;&gt; &quot;&quot;&quot;&quot; Then madate = DateSerial(an.Value, mois.ListIndex + 1, jour&quot; &amp; i &amp; &quot;.Caption): Me.Hide&quot; &amp; vbCrLf &amp; &quot;End Sub&quot;<br />
            Next<br />
        End With<br />
    End With<br />
    VBA.UserForms.Add (UsF.Name)<br />
    With UserForms(UserForms.Count - 1)<br />
        .Show<br />
        calendrier = .madate<br />
    End With<br />
    ThisWorkbook.VBProject.VBComponents.Remove (UsF)<br />
End Function[/CODE]<br />
[B]pour tester[/B]<br />
[CODE=vba]Sub test()<br />
    Dim madate As Variant<br />
    madate = calendrier<br />
    MsgBox madate<br />
End Sub[/CODE]<br />
<br />
ici aussi le projet doit etre approuvé<br />
[B]Sécurité des macros&gt;Paramètres des macros&gt; cocher la case &quot;Accès approuvé au modèle d'objet du projet VBA&quot;.[/B]</blockquote>

]]></content:encoded>
			<dc:creator>patricktoulon</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/301978-patricktoulon/b6274/collection-boite-dialogue-perso-episode-2/</guid>
		</item>
		<item>
			<title>ma collection de boites de dialogue perso</title>
			<link>https://www.developpez.net/forums/blogs/301978-patricktoulon/b6270/collection-boites-dialogue-perso/</link>
			<pubDate>Fri, 28 Sep 2018 06:54:16 GMT</pubDate>
			<description><![CDATA[[CENTER] 
Contrairement a mon...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">[CENTER]<br />
Contrairement a mon abitude de travailler avec des classes j'ai pris un chemin different sur ce theme<br />
les fonctions qui vont suivre concernant des boites de dialogue perso n'utilisent pas de module classe <br />
tout est crée dynamiquement (userform ,controls,code)<br />
rien n'existe avant fonction ,rien n'existe apres que la fonction ai fait son job <br />
tout se passe dans la fonction dans un module standard<br />
<br />
[B]episode 1[/B]<br />
[B]<br />
Boite de dialogue pour changer l'imprimante par defaut de windows ([COLOR=#800000]ne change en rien les parametres d'excel[/COLOR]) <br />
<br />
[/B][/CENTER]<br />
il peut nous arriver de devoir imprimer un ou une liste de fichiers externes sur une imprimante precise <br />
pour cela il nous faut determiner cette imprimante par defaut <br />
donc voici une petite boites de dialogue perso dans un userform qui peut vous permettre de le faire <br />
<br />
[CODE=vba]Option Explicit<br />
'**********************************************************************************************<br />
'                               COLLECTION DE BOITES DE DIALOG PERSO                          *<br />
' modele: dialog selection d'imprimante par defaut dans les parametres WINDOWS pas excel      *<br />
'Utile quand on veut imprimer un fichier externe a l'application sur imprimante particuliere  *<br />
' version 1.0 :-: Date:22/09/2018                                                             *<br />
' author: patricktoulon sur DVP.com ;alias [EMAIL=&quot;chamalin2@hotmail.com&quot;]chamalin2@hotmail.com[/EMAIL]                              *<br />
'**********************************************************************************************<br />
Sub test()<br />
    Dim imprimante<br />
    imprimante = open_dialog_Windows_printer<br />
    MsgBox imprimante<br />
End Sub<br />
Function open_dialog_Windows_printer() As Variant<br />
    Dim ObJ As Object, J%, UsF<br />
    Dim colItems As Object, objItem As Object<br />
    Set UsF = ThisWorkbook.VBProject.VBComponents.Add(3)<br />
    With UsF<br />
        .Properties(&quot;Caption&quot;) = &quot;Choisir une Imprimante Windows&quot;: .Properties(&quot;Width&quot;) = 250: .Properties(&quot;Height&quot;) = 120:<br />
        .Properties(&quot;Backcolor&quot;) = RGB(230, 230, 230)<br />
        Set ObJ = UsF.Designer.Controls.Add(&quot;Forms.ListBox.1&quot;)<br />
        With ObJ: .Left = 5: .Top = 5: .Width = UsF.Properties(&quot;Width&quot;) - 15: .Height = UsF.Properties(&quot;Height&quot;) - 40: .Name = &quot;liste&quot;: .BackColor = vbWhite<br />
            .ColumnCount = 2<br />
        End With<br />
        Set ObJ = UsF.Designer.Controls.Add(&quot;Forms.CommandButton.1&quot;)<br />
        With ObJ: .Left = 250 - 70: .Top = 120 - 42: .Width = 60: .Height = 20: .Name = &quot;annuler&quot;: .Caption = &quot;annuler&quot;: .BackColor = RGB(220, 220, 250): End With<br />
        Set ObJ = UsF.Designer.Controls.Add(&quot;Forms.CommandButton.1&quot;)<br />
        With ObJ: .Left = 250 - 140: .Top = 120 - 42: .Width = 60: .Height = 20: .Name = &quot;Choisir&quot;: .Caption = &quot;Choisir&quot;: .BackColor = RGB(150, 250, 150): End With<br />
        With .CodeModule<br />
            J = .countoflines<br />
            .insertlines J + 1, &quot;&quot;<br />
            .insertlines J + 2, &quot;public newprinter as variant&quot;<br />
            .insertlines J + 3, &quot;'&quot;<br />
            .insertlines J + 4, &quot;Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)&quot;<br />
            .insertlines J + 5, &quot;Cancel=true:newprinter=false: Me.Hide &quot;<br />
            .insertlines J + 6, &quot;End Sub&quot; &amp; vbCrLf &amp; &quot;'&quot;<br />
            .insertlines J + 7, &quot;Private Sub annuler_Click():newprinter=false:me.hide :end sub &quot;<br />
            .insertlines J + 8, &quot;Private Sub choisir_Click()&quot;<br />
            .insertlines J + 10, &quot;Dim imprim as object&quot;<br />
            .insertlines J + 11, &quot;If liste.value &lt;&gt; &quot;&quot;&quot;&quot; Then&quot;<br />
            .insertlines J + 12, &quot;Set imprim = CreateObject(&quot;&quot;WScript.Network&quot;&quot;): imprim.SetDefaultPrinter liste.value&quot;<br />
            .insertlines J + 13, &quot;newprinter = liste.Value: Me.Hide&quot;<br />
            .insertlines J + 14, &quot;Else&quot;<br />
            .insertlines J + 15, &quot;MsgBox &quot;&quot;vous devez en selectionner une !!&quot;&quot;&quot;<br />
            .insertlines J + 16, &quot;End If&quot;<br />
            .insertlines J + 17, &quot;End Sub&quot;<br />
        End With<br />
    End With<br />
    VBA.UserForms.Add (UsF.Name)<br />
    With UserForms(UserForms.Count - 1)<br />
        Set colItems = GetObject(&quot;winmgmts:\\.\root\cimv2&quot;).ExecQuery(&quot;Select * from Win32_Printer&quot;, , 48)<br />
        With .liste<br />
            For Each objItem In colItems<br />
                .AddItem objItem.Name: .List(.ListCount - 1, 1) = IIf(objItem.Default = True, &quot;Par defaut&quot;, &quot;----------&quot;)<br />
            Next<br />
        End With<br />
        .Show<br />
        open_dialog_Windows_printer = .newprinter<br />
    End With<br />
    ThisWorkbook.VBProject.VBComponents.Remove (UsF)<br />
End Function<br />
 <br />
<br />
[/CODE]<br />
[ATTACH=CONFIG]415617[/ATTACH]<br />
<br />
petite precision importante <br />
le project doit etre approuvé <br />
 [B]Sécurité des macros&gt;Paramètres des macros&gt; cocher la case &quot;Accès approuvé au modèle d'objet du projet VBA&quot;.<br />
[/B]merci pijaku pour le rappel[B];)<br />
[/B]</blockquote>


<!-- attachments -->
	<div class="blogattachments">
		
		
			<fieldset class="blogcontent">
				<legend>Images attachées</legend>
				
			</fieldset>
		
		
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>patricktoulon</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/301978-patricktoulon/b6270/collection-boites-dialogue-perso/</guid>
		</item>
	</channel>
</rss>
