Autres Reconstituer Entete à partir de caption de Labels créés par code.

cp4

XLDnaute Barbatruc
Bonsoir :),

Je m'inspire beaucoup des exemples de Boisgontier. Le code ci-dessous permet de créer des labels qui prennent comme caption l’entête d'un tableau.
Je voudrais reconstituer l’entête sur une autre feuille à partir de ces labels.
Je sais qu'il est plus simple de faire un copier/coller en vba.
C'est seulement pour apprendre à manipuler ce type d'objets créés à la volée.
VB:
Sub EnteteListBox() 'Boisgontier
    Dim x As Integer, y As Integer, i As Byte, lab As Object, temp, Rng
    Set Rng = Sheets("bd").Range("A2:J" & f.[A65000].End(xlUp).Row)
    x = Me.ListBox1.Left + 8
    y = Me.ListBox1.Top - 12
    For i = 1 To Me.ListBox1.ColumnCount
        Set lab = Me.Controls.Add("Forms.Label.1")
        lab.Caption = Rng.Offset(-1).Cells(1, i)
        lab.Top = y
        lab.Left = x
        x = x + Int(Rng.Columns(i).Width * 1.1)
        temp = temp & Int(Rng.Columns(i).Width * 1.1) & ";"
    Next
    temp = Left(temp, Len(temp) - 1)
    Me.ListBox1.ColumnWidths = temp
End Sub
En vous remerciant par avance.
Bonne soirée.
 
Dernière édition:
Solution
Bonsoir cp4, jmfmarques, Bernard,

Placez dans l'UserForm :
VB:
Sub RestituerEntete()
Dim y, c As Control, col%
y = ListBox1.Top - 12 'à adapter
For Each c In Controls
    If TypeName(c) = "Label" And c.Top = y Then col = col + 1: ActiveSheet.Cells(1, col) = c.Caption 'ou précisez la feuille
Next
End Sub
Je ne vois pas vraiment l'intérêt de cette petite gymnastique.

A+

Dranreb

XLDnaute Barbatruc
Bonsoir.
Des contrôles créés à la volée, comme vous dites, je les range généralement dans une Collection ou un tableau pour les retrouver en vue d'en récupérer ultérieurement certaines propriétés. Mais il n'est pas exclus qu'ils puissent aussi être repris de la collection Controls, pour peu qu'on ait noté l'indice de dernier d'entre eux avant d'en ajouter d'autres, ou sinon d'initialiser leur propriété Name pour les y retrouver par cette propriété.
 

job75

XLDnaute Barbatruc
Bonsoir cp4, jmfmarques, Bernard,

Placez dans l'UserForm :
VB:
Sub RestituerEntete()
Dim y, c As Control, col%
y = ListBox1.Top - 12 'à adapter
For Each c In Controls
    If TypeName(c) = "Label" And c.Top = y Then col = col + 1: ActiveSheet.Cells(1, col) = c.Caption 'ou précisez la feuille
Next
End Sub
Je ne vois pas vraiment l'intérêt de cette petite gymnastique.

A+
 

cp4

XLDnaute Barbatruc
Bonsoir.
Des contrôles créés à la volée, comme vous dites, je les range généralement dans une Collection ou un tableau pour les retrouver en vue d'en récupérer ultérieurement certaines propriétés. Mais il n'est pas exclus qu'ils puissent aussi être repris de la collection Controls, pour peu qu'on ait noté l'indice de dernier d'entre eux avant d'en ajouter d'autres, ou sinon d'initialiser leur propriété Name pour les y retrouver par cette propriété.
Dranreb bonsoir ;), Merci beaucoup pour tes explications. Je suis arrivé au code ci-dessous.
VB:
Sub controle_USF()
    Dim Ctrl As Control, i As Byte
    Worksheets("controle").Cells.Clear

    i = 1
      'Boucle sur la collection de contrôles
    For Each Ctrl In Transfert1.Controls
        If TypeOf Ctrl Is MSForms.Label Then
            'If TypeName(Ctrl) = "Label" Then
            Worksheets("controle").Cells(1, i).Value = Val(Ctrl.Name)
            Worksheets("controle").Cells(2, i).Value = Ctrl.Caption
            i = i + 1
        End If
    Next Ctrl
End Sub
Cependant, je rencontre une difficulté. Sur Mon userform, j'ai mis un label (Label1), les autres sont mis pas code (nombres de labels = 10 colonnes de mon tableau). Je voudrais récupérer le chiffre à la fin des labels afin de boucler avec condition.
si indice label<>1 alors reporter caption dans cellule.
Encore merci.
Bonne soirée.
 

job75

XLDnaute Barbatruc
Si les noms des Labels sont numérotés de 10 à 20 c'est vraiment élémentaire :
Code:
Sub RestituerEntete()
Dim i%
For i = 10 To 20
    ActiveSheet.Cells(1, i - 9) = Me("Label" & i).Caption 'ou préciser la feuille
Next
End Sub
 

cp4

XLDnaute Barbatruc
Si les noms des Labels sont numérotés de 10 à 20 c'est vraiment élémentaire :
Code:
Sub RestituerEntete()
Dim i%
For i = 10 To 20
    ActiveSheet.Cells(1, i - 9) = Me("Label" & i).Caption 'ou préciser la feuille
Next
End Sub
Bonsoir Job75 ;),
Tu es trop rapide, j'étais entrain d'adapter ton code du post#5.
Merci beaucoup. Je reviendrai demain aux nouvelles.
 

patricktoulon

XLDnaute Barbatruc
bonjour
quand tu ajoute un/des controls quel qu'il soit dynamiquement tu a leur propriété ".tag" qui peut te servir a le(s) pointer pour le(s) repérer plus tard ,sans connaitre son nom ou sa caption ou son top ou je ne sais quoi qu'est ce ;)

un petit exemple de listbox avec pseudo entête (Label)
un bouton pour lister les entete
 

Pièces jointes

  • listbox entete.xlsm
    16.6 KB · Affichages: 12

jmfmarques

XLDnaute Accro
Bonjour cp4
Je ne peux que réagir à ta propre réaction (la suivante) :
J'ai appris une nouvelle chose.
en réaction à

Notez que .Caption étant la propriété par défaut des Labels on peut ne pas la préciser.

NON ! Garde tes bonnes habitudes et discipline antérieures (toujours préciser systématiquement la propriété utilisée). Ne jamais faire totalement confiance au bon "discernement" de VBA, qui se plante quelquefois dans, précisément, l'utilisation de "la propriété par défaut" des objets.
Les exemples ne manquent pas.
Je t'en conjure donc personnellement : ne laisse jamais VBA décider à ta place de la propriété à utiliser. Précise-la toujours, si tu ne veux pas risquer d'avoir un jour des surprises de manière totalement inattendue.
 

cp4

XLDnaute Barbatruc
bonjour
quand tu ajoute un/des controls quel qu'il soit dynamiquement tu a leur propriété ".tag" qui peut te servir a le(s) pointer pour le(s) repérer plus tard ,sans connaitre son nom ou sa caption ou son top ou je ne sais quoi qu'est ce ;)

un petit exemple de listbox avec pseudo entête (Label)
un bouton pour lister les entete
Bonjour PatrickToulon ;),
Merci beaucoup pour ton fichier exemple. J'avoue n'avoir jamais utiliser la propriété Tag.
Je vais rajouter ton fichier à ma collection que j'étudierai à tête reposée.
Encore merci:cool:
 

job75

XLDnaute Barbatruc
Garde tes bonnes habitudes et discipline antérieures (toujours préciser systématiquement la propriété utilisée). Ne jamais faire totalement confiance au bon "discernement" de VBA, qui se plante quelquefois dans, précisément, l'utilisation de "la propriété par défaut" des objets.
Quand cela arrive, normalement on s'en rend vite compte et on corrige.

Par exemple avec un Dictionary d sur la cellule c si l'on écrit d(c) = "" au lieu de d(c.Value) = ""
 

cp4

XLDnaute Barbatruc
Bonjour cp4
Je ne peux que réagir à ta propre réaction (la suivante) :
en réaction à

NON ! Garde tes bonnes habitudes et discipline antérieures (toujours préciser systématiquement la propriété utilisée). Ne jamais faire totalement confiance au bon "discernement" de VBA, qui se plante quelquefois dans, précisément, l'utilisation de "la propriété par défaut" des objets.
Les exemples ne manquent pas.
Je t'en conjure donc personnellement : ne laisse jamais VBA décider à ta place de la propriété à utiliser. Précise-la toujours, si tu ne veux pas risquer d'avoir un jour des surprises de manière totalement inattendue.
Bonjour Jmfmarques;),
Merci pour toutes tes précisions. J'ai appris quelque chose n'était pas en rapport avec la propriété par défaut des labels. Il s'agissait du TypeName des contrôles. Mais surtout la combinaison du nom du label et de sa position par rapport à la listbox (propriété .Top).
Encore merci. Bonne journée.:)
 

Statistiques des forums

Discussions
312 169
Messages
2 085 911
Membres
103 033
dernier inscrit
thazet