IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Supprimer TextBox créés dynamiquement [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 111
    Points : 50
    Points
    50
    Par défaut Supprimer TextBox créés dynamiquement
    Bonjour,

    Je souhaiterais pouvoir supprimer des TextBox créés dynamquement.

    Lorsque j'essaie le code suivant, j'obtiens l'erreur 438..
    (je laisse aussi des bouts de codes en commentaire, au cas où..)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub OLEObjects()
    Dim Ctrl As Control
    Dim i As Long
     
    'Dim obj As OLEObject
    'UserForm1.Granulo.OLEObjects("TextBox1").Delete
     
    '    For Each Ctrl In UserForm1.Granulo.Controls
    '        If TypeOf Ctrl Is MSForms.TextBox And Ctrl.Name <> "FondR" Then
    '            MsgBox Ctrl.Name
    '            Ctrl.Delete
    '        End If
    '    Next
     
    For i = 0 To UBound(mesbouts)
        mesbouts(i).TxBox1.Delete
    Next
     
    End Sub

    Avez-vous des idées?

    Merci d'avance

  2. #2
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    Bonjour,
    il faut utiliser Me.Controls.Remove "nomDuControl"je t propose d'ajouter la méthode Terminate dans le module de classe cette méthode est appelé quand on applique Nothing à l'instance de la classe!

    Code ma_first_classe : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Class_Terminate()
        Parent.Controls.Remove TxBox1.Name
        Parent.Controls.Remove TxBox2.Name
        Parent.Controls.Remove TxBox3.Name
        Parent.Controls.Remove bouton.Name
        Set TxBox1 = Nothing
        Set TxBox2 = Nothing
        Set TxBox3 = Nothing
        Set bouton = Nothing
    End Sub
    et voila ta sub OLEObjects
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub OLEObjects()
    Dim i As Long
        For i = 0 To UBound(mesbouts)
            Set mesbouts(i) = Nothing
        Next
    ReDim mesbouts(0)
    Nb = 0
    End Sub

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    Bonjour Thumb Down,

    Ton code semble bien aller, je fais encore 2-3 tests pour l'adapter mais j'ai bien l'impression qu'on est bon ;-)

    Encore merci ;-)

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    Bonjour Thumb Down,

    Pour revenir sur un sujet précédent mais fort proche de celui-ci, j'aimerais dans une seconde variante supprimer une seule série de TextBox et non tous.

    Tu m'avais déjà aidé pour les codes suivants :

    Dans un module de classe, pour rendre mes objets invisibles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub bouton_Click()
     
    TxBox1.Visible = False: TxBox2.Visible = False: TxBox3.Visible = False: bouton.Visible = False
     
    Parent.ReiniteControls
    Hauteur = FondText.Top
     
    End Sub
    Avec en module normal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Sub ReiniteControls()
    Dim Cls, i As Integer
    For Each Cls In mesbouts
        If Cls.TxBox1.Visible Then
           Cls.TxBox1.Top = (Cls.TxBox1.Height * i) + 29: Cls.TxBox2.Top = Cls.TxBox1.Top: Cls.TxBox3.Top = Cls.TxBox1.Top: Cls.bouton.Top = Cls.TxBox1.Top: Cls.FondText.Top = Cls.TxBox3.Top + 25: Cls.FondR.Top = Cls.FondText.Top: Cls.FondP.Top = Cls.FondText.Top
           i = i + 1
        End If
    Next
    End Sub
    Et pour supprimer, dans un module de classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Class_Terminate()
        Parent.Controls.Remove TxBox1.Name
        Parent.Controls.Remove TxBox2.Name
        Parent.Controls.Remove TxBox3.Name
        Parent.Controls.Remove bouton.Name
        Set TxBox1 = Nothing
        Set TxBox2 = Nothing
        Set TxBox3 = Nothing
        Set bouton = Nothing
    End Sub
    Avec son module normal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub OLEObjects()
    Dim i As Long
    If NB > 0 Then
        For i = 0 To UBound(mesbouts)
            Set mesbouts(i) = Nothing
        Next
    End If
    ReDim mesbouts(0)
    NB = 0
    End Sub
    L'idée serait à présent de combiner le module de classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub bouton_Click()
    avec l'autre module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Class_Terminate()
    mais je n'y parviens pas. Est-ce que deux modules de classe peuvent travailler ensemble ?

    Merci pour ton aide

  5. #5
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    Class_Terminate est un évènement Intrinsèque au module de classe, il survient lors de la destruction du module de classe!

    toi en réalité tu veux supprimer qu'une ligne de contrôles ?

    voila une nouvelle monture avec un bouton K pour Kill!
    Fichiers attachés Fichiers attachés

  6. #6
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    je me suis rendu compte de quelque oublis voila la correction!
    Fichiers attachés Fichiers attachés

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    Bonjour Thumb Down,

    Ton code fonctionne parfaitement sur ton classeur mais je ne parviens pas à l'adapter au mien.

    J'ai actuellement le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    Public Sub AjoutT_Fixe()
    Dim i As Integer
    Dim C As Integer, Tabi As Integer
     
    'Dim ctrl As Control
    Hauteur = FondText.Top
     
    ReDim Preserve mesbouts(NB)
    Set mesbouts(NB).TxBox1 = UserForm1.Granulo.Controls.Add("Forms.Textbox.1", "T" & NB, True)
        With mesbouts(NB).TxBox1
            .Name = "TextBox1_" & NB
            If Hauteur = 29 Then
                .Top = Hauteur
            Else: .Top = Hauteur - 7
            End If
            .Left = 5
            .Width = 35
            If Hauteur > UserForm1.Granulo.Height - 65 Then
                If UserForm1.Granulo.ScrollHeight = 0 Then
                    UserForm1.Granulo.ScrollHeight = UserForm1.Granulo.Height + UserForm1.Granulo.ScrollHeight
                Else
                    UserForm1.Granulo.ScrollHeight = UserForm1.Granulo.ScrollHeight + 18
                End If
            End If
    'MsgBox mesbouts(NB).TxBox1.Name
            On Error GoTo 2
            If Calibre = "" And NumTest = "" Then GoTo 2
            .Text = tamis
    2
    Set mesbouts(NB).TxBox2 = UserForm1.Granulo.Controls.Add("Forms.Textbox.1", "P" & NB, True)
        With mesbouts(NB).TxBox2
            .Name = "TextBox2_" & NB
            .Top = mesbouts(NB).TxBox1.Top
            .Left = mesbouts(NB).TxBox1.Left + mesbouts(NB).TxBox1.Width + 4 '+404
            .Width = 55
            On Error GoTo 3
            If Calibre = "" And NumTest = "" Then GoTo 3
            .Text = Refus
    3
        End With
    Set mesbouts(NB).TxBox3 = UserForm1.Granulo.Controls.Add("Forms.Textbox.1", "R" & NB, True)
        With mesbouts(NB).TxBox3
            .Name = "TextBox3_" & NB
            .Top = mesbouts(NB).TxBox1.Top
            .Left = mesbouts(NB).TxBox2.Left + mesbouts(NB).TxBox2.Width + 4 '+465
            .Width = 45
            On Error GoTo 4
            If Calibre = "" And NumTest = "" Then GoTo 4
            .Text = Passant
    4
        End With
    Set mesbouts(NB).bouton = UserForm1.Granulo.Controls.Add("Forms.CommandButton.1", "SuppTamis" & NB)
        With mesbouts(NB).bouton
            .Name = "SuppTamis_" & NB
            .Top = mesbouts(NB).TxBox1.Top
            .Left = mesbouts(NB).TxBox3.Left + mesbouts(NB).TxBox3.Width + 4 '512
            .Width = 18
            .Height = 18
            .Caption = "-"
        End With
    Set mesbouts(NB).FondText = FondText
        mesbouts(NB).FondText.Top = mesbouts(NB).TxBox1.Top + 25
    Set mesbouts(NB).FondR = FondR
        mesbouts(NB).FondR.Top = mesbouts(NB).TxBox1.Top + 25
    Set mesbouts(NB).FondP = FondP
        mesbouts(NB).FondP.Top = mesbouts(NB).TxBox1.Top + 25
    Set mesbouts(NB).Parent = UserForm1
     
    Set mesbouts = CreateObject("Scripting.Dictionary")
     
    k = mesbouts.keys
    For C = 0 To 2
        For i = 0 To mesbouts.Count - 1
           mesbouts(k(i)).TableIndex Tabi, C: Tabi = Tabi + 1
        Next
    Next
     
    End With
     
    NB = NB + 1
     
    End Sub
    J'ai une erreur de compilation sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set mesbouts = CreateObject("Scripting.Dictionary")
    Impossible d'affecter à un tableau
    Merci pour ton retour ;-)

  8. #8
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    Bonjour,
    vue que je n'es pas de vision concrète sur ton UserForm j'ai extrapolé en espérant que je ne me suis pas planté!
    Code Userom1 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    Public mesbouts As Object, Nb As Integer
    'Dim Nb As Integer
    Public Sub AjoutT_Fixe()
    Dim i As Integer
    Dim C As Integer, Tabi As Integer
     
    'Dim ctrl As Control
    Hauteur = FondText.top
    With mesbouts
    .Add ("Nb" & Nb), New ma_first_classe
    mesbouts("Nb" & Nb).Name = ("Nb" & Nb)
    Set mesbouts("Nb" & Nb).TxBox1 = UserForm1.Granulo.Controls.Add("Forms.Textbox.1", "T" & Nb, True)
        With mesbouts("Nb" & Nb).TxBox1
            .Name = "TextBox1_" & Nb
            If Hauteur = 29 Then
                .top = Hauteur
            Else: .top = Hauteur - 7
            End If
            .Left = 5
            .Width = 35
            If Hauteur > UserForm1.Granulo.Height - 65 Then
                If UserForm1.Granulo.ScrollHeight = 0 Then
                    UserForm1.Granulo.ScrollHeight = UserForm1.Granulo.Height + UserForm1.Granulo.ScrollHeight
                Else
                    UserForm1.Granulo.ScrollHeight = UserForm1.Granulo.ScrollHeight + 18
                End If
            End If
    'MsgBox mesbouts("Nb" & Nb).TxBox1.Name
            On Error GoTo 2
            If Not (Calibre = "" And NumTest = "") Then .Text = tamis
    2
    Set mesbouts("Nb" & Nb).TxBox2 = UserForm1.Granulo.Controls.Add("Forms.Textbox.1", "P" & Nb, True)
        With mesbouts("Nb" & Nb).TxBox2
            .Name = "TextBox2_" & Nb
            .top = mesbouts("Nb" & Nb).TxBox1.top
            .Left = mesbouts("Nb" & Nb).TxBox1.Left + mesbouts("Nb" & Nb).TxBox1.Width + 4 '+404
            .Width = 55
           ' On Error GoTo 3
            If Not (Calibre = "" And NumTest = "") Then .Text = Refus
    3
        End With
    Set mesbouts("Nb" & Nb).TxBox3 = UserForm1.Granulo.Controls.Add("Forms.Textbox.1", "R" & Nb, True)
        With mesbouts("Nb" & Nb).TxBox3
            .Name = "TextBox3_" & Nb
            .top = mesbouts("Nb" & Nb).TxBox1.top
            .Left = mesbouts("Nb" & Nb).TxBox2.Left + mesbouts("Nb" & Nb).TxBox2.Width + 4 '+465
            .Width = 45
            'On Error GoTo 4
            If Not (Calibre = "" And NumTest = "") Then .Text = Passant
    4
        End With
    Set mesbouts("Nb" & Nb).bouton = UserForm1.Granulo.Controls.Add("Forms.CommandButton.1", "SuppTamis" & Nb)
        With mesbouts("Nb" & Nb).bouton
            .Name = "SuppTamis_" & Nb
            .top = mesbouts("Nb" & Nb).TxBox1.top
            .Left = mesbouts("Nb" & Nb).TxBox3.Left + mesbouts("Nb" & Nb).TxBox3.Width + 4 '512
            .Width = 18
            .Height = 18
            .Caption = "-"
        End With
    Set mesbouts("Nb" & Nb).Kill = UserForm1.Granulo.Controls.Add("Forms.CommandButton.1", "SuppTamis_" & Nb)
        With mesbouts("Nb" & Nb).Kill
                '.Name = "SuppTamis_" & j + 1
                .top = mesbouts("Nb" & Nb).bouton.top
                .Left = mesbouts("Nb" & Nb).bouton.Left + mesbouts("Nb" & Nb).bouton.Height + 3
                .Width = 18
                .Height = 18
                .Caption = "K"
                .TabStop = False
        End With
    Set mesbouts("Nb" & Nb).FondText = FondText
        mesbouts("Nb" & Nb).FondText.top = mesbouts("Nb" & Nb).TxBox1.top + 25
    Set mesbouts("Nb" & Nb).FondR = FondR
        mesbouts("Nb" & Nb).FondR.top = mesbouts("Nb" & Nb).TxBox1.top + 25
    Set mesbouts("Nb" & Nb).FondP = FondP
        mesbouts("Nb" & Nb).FondP.top = mesbouts("Nb" & Nb).TxBox1.top + 25
    Set mesbouts("Nb" & Nb).Parent = UserForm1
     
     
     
     
    K = mesbouts.keys
    For C = 0 To 2
        For i = 0 To mesbouts.Count - 1
           mesbouts(K(i)).TableIndex Tabi, C: Tabi = Tabi + 1
        Next
    Next
     
    End With
     End With
    Nb = Nb + 1
     
    End Sub
     
     
    Public Sub ReiniteControls()
    Dim Cls, i As Integer
    For Each Cls In mesbouts.items
        If Cls.TxBox1.Visible Then
           Cls.TxBox1.top = (Cls.TxBox1.Height * i) + 29: Cls.TxBox2.top = Cls.TxBox1.top: Cls.TxBox3.top = Cls.TxBox1.top: Cls.bouton.top = Cls.TxBox1.top: Cls.Kill.top = Cls.bouton.top: Cls.FondText.top = Cls.TxBox3.top + 25: Cls.FondR.top = Cls.FondText.top: Cls.FondP.top = Cls.FondText.top
           i = i + 1
        End If
    Next
    End Sub
     
     
    Private Sub UserForm_Initialize()
    Set mesbouts = CreateObject("Scripting.Dictionary")
    End Sub
     
     
    Private Sub UserForm_Terminate()
    Set mesbouts = Nothing
    End Sub
    Code ma_first_classe : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Public WithEvents bouton As MSForms.CommandButton, WithEvents Kill As MSForms.CommandButton
    Public WithEvents TxBox1 As MSForms.TextBox, WithEvents TxBox2 As MSForms.TextBox, WithEvents TxBox3 As MSForms.TextBox
    Public WithEvents FondText  As MSForms.TextBox, WithEvents FondR  As MSForms.TextBox, WithEvents FondP  As MSForms.TextBox
    Public Parent As UserForm1, Name As String
    Private Sub Class_Terminate()
        Parent.Controls.Remove TxBox1.Name
        Parent.Controls.Remove TxBox2.Name
        Parent.Controls.Remove TxBox3.Name
        Parent.Controls.Remove bouton.Name
        Parent.Controls.Remove Kill.Name
        Set TxBox1 = Nothing
        Set TxBox2 = Nothing
        Set TxBox3 = Nothing
        Set bouton = Nothing
        Set Kill = Nothing
    End Sub
    Private Sub bouton_Click()
    MsgBox "je suis le bouton " & bouton.Name
    TxBox1.Visible = False: TxBox2.Visible = False: TxBox3.Visible = False: bouton.Visible = False: Kill.Visible = False
    Parent.ReiniteControls
    End Sub
     
    Private Sub Kill_Click()
    If MsgBox("Voulez vous vraiment supprimer", vbQuestion + vbYesNo) = vbNo Then Exit Sub
    Parent.mesbouts.Remove Name
    Parent.ReiniteControls
    End Sub
     
    Private Sub TxBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
     If KeyCodeK = 13 Or KeyCode = 9 Or KeyCode = 40 Or KeyCode = 38 Then TxBox2 = TxBox1
    End Sub
     
    Private Sub TxBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Or KeyCode = 9 Or KeyCode = 40 Or KeyCode = 38 Then TxBox1 = TxBox2
    End Sub
     
    Public Sub TableIndex(Index As Integer, Rang As Integer)
    Select Case Rang
        Case 0: TxBox1.TabIndex = Index
        Case 1: TxBox2.TabIndex = Index
        Case 2: TxBox3.TabIndex = Index
    End Select
    End Sub

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    Bonjour Thumb Down,

    Cela ne fonctionne pas chez moi, en tous cas en l'état.

    Questions :
    1. le changement NB -> "Nb" & Nb est-il nécessaire ?

    2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    K = mesbouts.keys
    For C = 0 To 2
    Il me demande de définir les variables K et C, variant ok selon toi ?

    3. Lorsque je suis sur la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set mesbouts("Nb" & Nb).Kill = UserForm1.Granulo.Controls.Add("Forms.CommandButton.1", "SuppTamis_" & Nb)
    j'ai une "erreur 438 - propriété ou méthode non gérée par cet objet"

    C'est actuellement la que je cale..

    Merci pour ton retour

  10. #10
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    Bonsoir,
    oui tu as raison il fau déclarer K
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim KK = mesbouts.keys
    For C = 0 To 2
        For i = 0 To mesbouts.Count - 1
           mesbouts(K(i)).TableIndex Tabi, C: Tabi = Tabi + 1
        Next
    Next
    et dans le module de classe il faut ajouter dans la parti déclaration
    Public WithEvents Kill As MSForms.CommandButton
    et enfin toujours dans module de classe la méthode Kill_Click
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Kill_Click()
    If MsgBox("Voulez vous vraiment supprimer", vbQuestion + vbYesNo) = vbNo Then Exit Sub
    Parent.mesbouts.Remove Name
    Parent.ReiniteControls
    End Sub

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    Bonjour Thumb Down,

    Merci pour ton retour.
    Je n'ai plus cette erreur 438, par contre, comme tu sembles avoir changé la structure de mon tableau mesbouts, j'ai forcément une autre erreur qui remonte sur le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub OLEObjects()
    Dim i As Long
    If Nb > 0 Then
        For i = 0 To UBound(mesbouts)
            Set mesbouts(i) = Nothing
        Next
    End If
    ReDim mesbouts(0)
    Nb = 0
    End Sub
    Il s'arrête sur UBOUND avec le message : "tableau attendu". Je pense qu'il ne reconnaît plus "mesbouts" comme étant un tableau.
    On y est presque mais je ne parviens pas à saisir la nuance avec tes ajouts.

    Merci

  12. #12
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    Bonjour,
    Oui maintenant il suffit d'écrire Set mesbouts=Nothing.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub OLEObjects()
    Set mesbouts=Nothing
    Nb = 0
    End Sub
    C'est lié au fait que j'ai remplacé le tableau par un dictionnarry ! La suppression d'une instance de la classe lors de la suppression des contrôles dessorganisait l'intégralité du tableau alors qu'ils est plus facile de supprimer un item d'une collection !

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    Bonjour Thumb Down,

    Merci pour ta réponse.
    J'ai toutefois encore un bug :

    L'idée est comme tu l'as bien compris de créer une série de boutons avec TextBox.
    De pouvoir quand besoin, supprimer l'ensemble des boutons ainsi créés pour en ajouter d'autres au choix.

    Pour ce faire, j'utilise les codes suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub LDeroul_Calibre_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim r As Range
    Dim cls
     
    OLEObjects
    AjoutT_Fixe
     
    End Sub
    avec pour supprimer mes Objets, le code suivant qui appelle ensuite le module de classe _terminate (repris après) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub OLEObjects()
    Set mesbouts = Nothing
    Nb = 0
    End Sub
    et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Public Sub AjoutT_Fixe()
    Dim i As Integer
    Dim C As Integer, Tabi As Integer
     
    Hauteur = FondText.Top
     
    With mesbouts
    .Add ("Nb" & Nb), New BoutonSupp ' -------> le problème se trouve ici (voir ci dessous)
     
    mesbouts("Nb" & Nb).Name = ("Nb" & Nb)
     
    Set mesbouts("Nb" & Nb).TxBox1 = UserForm1.Granulo.controls.Add("Forms.Textbox.1", "T" & Nb, True)
        With mesbouts("Nb" & Nb).TxBox1
            .Name = "TextBox1_" & Nb
            ...
     
            Set mesbouts("Nb" & Nb).FondText = FondText
                mesbouts("Nb" & Nb).FondText.Top = mesbouts("Nb" & Nb).TxBox1.Top + 25
            Set mesbouts("Nb" & Nb).FondR = FondR
                mesbouts("Nb" & Nb).FondR.Top = mesbouts("Nb" & Nb).TxBox1.Top + 25
            Set mesbouts("Nb" & Nb).FondP = FondP
                mesbouts("Nb" & Nb).FondP.Top = mesbouts("Nb" & Nb).TxBox1.Top + 25
            Set mesbouts("Nb" & Nb).Parent = UserForm1
     
            K = mesbouts.keys
            For C = 0 To 2
                For i = 0 To mesbouts.Count - 1
                   mesbouts(K(i)).TableIndex Tabi, C: Tabi = Tabi + 1
                Next
            Next
     
        End With
    End With
    Nb = Nb + 1
    End Sub
    et en module de classe, j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Class_Terminate()
        Parent.controls.Remove TxBox1.Name
        Parent.controls.Remove TxBox2.Name
        Parent.controls.Remove TxBox3.Name
        'Parent.controls.Remove bouton.Name
        Parent.controls.Remove Kill.Name
        Set TxBox1 = Nothing
        Set TxBox2 = Nothing
        Set TxBox3 = Nothing
        'Set bouton = Nothing
        Set Kill = Nothing
    End Sub
    Le problème se trouve ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Sub AjoutT_Fixe()
    Dim i As Integer
    Dim C As Integer, Tabi As Integer
     
    Hauteur = FondText.Top
     
    With mesbouts
    .Add ("Nb" & Nb), New BoutonSupp
     
    ...
    Une fois que j'ai fait le tour, que j'ai supprimé mes objets, je dois ici refaire une boucle pour en créer de nouveaux. Mais il bloque car il repart vers le module de classe _terminate et me renvoie une "erreur d'exécution 91 : Variable objet ou variable de bloc With non définie."

    En gros, je pense qu'il croit qu'il doit encore en supprimer, alors qu'il n'y a plus d'objet à supprimer mais pourquoi repart-il vers la classe _terminate ?

    J'espère m'être bien fait comprendre car ce n'est pas évident.

    Merci

  14. #14
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    Je pense avoir trouvé la raison, avec le module de classe _terminate, j'ai littéralement "tué" mon dictionnaire que je ne recréais alors plus.

    Initialement, le passage suivant se trouve dans mon module _initialize
    Je l'ajoute ici dans mon module AjoutT_Fixe et cela fonctionne manifestement bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Nb = 0 Then
        Set mesbouts = CreateObject("Scripting.Dictionary")
    End If
    Par contre, n'y aurait-il pas une autre condition que "if Nb = 0" car dans ce cas, à la création du premier objet, il va se "setter" 2x...

  15. #15
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    C'est lié au fait que j'ai remplacé le tableau par un dictionnarry ! La suppression d'une instance de la classe lors de la suppression des contrôles dessorganisait l'intégralité du tableau alors qu'ils est plus facile de supprimer un item d'une collection !
    Le fait d'avoir changé mon tableau en un dictionnary va me pousser à changer d'autres bouts de code également.
    Pour exemple, dans un autre userform, je dois boucler sur le code suivant, qui ne fonctionne plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    If Nb > 0 Then
        i = Nb
        For Each cls In mesbouts
            Range("A" & 2 + i).Value = Round(cls.TxBox1.Value, 3)
            Range("B" & 2 + i).Value = Round((cls.TxBox2.Value), 3)
            i = i - 1
        Next cls
        Range("A2").Value = UserForm1.Granulo.FondText.Value
        Range("B2").Value = UserForm1.Granulo.FondR.Value
    End If
    J'ai un semblant de code comme ceci mais qui ne tourne bien entendu pas..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For Each K In UserForm1.mesbouts.keys
        If mesbouts("K" & Nb).Name = ("TxBox1_" & Nb) Then
            Range("A" & 2 + i).Value = UserForm1.mesbouts("K" & Nb).TxBox1.Value
            Range("B" & 2 + i).Value = UserForm1.mesbouts("K" & Nb).TxBox2.Value
            i = i - 1
        End If
    Next
    Que me suggérerais-tu, en sachant que je suis dans un autre userform.. ?

    merci

  16. #16
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    i=0
    For Each K In UserForm1.mesbouts.keys
            Range("A2").Offsets( i).Value = UserForm1.mesbouts(k).TxBox1.Value
            Range("B2").Offsets( i).Value = UserForm1.mesbouts(K).TxBox2.Value
            i = i +1
    Next

  17. #17
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    erreur d'exécution 438 :
    propriété ou méthode non gérée par cet objet..

    sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A2").Offsets(i).Value = UserForm1.mesbouts(K).TxBox1.Value

  18. #18
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    désolé j'avais mis un s à Offset
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim i As Integer, Item
    i = 0
    For Each Item In UserForm1.mesbouts.items
            Range("A2").Offset(i).Value = Item.TxBox1.Text
            Range("B2").Offset(i).Value = Item.TxBox2.Text
            i = i + 1
    Next
    End Sub

  19. #19
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    mmmh oui effectivement, et j'aurais bien pu le constater aussi.. ;-)

    merci pour ton aide précieuse, cela fonctionne.

    Je clôture ce post.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-365] TabIndex de TextBox créés dynamiquement
    Par thomanneca dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/01/2022, 13h17
  2. Récupérer les valeurs de Textboxs créés dynamiquement
    Par chou2best987 dans le forum Macros et VBA Excel
    Réponses: 45
    Dernier message: 12/07/2017, 04h25
  3. Supprimer deux Jbutton créés dynamiquement d'un jPanel
    Par phenix1988 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 08/12/2011, 13h09
  4. Supprimer tous les labels créés dynamiquement d'un control
    Par MiXinG dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/05/2009, 11h48
  5. Recupération de TextBoxes Créés Dynamiquement
    Par Flox06 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 20/02/2008, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo