XL 2019 texte en filigrane dans une textbox

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

pascal21

XLDnaute Barbatruc
bonjour à tous
dans un userform j'aimerais ne pas utiliser les labels pour indiquer le sujet de la textbox qui va avec (hum!!! déja pas tres clair)
donc, j'aimerais savoir si il est possible d'indiquer "NOM" par exemple dans un textbox pour que je sache ce qu'il faut y mettre?
merci
 
re
@fanch55 le exit il sert a quoi ?😉
petit correctif sur le retour en forecolor vbblack
VB:
Private Sub tbx_Keyup(ByRef tbx, prefixe$, keycode)
     With tbx
     If .Value = prefixe Then .Value = ""
      Select Case keycode
            
            Case 8, 46: If .Value = Left(prefixe, Len(prefixe) - 1) And keycode = 8 Then keycode = 0: .Value = prefixe: .ForeColor = RGB(220, 220, 220): Exit Sub
            
            Case 48 To 90, 96 To 105
            If Left(.Value, Len(prefixe)) = prefixe Then .Value = Mid(.Value, Len(prefixe) + 1): .ForeColor = vbBlack
            
            Case 9, 13
                        
            Case Else
        
        End Select

        If .Value = "" Then .Value = prefixe: .ForeColor = RGB(220, 220, 220)
    End With
End Sub
avec les 3 sub (pseudo event) vous gérez l'entré la sortie (vide,pleine )
 
Faut quand même avouer que le code de @fanch55 (que j'ai un peu simplifié) est super simple et efficace.
Pas d'Enter(), pas d'Exit(), pas de MouseDown(), pas de KeyDown(). Juste Change() et c'est tout.

VB:
Option Explicit

Private Sub TextBox1_Change()
     Controls("Fond_Textbox1").Visible = (Len(TextBox1) = 0)
End Sub

Private Sub TextBox2_Change()
     Controls("Fond_Textbox2").Visible = (Len(TextBox2) = 0)
End Sub

Private Sub UserForm_Initialize()
    SetFond TextBox1, "Nom"
    SetFond TextBox2, "Prénom"
    startupposition = 1
End Sub

Sub SetFond(Ref As Control, Texte_De_Fond As String)
    Const Retrait = 10
 
    With Controls.Add("Forms.Label.1", "Fond_" & Ref.Name, True)
        .ForeColor = &H80000010
        .BackColor = Ref.BackColor
        .Font.Name = Ref.Font.Name
        .Font.Size = Ref.Font.Size
        .Caption = Texte_De_Fond
        .AutoSize = True
        .Move Ref.Left + Retrait, Ref.Top + (Ref.Height - .Height) / 2
    End With
 
    Ref.ZOrder 1
End Sub
NomChamp.gif
 

Pièces jointes

Dernière édition:
et pour éviter au coucou de la lune de venir positionner le caret au milieu des préfixes mettez un selstart au len dans le mouse up ou down
et si vous voulez l'autoriser prenez alors l'exemple de mes textbox formaté avec préfixe ou suffixe qui est déjà tout prêt
on le retrouve dans excelpratique aussi avec ou sans mask de saisie
 
Faut quand même avouer que le code de @fanch55 (que j'ai un peu simplifié) est super simple et efficace.
Pas d'Enter(), pas d'Exit(), pas de MouseDown(), pas de de KeyDown(). Juste Change() et c'est tout.

VB:
Option Explicit

Private Sub TextBox1_Change()
     Controls("Fond_Textbox1").Visible = (Len(TextBox1) = 0)
End Sub

Private Sub TextBox2_Change()
     Controls("Fond_Textbox2").Visible = (Len(TextBox2) = 0)
End Sub

Private Sub UserForm_Initialize()
    SetFond TextBox1, "Nom"
    SetFond TextBox2, "Prénom"
    startupposition = 1
End Sub

Sub SetFond(Ref As Control, Texte_De_Fond As String)
    Const Retrait = 10
 
    With Controls.Add("Forms.Label.1", "Fond_" & Ref.Name, True)
        .ForeColor = &H80000010
        .BackStyle = 0
        .Font.Name = Ref.Font.Name
        .Font.Size = Ref.Font.Size
        .Caption = Texte_De_Fond
        .AutoSize = True
        .Move Ref.Left + Retrait, Ref.Top + (Ref.Height - .Height) / 2
    End With
 
    Ref.ZOrder 1
End Sub
oui c'est vrai
je cite le demandeur
bonjour à tous
dans un userform j'aimerais ne pas utiliser les labels pour indiquer le sujet de la textbox qui va avec (hum!!! déja pas tres clair)
donc, j'aimerais savoir si il est possible d'indiquer "NOM" par exemple dans un textbox pour que je sache ce qu'il faut y mettre?
merci
 
Faut quand même avouer que le code de @fanch55 (que j'ai un peu simplifié) est super simple et efficace.
Pas d'Enter(), pas d'Exit(), pas de MouseDown(), pas de KeyDown(). Juste Change() et c'est tout.
Je savais bien que j'avais un Label superflu mais j'avais mis le textbox en fond transparent .
Le zorder semble également superflu .

L'utilisateur utilisera probablement l'événement change pour récupérer le contenu du Textbox .
J'avais donc évité toute action susceptible de provoquer cet événement
 
pas "on ne va pas mais "je ne vais pas "(ne parle pas pour les autres )
Si le problème se pose pour moi il se pose pour les autres à moins qu'ils n'aient pas envie de tester et se contentent d'un GIF animé.
Perso j'aime bien vérifier et essayer des trucs.
En tous cas, c'est bien que tu aies placé un fichier qu'on peut utiliser directement sans repartir de zéro.
 
dans un userform j'aimerais ne pas utiliser les labels pour indiquer le sujet de la textbox
Évidemment qu'il parle de Labels indépendants définis dans le UserForm précédant la TextBox et indiquant le titre de la Textbox.
Ça n'a rien à voir avec l'artifice subtil de @fanch55 d'utiliser des Labels dynamiquement créés sur les TextBoxes.
Artifice que je conserve pour un usage ultérieur éventuel tant il est simple et efficace.
 
Bonjour,

Ça n'a rien à voir avec l'artifice subtil de @fanch55 d'utiliser des Labels dynamiquement créés sur les TextBoxes.
Artifice que je conserve pour un usage ultérieur éventuel tant il est simple et efficace.
C'est effectivement génial !

Toutefois, j'ai cru constaté un petit "souci" : si je clique sur le libellé grisé, ça ne sélectionne pas la TextBox.
 
@TooFatBoy, tu as raison car les Labels recouvrent les TextBoxes.
Il faut cliquer au-delà du titre du Label.
Il faut faire quelque chose pour contrer ça !
Mais comment intercepter un évènement sur un Control dynamique ?
Toutefois, j'ai cru constaté un petit "souci" : si je clique sur le libellé grisé, ça ne sélectionne pas la TextBox.
Je me demandais bien pourquoi j'étais resté scotché sur 2 labels et que j'avais mis un ZOrder, c'était probablement pour contrer celà
VB:
Sub SetFond(Ref As Control, Texte_De_Fond As String)
Dim Retrait: Retrait = 10
    With Controls.Add("Forms.Label.1", "L0_" & Ref.Name, True)
        .BackColor = vbWhite
        .Move Ref.Left, Ref.Top, Ref.Width, Ref.Height
    End With
    With Controls.Add("Forms.Label.1", "Fond_" & Ref.Name, True)
        .ForeColor = &H80000010:    .BackStyle = 0
        .Font.Name = Ref.Font.Name: .Font.Size = Ref.Font.Size
        .Caption = Texte_De_Fond:   .AutoSize = True
        .Move Ref.Left + Retrait, Ref.Top + (Ref.Height - .Height) / 2
    End With
    Ref.BackStyle = 0
    Ref.ZOrder 0
End Sub
 
re
j'avoue que c'est bien
problème du focus sur click sur labeldynamico résolu
pas besoins d'une usine a gaz
2 controls dynamico / 2events dynamico c'est tout
VB:
Option Explicit
Public WithEvents fond1 As MSForms.Label
Public WithEvents fond2 As MSForms.Label

Private Sub fond1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
TextBox1.SetFocus
End Sub
Private Sub fond2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
TextBox2.SetFocus
End Sub

Private Sub TextBox1_Change()
     Controls("Fond_Textbox1").Visible = (Len(TextBox1) = 0)
End Sub

Private Sub TextBox2_Change()
     Controls("Fond_Textbox2").Visible = (Len(TextBox2) = 0)
End Sub

Private Sub UserForm_Initialize()
    SetFond TextBox1, "Nom", 1
    SetFond TextBox2, "Prénom", 2
    startupposition = 1
End Sub

Sub SetFond(Ref As Control, Texte_De_Fond As String, ByVal index As Long)
    Const Retrait = 10
    
    With Controls.Add("Forms.Label.1", "Fond_" & Ref.Name, True)
        .ForeColor = &H80000010
        .BackColor = Ref.BackColor
        .Font.Name = Ref.Font.Name
        .Font.Size = Ref.Font.Size
        .Caption = Texte_De_Fond
        .AutoSize = True
        .Move Ref.Left + Retrait, Ref.Top + (Ref.Height - .Height) / 2
   If index = 1 Then
   Set fond1 = .Parent.Controls("Fond_" & Ref.Name)
    Else
   Set fond2 = .Parent.Controls("Fond_" & Ref.Name)
   End If
    End With
    
    Ref.ZOrder 1
End Sub
 
re
backcolor superflu backstyle0 et on se soucis pas de la couleur
le nom du textbox associé dans le tag
le zorder c'est les label et 0
VB:
Option Explicit
Public WithEvents fond1 As MSForms.Label
Public WithEvents fond2 As MSForms.Label

Private Sub fond1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Me.Controls(fond1.Tag).SetFocus
End Sub
Private Sub fond2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Me.Controls(fond2.Tag).SetFocus
End Sub

Private Sub TextBox1_Change()
    Controls("Fond_Textbox1").Visible = (Len(TextBox1) = 0)
End Sub

Private Sub TextBox2_Change()
    Controls("Fond_Textbox2").Visible = (Len(TextBox2) = 0)
End Sub

Private Sub UserForm_Initialize()
    SetFond TextBox1, " Nom", 1
    SetFond TextBox2, " Prénom", 2
    startupposition = 1
End Sub

Sub SetFond(Ref As Control, Texte_De_Fond As String, ByVal index As Long)
        With Controls.Add("Forms.Label.1", "Fond_" & Ref.Name, True)
        .ForeColor = &H80000010
        .BackStyle = 0
        .Font.Name = Ref.Font.Name
        .Font.Size = Ref.Font.Size
        .Caption = Texte_De_Fond
        .AutoSize = True
        .Move Ref.Left + 2, Ref.Top + (Ref.Height - .Height) / 2
        .Tag = Ref.Name
        If index = 1 Then
            Set fond1 = .Parent.Controls("Fond_" & Ref.Name)
        Else
            Set fond2 = .Parent.Controls("Fond_" & Ref.Name)
        End If
        .ZOrder 0
    End With
End Sub

après si plus de control sub classing+event unique dans un module classe ou l'userform
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
3
Affichages
183
Retour