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 :

Insertiion automatique de TextBox par groupe de 5 dans un Frame


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Février 2017
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Finance

    Informations forums :
    Inscription : Février 2017
    Messages : 59
    Par défaut Insertiion automatique de TextBox par groupe de 5 dans un Frame
    Bonjour,
    Mon souci n’est pas purement du domaine du VBA Excel mais je tente ma chance.
    Dans mon projet, un code crée automatiquement autant de TextBox que le nombre variable de colonnes d’un onglet.
    Pour une question de place dans le UserForm, ces TextBox sont logés dans un Frame, groupés par ligne de 5. Mon problème est de déterminer la propriété « Top » pour chaque ligne de 5 TextBox. Pour 2 lignes, pas de problème, mais depuis plusieurs jours que je sèche pour trouver la formule qui permet l’insertion de 3 lignes de TextBox et plus (onglet de plus de 10 colonnes).
    Si quelqu’un est inspiré, je suis preneur.

    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
    Dim a
    NbCol = [Tableau1].Columns.Count     
    For b2 = 1 To NbCol
     n = n + 1
     a = Me.Frame10.Controls.Add("Forms.TextBox.1", "TextBox" & b2, True)
     If n < 6 Then
      Me("TextBox" & b2).Top = 30
      Me("TextBox" & b2).Left = 6 + (b2 - 1) * 120
     Else
      Me("TextBox" & b2).Top = 30 * 2
      Me("TextBox" & b2).Left = 6 + (b2 - 7) * 120
     End If
      Me("TextBox" & b2).Width = 115
    Next b2
    n = 0

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Teste comme ceci
    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
    Dim a
    NbCol = [Tableau1].Columns.Count
    For b2 = 1 To NbCol
     n = n + 1
     If n < 6 Then
      a = Me.Frame1.Controls.Add("Forms.TextBox.1", "TextBox" & b2, True)
      Me("TextBox" & b2).Top = 30
      Me("TextBox" & b2).Left = 6 + (b2 - 1) * 120
     ElseIf n >= 5 And n <= 10 Then
      a = Me.Frame1.Controls.Add("Forms.TextBox.1", "TextBox" & b2, True)
      Me("TextBox" & b2).Top = 30 * 2
      Me("TextBox" & b2).Left = 6 + (b2 - 6) * 120
     ElseIf n >= 11 And n <= 15 Then
      a = Me.Frame1.Controls.Add("Forms.TextBox.1", "TextBox" & b2, True)
      Me("TextBox" & b2).Top = 30 * 3
      Me("TextBox" & b2).Left = 6 + (b2 - 11) * 120
     ElseIf n >= 16 And n <= 20 Then
      a = Me.Frame1.Controls.Add("Forms.TextBox.1", "TextBox" & b2, True)
      Me("TextBox" & b2).Top = 30 * 4
      Me("TextBox" & b2).Left = 6 + (b2 - 16) * 120
     ElseIf n >= 21 And n <= 25 Then
      a = Me.Frame1.Controls.Add("Forms.TextBox.1", "TextBox" & b2, True)
      Me("TextBox" & b2).Top = 30 * 5
      Me("TextBox" & b2).Left = 6 + (b2 - 21) * 120
     Else
      Exit Sub
     End If
      Me("TextBox" & b2).Width = 115
    Next b2
    n = 0

  3. #3
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Février 2017
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Finance

    Informations forums :
    Inscription : Février 2017
    Messages : 59
    Par défaut
    Merci pour la réponse. C'est une piste que j'avais déjà explorée. Finalement, je vais l'utiliser en espérant trouver la méthode qui évitera l’empilement des conditions.

    Je laisse la discussion ouverte encore quelques temps au cas où.

    Encore merci et à bientôt !

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 178
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Voici un exemple que j'ai retrouvé dans mes archives et que j'ai réadapté car je gérais plusieurs contrôles et j'utilisais un module de classe pour intercepter les événements.
    Le UserForm se nomme usfAutoResize, le contrôle Frame frmSize.

    La procédure doit être placée dans un module standard.
    Le nombre de lignes et de colonnes se trouvent dans les cellules nommées pNumberRows et pNumberColumns et sont chargées ligne 10 et 11 de la procédure.
    On peut bien entendu remplacer ces lignes par Const NumberColumns As Byte = 6 et Const NumberRows As Byte = 5

    Les propriétés gérant les tailles du Frame et du UserForm s'adaptent également

    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
    Sub Main()
      Const TopStart As Byte = 50     ' Position Top de la première ligne des textBox
      Const bnStLeft As Byte = 40     ' Position Left des TextBox de gauche
      Const Hc As Byte = 25             ' Ecart entre chaque ligne
      Const bnEcLeft As Byte = 35     ' Ecart entre chaque contrôle
      Dim r As Byte
      Dim c As Byte
      Dim oDisBtn As Control '
      '
      NumberColumns = Range("pNumberColumns").Value  ' Nombre de colonnes
      NumberRows = Range("pNumberRows").Value        ' Nombre de lignes
      '
      With usfAutoResize
        For c = 1 To NumberColumns
           For r = 1 To NumberRows
             Set oDisBtn = .frmSize.Controls.Add("forms.TextBox.1")  ' TextBox
             With oDisBtn
             .Name = "txtSize_" & c & r ' .Caption = C
             .Width = 30: .Top = TopStart + ((r - 1) * Hc): .Height = 18: .Left = bnStLeft + (c - 1) * bnEcLeft
             .Enabled = False: .Visible = True
             End With
           Next r
        Next c
        With .frmSize
        .Width = oDisBtn.Left + .Left + 20
        .Height = .Top + oDisBtn.Top + oDisBtn.Height + hr
        End With
      .Width = .frmSize.Width + 50
      .Height = .frmSize.Top + .frmSize.Height + 40
      .Show
      End With
      Set oDisBtn = Nothing
    End Sub
    Fichiers attachés Fichiers attachés
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Février 2017
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Finance

    Informations forums :
    Inscription : Février 2017
    Messages : 59
    Par défaut
    Bonjour Philippe,

    Je te remercie pour cette proposition que je vais mettre en œuvre dans mon projet. J'utiliserai également ces Textbox pour intercepter des événements (affichage, ajout, modification et suppression). C'est pourquoi, je serai intéressé par le module de classe que vous évoquez.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/11/2010, 09h16
  2. valider le contenu d'un textbox par la touche entrée
    Par camilla dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 07/10/2005, 15h02
  3. Réponses: 7
    Dernier message: 23/09/2005, 20h58
  4. Trier les fichiers par type et les afficher par groupe ...
    Par KneXtasY dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 18/09/2005, 18h50
  5. concaténer par GROUP BY des champs text/varchar
    Par Fredobdx dans le forum Requêtes
    Réponses: 1
    Dernier message: 12/07/2005, 13h44

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