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 :

Récup multi Textbox [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Par défaut Récup multi Textbox
    Bonjour à tous,

    Et un de plus,

    Voici voilà mon souci:
    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
    Private Sub ImgValider_Click()
    Dim j, C
    Dim I As Integer
    Dim x As Integer
    Dim MyControl As Control
     
    'Rangement dans Feuille réunion R1/2/3 en fonction des OptBut
     
        'OptionButton sélection R1/R2/R3
        If OptButR1.Value = True Then
            With Sheets("R1") '.....ici selection feuille "R1"
     
                For Each MyControl In UsfSaisieProno.FrameR.Controls
                If TypeOf MyControl Is MSFORMS.TextBox Then
                'Instruction à faire quand le control est un TextBox
                End If
                Next MyControl
     
            End With
        ElseIf OptButR2.Value = True Then
            With Sheets("R2") '.....ici selection feuille "R2"
     
            End With
        ElseIf OptButR3.Value = True Then
            With Sheets("R3") '.....ici selection feuille "R3"
     
            End With
        End If
     End Sub
    Comme vous pouvez le voir je me suis vite trouvé bloqué.

    Voici mon userform de saisie:

    Nom : prono.jpg
Affichages : 426
Taille : 39,1 Ko

    Sur celui-ci, il y 80 textbox, chaque lignes contient 10 textbox.

    Dans mes feuilles "R1/R2/R3", voici comment elles se présentent:

    Nom : BDD.jpg
Affichages : 591
Taille : 32,7 Ko

    J'aimerai selon l'optbut sélectionné, qu'il consigne dans mes feuilles (colonne de O à X et ligne de 3 à 10) le text contenu dans chaque textbox, à savoir que le userform représente exactement les feuilles "R1/2/3") (ex: textbox1=O3; textbox2=P3.....; textbox11=O4; textbox12=P4...etc..)

    A savoir aussi que ces données sont saisie tous les jours avec une date (via calendrier) (voir image) et qu'il y a à chaque fois 8x10 textbox à saisir, donc sur 8 lignes à chaque fois...

    Merci pour vos lumières

    Seb

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Il faut que tu construises un tableau de données à deux dimensions avec l'ensemble de valeurs de chaque "TextBox".
    Il faut donc nommer les "TextBox" dans un ordre croissant ou avec une certaine logique.

    Ensuite il suffit simplement de coller ton tableau dans la feuille de ton choix et au bon endroit.

    Question : Pourquoi ne pas créer une feuille de saisie des données plutôt que de passer par un "UserForm" avec 80 "TextBox" ?

    Cordialement,
    SmallFlower

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Par défaut
    Tu pourrais peut-être créer les textbox à l'initialisation du userform de manière dynamique, parce que renommer chaque textbox ou autre ça risque d'être très chiant à faire !

    Ou alors en les renommant un peu de ce genre-là : TextBox[X][Y] avec X qui va de 1 à 8 et Y de 0 à 9 comme ça tu peux facilement boucler dedans et reconstruire n'importe quel tableau un peu de ce genre-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For Each MyControl In UsfSaisieProno.FrameR.Controls
         If TypeOf MyControl Is MSFORMS.TextBox Then
           x = CInt(Mid(MyControl.Name, 8, 1))
           y = CInt(Mid(MyControl.Name, 9, 1))+1
           Range(x,y).Value = MyControl.Text 'ou Range(Tableau).Cells(x,y).value
        End If
    Next MyControl
    Forcément c'est un peu chiant de renommer tes 80 textboxes... Sinon tu pourrais jouer avec leur Tag dès l'initialisation du UserForm en les "scannant" avec par exemple :

    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
    Select Case MyControl.Top 
         Case xxx 
             MyControl.Tag = 1
         Case yyy 
             MyControl.Tag = 2
         Case zzz
             MyControl.Tag = 3
         '... jusqu'à 8
    End Select
     
    Select Case MyControl.Left
        Case aaa
              MyControl.Tag = MyControl.Tag & 0
        Case bbb
              MyControl.Tag = MyControl.Tag & 1
        Case ccc
              MyControl.Tag = MyControl.Tag & 2
        '... jusqu'à 9
    End Select
    Bien sûr, les xxx, aaa et tout sont des valeurs que tu obtiens en regardant ton userform ou même en faisant des intervalles. (<aaa puis <bbb puis <ccc...)

    Quentin

  4. #4
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Par défaut re
    Bonsoir à vous deux,

    Merci pour votre intervention

    @SmallFlower
    Tu sais je suis autodidacte donc besoin de support pour travailler, j'apprends tous les jours en VBA, mais je t'accorde que pondre un code sans modèle.....je suis perdu
    Je comprends parfaitement ce que tu as écrit mais de là à le mettre en application est une autre histoire.....!!!

    @Quentin77170:
    Ton code postale fini comme le mien sauf que moi c 76170

    Sinon, pour info, mes textbox sont nommé textbox1 à textbox80
    Forcément c'est un peu chiant de renommer tes 80 textbox... Sinon tu pourrais jouer avec leur Tag dès l'initialisation du UserForm en les "scannant" avec par exemple :
    Désolé mais je ne vois pas le truc
    Bien sûr, les xxx, aaa et tout sont des valeurs que tu obtiens en regardant ton userform ou même en faisant des intervalles. (<aaa puis <bbb puis <ccc...)
    Et encore moins ici

    Ouhh lala, je fais quoi avec tout cela.....

    Seb

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Par défaut
    Héhé

    Sont elles au moins dans le bon ordre ? Après, l'ordre croissant comme ça n'est pas forcément le plus pratique car tu perds la notion de tableau... et encore, t'as 10 colonnes donc c'est déjà ça !

    Quand je parlais des tag, c'est une sorte de zone tampon où tu stockes l'info que tu veux, l'utilisateur ne le verra jamais. C'est pour cela que je pensais que tu pouvais "scanner" ton UserForm et pour chaque TextBox dont la propriété .Top (donc sa coordonnée verticale) vaut 50 (par exemple) ou de 40 à 60 si tu veux avoir un intervalle, alors tu sais qu'elles sont en première ligne, donc dans leur tag tu écris "1" et ensuite tu scannes leur .Left (coordonnée horizontale) et si elles sont au niveau de la 1ère colonne, alors tu complètes le tag avec 0 donc tu retraces la cartographie graphique de tes textbox...
    Comme ça tu obtiens dans le tag de chaque textbox leur position : 23 (2ème ligne, 4ème colonne (car on commence de 0 à 9 comme tu as 10 colonnes))

    Je sais pas si c'est plus clair, lol.

    Mais franchement, moi je pense que tu devrais regarder quelque chose qui ressemble à ma première proposition : renommer les textbox ainsi :

    Ou alors en les renommant un peu de ce genre-là : TextBox[X][Y] avec X qui va de 1 à 8 et Y de 0 à 9 comme ça tu peux facilement boucler dedans et reconstruire n'importe quel tableau un peu de ce genre-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For Each MyControl In UsfSaisieProno.FrameR.Controls
         If TypeOf MyControl Is MSFORMS.TextBox Then
           x = CInt(Mid(MyControl.Name, 8, 1)) 
           y = CInt(Mid(MyControl.Name, 9, 1))+1
           Range(x,y).Value = MyControl.Text 'ou Range(Tableau).Cells(x,y).value
        End If
    Next MyControl
    ça te demande 5 minutes à t'embêter à renommer les textbox mais après tu es tranquille !

  6. #6
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Par défaut Re Quentin
    ouuuhhhaa, alors là c le summum

    Euh comment dire!!!!

    C clair

    ça te demande 5 minutes à t'embêter à renommer les textbox mais après tu es tranquille !
    Ok, mais je t'avoues que je suis largué là.....
    La façon de ton code, je ne comprends pas

    Sont elles au moins dans le bon ordre ?
    Oui, dans usf, 1ère ligne = textbox de 1 à 10 etc....

    Seb

  7. #7
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    pour remplir tes 80 textbox en une seule boucle (j'ai ajouté des variables pour que tu comprennes)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub TextboxParty()
    Dim i As Integer
    Dim DepartLig As Long
    Dim DepartCol As Long
    Dim NbCol As Long
    DepartLig = 3
    DepartCol = 15
    NbCol = 10
     
    For i = 0 To 79              '(1)             (2)         (3)          (4)
        Sheets("Feuil1").Cells(DepartLig + Int(i / NbCol), DepartCol + (i Mod NbCol)) = Me.Controls("TextBox" & i + 1).Text
    Next i
     
    End Sub
    La logique est la suivante :
    (1) On doit commencer en ligne 3
    (2) On doit se décaler d'une ligne tous les 10 incréments
    (3) On doit commencer en colonne 15
    (4) On écrit sur 10 colonnes, en revenant au départ après chaque cycle


    Tu n'as plus qu'à gérer le calcul de ta ligne de départ en relation à ta date, puisque je ne sais pas quand et comment tu l'inscrit dans ta colonne 14

  8. #8
    Membre chevronné
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Par défaut
    Je pense que la solution de joe répondrait à ton besoin ! Juste pour finir avec ta question concernant mon baratin :

    Ta TextBox en première ligne et 1ère colonne s'appellerait TextBox10 '0 car tu as 10 colonnes et je veux rester simplement sur un schéma "XY" avec X de 1 à 8 et Y de 0 à 9 (donc bien 10 valeurs)
    Ta TextBox en 4ème ligne et 8ème colonne s'appellerait TextBox47

    Pour venir lire les coordonnées, il suffit de lire le nom de la textbox :
    Pour TextBox47 alors X = 4 et Y = 7

    On obtient ça avec la fonction Mid("la string",[à partir de quel caractère],[combien de caractères]) donc Mid("TextBox47",8,1) va bien récupérer "4" et Mid("TextBox47",9,1) va récupérer "7" auquel on ajoute +1 pour avoir la vraie colonne.

    Seulement, Mid te donne du texte, par sécurité on le convertit en nombre entier avec Int("String") donc CInt(Mid("TextBox47",8,1)) = 4 et plus "4"
    Le "TextBox47" tu l'obtiens pour toutes les TextBox avec ton For Each MyControl... Donc x = CInt(Mid(MyControl.Name,8,1)

    à partir de là, on a X et Y en vraies valeurs numériques, on peut les écrire où on veut à partir du moment où on a une référence ! Par exemple tu veux les écrire pas de A1 à J10 mais de B3 à K12... Tu peux marquer simplement Range("B3:K12").Cells(X,Y) = le contenu de ta textbox

    'Comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For Each MyControl In UsfSaisieProno.FrameR.Controls
         If TypeOf MyControl Is MSFORMS.TextBox Then
             Debug.Print MyControl.Name '... donc à partir de là tu peux faire ce que j'ai écrit :
             x = CInt(Mid(MyControl.Name, 8, 1)) 
             y = CInt(Mid(MyControl.Name, 9, 1))+1
             Cells(x,y).Value = MyControl.Text 'ou Range("B3:K12").Cells(x,y).Value 'Oops, j'avais écrit Range au lieu de Cells au début
         End If
    Next MyControl

  9. #9
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Par défaut Slt à vous deux
    Etant le WE, je ne pourrai pas tester car beaucoup d'occupation!!!!

    @Joe:

    Ton code est simple à comprendre merci pour tes explications, par contre j'ai une question.

    Si les textbox ne sont pas tous remplis? car comme tu le dis:
    (2) On doit se décaler d'une ligne tous les 10 incréments
    Comment cela va se comporter?

    Cela est valable pour une journée, car on commence à la ligne 3, mais le lendemain, ce n'est plus la ligne 3 mais la 12ème ligne etc etc pour chaque jour suivant?
    Tu n'as plus qu'à gérer le calcul de ta ligne de départ en relation à ta date, puisque je ne sais pas quand et comment tu l'inscrit dans ta colonne 14
    Il me reste à déterminer encore cette partie, pour l'instant je ne souhaite que pouvoir consigner les textbox dans une Bdd1 ou bdd2 ou bdd3 selon optbut sélectionné, comme dans le code plus haut.

    @Quentin:

    Merci pour tes explications elle sont bien plus claire, c une approche audacieuse en tout cas et réfléchie (comme dans un tableau avec abscisse et ordonnée).

    Bonne journée
    seb

  10. #10
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    les incréments de boucle sont indépendant du contenu (ou de l'absence de contenu de tes textbox)

    les cellules correspondant aux textbox vide seront simplement vides


    concernant le calcul de la ligne de départ, je reste sur le fait qu'on ne sait pas quand et comment tu écris ta date en colonne 14

    une fois qu'on sait ça, on doit juste modifier la définition de DepartLig

    si par exemple tu fais la journée du 01/01/2015 et qu'elle est déjà écrite en colonne 14, tu calcules DepartLig = Recherche.Row
    où Recherche est le résultat d'un Find sur la date voulue, en colonne 14

    si en revanche, tu connais la date mais qu'elle n'existe pas :

    - tu cherches la première ligne non vide en colonne 15
    - son Row est dont ton DepartLig
    - tu écris la date en colonne 14
    - tu fais le remplissage du tableau
    ==> attention à être sûr que ta colonne15 ne contient pas d'enregistrement vide, sinon :

    - tu cherches la dernière date en colonne 14
    - DerLig = Row de la dernière date + 8
    - etc...


    bref, tout est possible, ça dépend de ton contexte

  11. #11
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Par défaut Re : Salut
    les cellules correspondant aux textbox vide seront simplement vides
    Merci pour la précision

    concernant le calcul de la ligne de départ, je reste sur le fait qu'on ne sait pas quand et comment tu écris ta date en colonne 14
    Après réflexion, la date sera saisie en même temps que l'ouverture (via calendrier) de usf, je choisirai la date puis je remplirai les textbox, il faudra automatiquement saisir une date pour autoriser le saisie dans les textbox.
    donc nous serions dans ce cas:
    si par exemple tu fais la journée du 01/01/2015 et qu'elle est déjà écrite en colonne 14, tu calcules DepartLig = Recherche.Row
    où Recherche est le résultat d'un Find sur la date voulue, en colonne 14
    Donc si je reprends ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim i As Integer
    Dim DepartLig As Long
    Dim DepartCol As Long
    Dim NbCol As Long
    DepartLig = 3
    DepartCol = 15
    NbCol = 10
     
    For i = 0 To 79              '(1)             (2)         (3)          (4)
        Sheets("Feuil1").Cells(DepartLig + Int(i / NbCol), DepartCol + (i Mod NbCol)) = Me.Controls("TextBox" & i + 1).Text
    Next i
    c'est cette partie qu'il faut que j'insère dans le IF optbutR1:
    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
    Private Sub ImgValider_Click()
    Dim j, C
    Dim I As Integer
    Dim x As Integer
    Dim MyControl As Control
     
    'Rangement dans Feuille réunion R1/2/3 en fonction des OptBut
     
        'OptionButton sélection R1/R2/R3
        If OptButR1.Value = True Then
            With Sheets("R1") '.....ici selection feuille "R1"
     
                For Each MyControl In UsfSaisieProno.FrameR.Controls
                If TypeOf MyControl Is MSFORMS.TextBox Then
                'Instruction à faire quand le control est un TextBox
                End If
                Next MyControl
     
            End With
        ElseIf OptButR2.Value = True Then
            With Sheets("R2") '.....ici selection feuille "R2"
     
            End With
        ElseIf OptButR3.Value = True Then
            With Sheets("R3") '.....ici selection feuille "R3"
     
            End With
        End If
     End Sub
    Par contre, pour le lendemain et les jours suivant, comment dans ton code il sait qu'il doit aller à la dernière ligne vide du tableau?

    Parce qu'ici ils sont fixe?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DepartLig = 3
    DepartCol = 15
    Bonne soirée

    Seb

  12. #12
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Je ne sais pas si tu as d'autres contrôles sur ton formulaire que ceux dont on parle

    en nommant les contrôles ainsi :

    - OptionButton1 à OptionButton3, avec le nom exact des 3 feuilles dans leur caption
    - un TexteBox, appelé par exemple TextBox_Date pour la date de ta réunion
    - 80 TextBox, numérotés de 1 à 80 pour bien remplir ton tableau de 10 colonnes sur 8 lignes

    ça devrait donner ça (j'ai pas testé)

    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
    Private Sub ImgValider_Click()
    Dim j As Integer
    Dim i As Integer
    Dim DepartLig As Long
    Dim DepartCol As Long
    Dim NbCol As Long
     
    For j = 1 To 3
        ' choix de la feuille
        If Me.Controls("OptionButton" & j) = True Then
            With ThisWorkbook.Worksheets(Me.Controls("OptionButton" & j).Caption)
                DepartCol = 15
                NbCol = 10
                '       dernière ligne remplie en colonne 14      + 8 lignes
                DepartLig = .Cells(.Rows.Count, 14).End(xlUp).Row + 8
                ' remplissage de la date
                .Cells(DepartLig, 14) = CDate(Me.TextBox_Date.Text)
                ' remplissage des textbox
                For i = 0 To 79
                    .Cells(DepartLig + Int(i / NbCol), DepartCol + (i Mod NbCol)) = Me.Controls("TextBox" & i + 1).Text
                Next i
            End With
            Exit For
        End If
    Next j
     
    End Sub
    si t'as bien compris le truc, tu peux même raccourcir en supprimant les variables NbCol et DepartCol qui ne sont utilisés qu'une fois, et DepartLig qui n'est utilisé que 2 fois

  13. #13
    Expert confirmé
    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
    Par défaut
    Bonjour,

    Une proposition avec un module de classe et une création automatique de tous les TextBox. Les valeurs saisies dans les TextBox seront entrées simultanément dans la cellule correspondante par rapport à la date définie et ceci dans la feuille active. A mettre dans le module de la Form :
    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
     
    Dim TblTxt() As New Classe1
     
    Private Sub UserForm_Initialize()
     
        Dim Txt As MSForms.TextBox
        Dim NbCtrl As Integer
        Dim I As Integer
        Dim J As Integer
        Dim K As Integer
        Dim Haut As Integer
        Dim Gauche As Integer
        Dim Largeur As Integer
        Dim Hauteur As Integer
        Dim Espace As Integer
        Dim Barre As Integer
        Dim LaDate As Date
        Dim Cel As Range
     
        'date pour entrée des valeur
        LaDate = Date
     
        'recherche la date afin de récupérer le numéro de ligne
        Set Cel = Range("N:N").Find(LaDate, , xlValues, xlWhole)
     
        'si pas trouvé, fin !
        If Cel Is Nothing Then Exit Sub
     
        'hauteur de la barre de titre de la Form
        Barre = 18
     
        'dimensions des contrôles
        Hauteur = 20
        Largeur = 20
     
        'espace les séparant
        Espace = 5
     
        'nombre de contrôles
        NbCtrl = 80
     
        'point de départ
        Haut = Espace
        Gauche = Espace
     
        'numéro de la première ligne devant recevoir les données
        K = Cel.Row
     
        'boucle sur le nombre
        For I = 1 To NbCtrl
     
            'création des TextBox
            Set Txt = Me.Controls.Add("Forms.TextBox.1", "Txt" & I, True)
     
            J = J + 1
     
            'définition de certaines propriétés des TextBox
            With Txt
     
                .Top = Haut
                .Left = Gauche
                .Height = Hauteur
                .Width = Largeur
                .Tag = Chr(78 + J) & K
     
            End With
     
            'stocke le TextBox dans le tableau
            ReDim Preserve TblTxt(1 To I)
            Set TblTxt(I).GroupeTxt = Txt
     
            Gauche = Gauche + Largeur + Espace
     
            'si 10 contrôles ont été créés, passe à la ligne suivante
            If I Mod 10 = 0 Then
     
                Haut = Haut + Hauteur + Espace
                Gauche = Espace
                J = 0
                K = K + 1
     
            End If
     
        Next I
     
        'adapter si besoin de plus de place sur la Form
        Me.Width = Espace * 12 + Largeur * 10
        Me.Height = Barre + Espace * 10 + Hauteur * 8
     
    End Sub
    A mettre dans un module de classe nommé Classe1 (nom par défaut) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public WithEvents GroupeTxt As MSForms.TextBox
     
    Private Sub GroupeTxt_Change()
     
        ActiveSheet.Range(GroupeTxt.Tag).Value = GroupeTxt.Text
     
    End Sub
    Pour effectuer le test, fais une copie de ton classeur, supprime ta Form et ajoutes en une nouvelle, c'est dans le module de cette nouvelle Form que tu colle le code donné plus haut.
    Je n'ai pas lu en détail tous les posts mais j'ai aperçu qu'il était question de bouton d'option, si c'est pour le choix de la feuille, il est tout à fait possible de les rajouter automatiquement pour pouvoir effectuer le choix. Dis moi si ma proposition t'intéresse et dans ce cas, ce que je dois modifier.

    Hervé.

  14. #14
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Par défaut Bonjour
    Bonjour à vous deux,

    @Hervé:
    Ravi de ta participation...
    Je n'ai jamais essayer avec un module de classe, je t'avouerai que je ne me suis jamais penché dessus car étant novice dans le VBA....enfin tu vois ce que je veux dire

    Je suis autant preneur de ta solution tout comme celle de Joe, car j'aime apprendre donc avec c deux façon, ce n'est que du bonheur dans mon apprentissage.

    qu'il était question de bouton d'option, si c'est pour le choix de la feuille
    Oui exactement dans une frame, avec 3 optbut, qui me permettrons de sélectionner une feuille ou l'autre, et d'y consigner les textbox saisies. J'en parle plus haut dans d'autres messages.

    Il vais essayer ton code, pas ce soir car pas assez de temps, mais demain.

    @Joe:
    Je ne sais pas si tu as d'autres contrôles sur ton formulaire que ceux dont on parle
    Seulement des boutons images "Annuler", "valider" et "exit", une image, et un label pour la date d'aujourd'hui (c juste une info rien à voir avec la date dans les feuilles)

    un TexteBox, appelé par exemple TextBox_Date pour la date de ta réunion
    Oui la rentrer manuellement est une solution aussi.
    si t'as bien compris le truc, tu peux même raccourcir en supprimant les variables NbCol et DepartCol qui ne sont utilisés qu'une fois, et DepartLig qui n'est utilisé que 2 fois
    Oui j'ai compris ton code, mais en soi Est-ce vraiment la peine de supprimer ces variables?

    MErci pour ton aide

    Seb

  15. #15
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    la structure de tes contrôles est compatible avec ma proposition

    après, supprimer les variables pour les remplacer par leur valeur littérale, c'est une question de goût et parfaitement subjective
    tu gardes la bonne visibilité dans ton code au prix de quelques lignes supplémentaires si tu les conserves, ça ne change rien à l'aspect fonctionnel de choses



    concernant ta date de réunion, si elle est déjà saisie sur la feuille avant de lancer la procédure de remplissage, tu remplaces
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DepartLig = .Cells(.Rows.Count, 14).End(xlUp).Row + 8
                ' remplissage de la date
                .Cells(DepartLig, 14) = CDate(Me.TextBox_Date.Text)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DepartLig = .Cells(.Rows.Count, 14).End(xlUp).Row

  16. #16
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Par défaut
    concernant ta date de réunion, si elle est déjà saisie sur la feuille avant de lancer la procédure de remplissage, tu remplaces
    Ok, mais il y a certainement un moyen, de contrôler avant s'il y a une date

    Car en faite, en regardant ce dont je veux faire, et bien, un jour je peux saisir les texbox avant l'importation et vis et versa.....

    MErci pour tout

    Seb

  17. #17
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Par défaut
    Salut à tous,

    Joe:

    Merci le code il fonctionne très bien, la seul chose que j'ai modifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DepartLig = .Cells(.Rows.Count, 5).End(xlUp).Row + 1 '+ 8
    J'ai mis +1 et non +8, car à chaque nouvelle saisie il sautait 8 lignes

    Ok, mais il y a certainement un moyen, de contrôler avant s'il y a une date
    Je vais regarder cela, car ça ne doit pas être bien compliqué à mettre en œuvre
    avec un If cellule non vide

    Quentin:

    Je n'ai pas encore eu le temps de tester ton code, je reviendrai vers toi et de demanderai des explications car je ne connais pas le module de classe, j'étudie...

    Bonne soirée
    Seb

    Ps: je ne passe pas le sujet en résolu car c possible que j'ai d'autres demandes après plusieurs tests

  18. #18
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Par défaut Re à vous
    Bonjour le forum,

    Pour compléter ma demande,
    Ok, mais il y a certainement un moyen, de contrôler avant s'il y a une date
    Voici le bout de code associé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Not IsEmpty(.Cells(DepartLig, 1)) Or .Cells(DepartLig, 1).NumberFormat = "dd-mm-yyyy" Then
                    MsgBox "une date est déjà présente"
                Else
                    .Cells(DepartLig, 1) = CDate(Me.TextBox_Date.Text)
                End If
    Je vous remercie vous de votre participation, comme d'hab enrichissante et active

    Seb

  19. #19
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Par défaut re
    Bonsoir le forum,

    Je déterre ce sujet résolu, car j'ai un souci, je n'arrive pas à faire comprendre à mon code qu'il dois sauter 1 ligne après chaque click toutes les 8 lignes...pffff, j'ai du mal avec sa logique, je n'ai pas la même logique que lui, donc évidemment c pas simple entre nous

    voici le code:
    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
    Private Sub ImgValider_Click()
    Dim i As Integer
    Dim DepartLig As Long
    Dim DepartCol As Long
    Dim NbCol As Long
     
    For j = 1 To 3
        ' choix de la feuille
        If Me.Controls("OptButR" & j) = True Then
            With ThisWorkbook.Worksheets(Me.Controls("OptButR" & j).Caption)
                DepartCol = 5
                NbCol = 10
                '       dernière ligne remplie en colonne 5      + 8 lignes
                DepartLig = .Cells(.Rows.Count, 5).End(xlUp).Row + 1 '+ 8
     
                ' remplissage de la date
                If Not IsEmpty(.Cells(DepartLig, 1)) Or .Cells(DepartLig, 1).NumberFormat = "dd-mm-yyyy" Then
                    MsgBox "une date est déjà présente"
                Else
                    .Cells(DepartLig, 1) = CDate(Me.TextBox_Date.Text)
                End If
                ' remplissage des textbox
                For i = 0 To 79
                    .Cells(DepartLig + Int(i / NbCol), DepartCol + (i Mod NbCol)) = Me.Controls("TextBox" & i + 1).Text
                Next i
            End With
            Exit For
        End If
    Next j
     
    End Sub
    Seb bonne soirée à tous

  20. #20
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    je devine peut être mal, mais tu souhaites regarder la dernière date remplie
    si elle correspond pas à ton textbox_date, on doit se décaler de 8 lignes et écrire la date

    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
    Private Sub ImgValider_Click()
    Dim i As Integer
    Dim DepartLig As Long
    Dim DepartCol As Long
    Dim NbCol As Long
     
    For j = 1 To 3
        If Me.Controls("OptButR" & j) = True Then
            With ThisWorkbook.Worksheets(Me.Controls("OptButR" & j).Caption)
                DepartCol = 5
                NbCol = 10
     
                'dernière ligne remplie en colonne 5
                DepartLig = .Cells(.Rows.Count, 5).End(xlUp).Row
     
                ' si la date n'est pas celle de textbox_date
                If .Cells(DepartLig, 1) <> CDate(Me.TextBox_Date.Text) Then
     
                    ' on se décale de 8 lignes
                    DepartLig = DepartLig + 8
                    ' on écrit la date
                    .Cells(DepartLig, 1) = CDate(Me.TextBox_Date.Text)
     
                End If
     
                For i = 0 To 79
                    .Cells(DepartLig + Int(i / NbCol), DepartCol + (i Mod NbCol)) = Me.Controls("TextBox" & i + 1).Text
                Next i
            End With
            Exit For
        End If
    Next j
     
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. TextBox Multi Lignes
    Par mdordenart dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 21/07/2009, 11h24
  2. Réponses: 5
    Dernier message: 04/03/2009, 20h03
  3. textbox multi colonne
    Par alsimbad dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/08/2008, 06h17
  4. Problème récup infos textbox
    Par Aizen64 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 21/02/2008, 12h39
  5. Multi Styles et Couleurs dans Textbox
    Par Danyel dans le forum VB.NET
    Réponses: 2
    Dernier message: 23/07/2007, 17h20

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