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 :

Envoi saisie combo créée dynamiquement vers feuille excel


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Août 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Envoi saisie combo créée dynamiquement vers feuille excel
    Bonjour à tous,

    Je suis bloqué dans l'établissement d'un programme en VBA qui envoi des saisies d'opérateur dans des combo et des Textbox créées dynamiquement sur un USERFORM vers la feuille EXCEL auquel le USERFORM est rattaché.

    Je précise que mon choix d'avoir recours à des combobox et des textbox dynamique provient d'une nécessité de créer un nombre de contrôles trop important pour la capacité mémoire (en nombre de contrôles) d'un userform. Déjà essayé, ce qui m'a amené à découvrir la création dynamique de contrôle (avec des boucles, etc...)

    J'ai réussi à décortiquer la procédure, userform + module de classe.
    Que le module de classe devait contenir une sud ..._change() etc..
    Mais je suis incapable de taper le texte qui va dire: "lorsque l'opérateur saisie une valeur dans la textbox (à l'affichage) envoi la dans la cellule x sur la feuille)
    Ce qui est rageant, c'est que la récupération des valeurs de la feuille EXCEL vers le userform à l'affichage, lui fonctionne très bien.

    je joins mon fichier de travail pour l'aide.
    D'avance, merci à l'intérêt que vous porterez à la demande. ça fait 15 jours que je suis collé avec ce qui doit être une broutille probablement.
    Cordialement à tous
    Fichiers attachés Fichiers attachés

  2. #2
    Membre habitué
    Inscrit en
    Décembre 2008
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 115
    Points : 180
    Points
    180
    Par défaut
    Bonjour

    Comme je ne sais pas faire des macros _onchange ou _exit sur des contrôles créés dynamiquement, pourquoi ne pas faire un gros bouton OK dans le UserForm pour récupérer les valeurs des TextBox de chaque Frame et les affectées à des cellules?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim myTxtBox as control, i as Long
    For each myTxtBox in FrameA.controls
    range("D12").offset(i,0)=myTxtBox
    i=i+1
    Next myTxtBox
    A travailler en fonction du nommage des Frame, des TextBox et des colonnes des cellules

    Cordialement

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Août 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour Piotr76,

    Merci pour ta réponse et l'intérêt que tu portes à mon sujet.

    Effectivement le principe d'un bouton qui enregistre toutes les saisies fonctionne.
    Je l'avais envisagé, mais ce principe implique que l'utilisateur opère une sorte de validation à chacune de ses saisies ou groupe de saisie. L'outil perd un peu de son coté dynamique qui au fur et à mesure des saisies viendrait modifier les autres contrôles pour une visualisation en temps réel.

    Je dois mesurer quel est l'impact d'un tel fonctionnement pour l'utilisateur (pas forcément illogique d'ailleurs) mais j'ai déjà vu tourner des applis ou le dynamisme entre contrôle marchait.

    Je continue à fouiller et tester de mon coté.

    En tout cas, mille mercis.
    Philoup

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    chaque controle dispose de la propriété TAG; utilise la pour reseigner ladresse de la cellule cible au moment ou crée ton controle dynamiquemet !

  5. #5
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonsoir,

    Voici le code de la Form remanié, à coller à la place du tien :
    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
    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
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    Option Explicit
     
    Dim Txt() As New ClasBT
    Dim Cmb() As New ClasBT
     
    Private Sub UserForm_Initialize()
     
        Dim compteur2 As Integer
        Dim frm As MSForms.Frame
        Dim lb1 As MSForms.Label
        Dim lb2 As MSForms.Label
        Dim TxtPoidsproduitcalculé As MSForms.TextBox
        Dim TxtPoidsproduitimposé As MSForms.TextBox
        Dim Cbxpoidscouleur As ComboBox
        Dim plage As String
     
     
        Dim I As Integer
     
     
        plage = Sheets("feuille de saisie").Range("p4:p7").Address
     
        With masque2
     
        '    .StartUpPosition = 3
        '    .Width = Application.Width - 2
        '    .Height = Application.Height - 3
     
        End With
     
        For compteur2 = 1 To Sheets("Feuille de Saisie").Range("E3").Value 'boucle pour créer les frames
     
            Set frm = masque2.Controls.Add("Forms.Frame.1")
     
            With frm
     
                .Left = 300 + ((compteur2 - 1) * 172)
                .Top = 78
                .Width = 162
                .Height = 350
                .Caption = "produit " & Chr(64 + compteur2)
     
            End With
     
        '------ Créer le Label 1---------------------
            Set lb1 = frm.Add("Forms.Label.1", "Label1", True)
     
            With lb1
     
                .AutoSize = False
                .BackStyle = 1
                .BorderColor = &H80000012
                .BackColor = &H8000000F
                .BorderStyle = fmBorderStyleNone
                .FontSize = 8
                .FontBold = True
                .TextAlign = fmTextAlignCenter
                .Left = 70
                .Top = 50
                .Width = 50
                .Height = 18
                .Caption = "calculée :"
     
            End With
     
                '------ Créer le Label 2---------------------
            Set lb2 = frm.Add("Forms.Label.1", "Label2", True)
            With lb2
     
                .AutoSize = False
                .BackStyle = 1
                .BorderColor = &H80000012
                .BackColor = &H8000000F
                .BorderStyle = fmBorderStyleNone
                .FontSize = 8
                .FontBold = True
                .TextAlign = fmTextAlignCenter
                .Left = 20
                .Top = 50
                .Width = 50
                .Height = 18
                .Caption = "imposée :"
     
            End With
     
         '------ Créer le Txtbox qui récupère le poid par produit calculé ---------------------
                Set TxtPoidsproduitcalculé = frm.Add("forms.Textbox.1")
     
                With TxtPoidsproduitcalculé
                .Left = 70
                .Top = 60
                .Width = 50
                .Height = 18
                .Name = "TxtPoidsproduitcalculé" & Chr(64 + compteur2)
                .Value = Round(Sheets("Feuille de Saisie").Cells(5, compteur2 * 2 + 1).Value, 2)
                End With
     
         '------ Créer le Txtbox ou l'on saisi le poid par produit imposé ---------------------
                Set TxtPoidsproduitimposé = frm.Add("forms.Textbox.1", "TxtPoidsproduitimposé" & Chr(64 + compteur2))
     
                With TxtPoidsproduitimposé
     
                    .Left = 20
                    .Top = 60
                    .Width = 50
                    .Height = 18
                    .Tag = Chr(64 + compteur2 * 2) & 5
     
                End With
     
                I = I + 1
                ReDim Preserve Txt(1 To I)
                Set Txt(I).Texte = TxtPoidsproduitimposé
     
          '------ Créer le combo  qui récupère les couleurs et les affecte aux produits --------------------
                Set Cbxpoidscouleur = frm.Add("forms.combobox.1", "Cbxpoidscouleur" & Chr(64 + compteur2))
     
                With Cbxpoidscouleur
     
                    .Left = 6
                    .Top = 6
                    .AddItem ("rouge")
                    .AddItem ("bleu")
                    .AddItem ("vert")
                    .AddItem ("jaune")
                    .Width = 50
                    .Height = 18
                    .Tag = Chr(64 + compteur2 * 2) & 6
     
                End With
     
                ReDim Preserve Cmb(1 To I)
                Set Cmb(I).cb = Cbxpoidscouleur
     
     
        Next compteur2
     
    End Sub
    Et ici, le code du module de classe :
    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
     
    Public WithEvents cb As MSForms.ComboBox
    Public WithEvents Texte As MSForms.TextBox
     
    Private Sub cb_change()
     
        On Error Resume Next
        Range(cb.Tag).Value = cb.Text
     
    End Sub
     
    Private Sub Texte_Change()
     
        On Error Resume Next
        Range(Texte.Tag).Value = Texte.Text
     
    End Sub
    Comme te l'a si bien conseillé rdurupt, utilise la propriété "Tag" pour stocker l'adresse de la cellule à laquelle le contrôle est lié.
    PS : évite autant que possible d'utiliser les caractères accentués dans les variables "TxtPoidsproduitcalculé".

    Hervé.

Discussions similaires

  1. [XL-2007] exporter graphique owc vers feuille excel
    Par bob3333 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/04/2011, 20h54
  2. combobox vers feuille excel
    Par steph033 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 07/12/2008, 13h45
  3. [Access 2003] Export code SQL vers feuille Excel
    Par nicacc dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 20/07/2008, 09h56
  4. Exporter vers feuille Excel (sans créer de fichier)
    Par lanonyme dans le forum VBA Access
    Réponses: 2
    Dernier message: 13/06/2008, 16h05
  5. Export variables VBA vers feuille Excel, valeur arrondi
    Par BluE SphynX dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/09/2007, 10h23

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