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 :

Boucle pour mettre à jour des cellules en fonction de 2 types de textboxes


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut Boucle pour mettre à jour des cellules en fonction de 2 types de textboxes
    Bonjour

    Je n'arrive pas à résoudre le probleme suivant :

    J'ai dans un userform un centaine de textboxes pouvant etre nommées 'T3, T4 ... Tx" celles ci contiennent du texte
    et il y aussi des textboxes qui contiennent des dates Tdate25, Tdate50 ...

    Pour éviter les problèmes, le chiffre qui identifie chaque textbox est unique, c'est à dire que si par exemple T3 existe alors Tdate3 n'existe pas .

    Je recherche envoyer dans la ligne 1 de la feuille de calcul 'Base' le contenu des textboxes à partir de la colonne 3

    J'ai écris ces 2 boucles mais ça ne fonctionne pas : lorsqu'une textbox Tdate est vide alors cela envoi vers toutes les cellules de la feuille de calcul un contenu vide.

    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
     
     
        For i = 3 To Nb_max_colonnes
            On Error Resume Next
            Sheets("Base").Cells(ligne_locataire, i) = Me.Controls("T" & i).Value
     
        Next i
     
     
     
     
        For i = 3 To Nb_max_colonnes
     
            On Error Resume Next
     
            If Not Me.Controls("Tdate" & i) Is Nothing Then
     
                If Me.Controls("Tdate" & i).Value = "" Then    ' si une textboxe Tdate est vide alors efface la cellule correspondante dans 'Base'
     
                    'Sheets("Base").Cells(1, i) = ""      
                    Else
                    Sheets("Base").Cells(1, i) = DateValue(Me.Controls("Tdate" & i).Value)
                End If
     
            End If
     
        Next i
    Je vous remercie pour votre aide,

  2. #2
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2023
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2023
    Messages : 1
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    J'ai écris ces 2 boucles mais ça ne fonctionne pas : lorsqu'une textbox Tdate est vide alors cela envoi vers toutes les cellules de la feuille de calcul un contenu vide.
    Bonjour lcoulon, peut-être que cela pourrait fonctionner ?
    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
     
     
        For i = 3 To Nb_max_colonnes
            On Error Resume Next
            Sheets("Base").Cells(ligne_locataire, i) = Me.Controls("T" & i).Value
     
        Next i
     
     
     
     
        For i = 3 To Nb_max_colonnes
     
            On Error Resume Next
     
            If Not Me.Controls("Tdate" & i) Is Nothing Then
     
                Sheets("Base").Cells(1, i) = DateValue(Me.Controls("Tdate" & i).Value)    
     
                    Else : Sheets("Base").Cells(1, i).ClearContents
     
                End If
     
            End If
     
        Next i

  3. #3
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 946
    Par défaut
    Salut, j'ai testé comme ceci et ça fonctionne:

    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
    Private Sub CommandButton1_Click()
        Dim Ctl As Control
        Dim i As Long
        i = 3 ' Numéro de la première colonne à remplir
        ' Parcourir tous les contrôles de l'USF
        For Each Ctl In Me.Controls
            ' Si le contrôle est un TextBox
            If TypeOf Ctl Is MSForms.TextBox Then
                ' Vérifier si son nom commence par "T" ou "Tdate"
                If Left(Ctl.Name, 1) = "T" Or Left(Ctl.Name, 5) = "Tdate" Then
                    ' Vérifier si le contrôle est vide
                     If Len(Ctl.Value) > 0 Then
                        ' Si non, transférer la valeur vers la feuille de calcul
                        Sheets("Base").Cells(1, i) = Ctl.Value
                        ' Incrémenter le numéro de colonne
                        i = i + 1
                    End If
                End If
            End If
        Next
        ' Fermer l'USF
        Unload Me
     
    End Sub

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Merci à vous,

    Cependant je ne peux pas utiliser de for each dans mon cas car il y a aussi d'autres textboxes que Tx et TdateX, du coup le transfert vers la feuille de calcul se trouve totalement décalé

    j'ai essayé d'adapter le principe suggéré mais ca ne fonctionne toujours pas avec le code ci-dessous :
    Le transfert des données des textboxes vers la feuille de calcul fait que toutes les cellules sont vidées hormis celles contenant des dates


    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
    Private Sub Enregistrer_modifications()
     
    Dim i As Integer
    Dim ctrlDate As Control
    Dim ctrlTexte As Control
     
    On Error Resume Next
     
    Set ctrlDate = Me.Controls("Tdate" & i)
    Set ctrlTexte = Me.Controls("T" & i)
     
     
    For i = 3 To Nb_max_colonnes
     
        If TypeOf ctrlDate Is MSForms.TextBox Or TypeOf ctrlTexte Is MSForms.TextBox Then
     
            If Left(ctrlTexte.Name, 1) = "T" & i Then
                    Sheets("Base").Cells(ligne_locataire, i) = ctrlTexte.Value
            End If
     
     
            If Left(ctrlDate.Name, 5) = "Tdate" & i Then
     
                If ctrlDate.Value = "" Then Sheets("Base").Cells(ligne_locataire, i) = ""
                If Not ctrlDate.Value = "" Then Sheets("Base").Cells(ligne_locataire, i) = DateValue(Me.Controls("Tdate" & i).Value)
            End If
     
        End If
     
    Next i
     
    End Sub

  5. #5
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 946
    Par défaut
    Que je comprenne bien, tu veux envoyer le contenu des textbox dans la colonne ayant le même numéro que le textbox ?
    Par exemple colonne 5 pour T5 ou colonne 25 pour Tdate25 ?

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Oui c’est bien cela

    Par contre lorsqu’un textbox Tdate est vide je voudrai que la cellule dans la colonne correspondante de la feuille de calcul soit vidée , actuellement lorsqu’une textbox Tdate est vide, le contenu existant de la colonne correspondante dans la feuille de calcul n'est pas modifié.

    Voici un code qui fonctionne donc partiellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For i = 3 To Nb_max_colonnes
     
            On Error Resume Next
     
            Sheets("Base").Cells(1, i) = Me.Controls("T" & i).Text
     
            Sheets("Base").Cells(1, i) = DateValue(Me.Controls("Tdate" & i).Text)
     
    Next i

  7. #7
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 946
    Par défaut
    Voici qui devrait faire l'affaire, donc le contenu des textbox va dans les colonnes ayant le même numéro et si un textbox est vide la cellule destination sera vidée:

    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
    Private Sub CommandButton1_Click()
     
        Dim Ctl As Control
        Dim i As Long
     
        ' Parcourir tous les contrôles de l'USF
        For Each Ctl In Me.Controls
            ' Si le contrôle est un TextBox
            If TypeOf Ctl Is MSForms.TextBox Then
                ' Vérifier si son nom commence par "Tdate" ou "T"
                If Left(Ctl.Name, 5) = "Tdate" Then ' Si le nom commence par "Tdate"
                    ' Extraire le numéro du nom du contrôle
                    i = Mid(Ctl.Name, 6) ' Prendre la sous-chaîne à partir de la position 6
                ElseIf Left(Ctl.Name, 1) = "T" Then ' Sinon, si le nom commence par "T"
                    ' Extraire le numéro du nom du contrôle
                    i = Mid(Ctl.Name, 2) ' Prendre la sous-chaîne à partir de la position 2
                End If
                ' Transférer la valeur vers la feuille de calcul
                Sheets("Base").Cells(1, i) = Ctl.Value
            End If
        Next
     
        Unload Me
     
    End Sub

  8. #8
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Ca à l'air compliqué

    Le code génère l'erreur " incompatibilité de type " sur la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i = Mid(Ctl.Name, 2) ' Prendre la sous-chaîne à partir de la position 2

  9. #9
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 946
    Par défaut
    Ce n'est pas compliqué, je teste le nom du textbox et en fonction de ce nom je récupère le numéro qui me servira de colonne.
    Chez moi tout fonctionne correctement, je ne vois pas où est le problème.
    Exécute le code pas à pas et vérifie que i contient une valeur numérique, si ce n'est pas le cas tu auras l'erreur 13.
    Si tes textbox ont des noms autres que Tdate mais qui commencent par T suivi d'une lettre ça posera problème.

  10. #10
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Je n'ai pas d'erreur mais lorsque le code est executé , il mets des 0 dans chaque textboxes "T" et ne met pas à jours les textboxes "Tdate"


    Si je traite une textbox séparemment, ceci fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim i As Integer
    Dim ligne As Integer
     
    If Not Me.Tdate142.value = "" Then
        Sheets("Base").Cells(ligne, 142) = CDate(Me.Tdate142.Value)
    End If

    Si je veux traiter toutes les textboxes "Tdate" grâce à une boucle, ceci ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Nb_max_colonnes As Integer 
    Dim i As Integer
    Dim ligne As Integer
     
    For i = 3 To Nb_max_colonnes
            On Error Resume Next
            Sheets("Base").Cells(ligne, i) = CDate(Me.Controls("Tdate" & i).Value)
    Next i

  11. #11
    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 055
    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 055
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Mettre une instruction On Error Resume Next (ligne 7 de votre seconde procédure publiée) sans traiter l'erreur éventuelle qui serait levée et surtout sans rajouter immédiatement après un On Error Goto 0 est un cache misère.
    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

  12. #12
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    J’ai fait ainsi car il y a une discontinuité dans la liste des textbox a traiter ( de 3 à 1xx ) quelques unes sont manquantes.

    Mais sauriez vous me dire pourquoi la boucle que j’ai crée ne fonctionne pas du tout ?

  13. #13
    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 055
    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 055
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Mais sauriez vous me dire pourquoi la boucle que j’ai crée ne fonctionne pas du tout ?
    Avez-vous suivi les recommandations de Franc en faisant tourner votre programme au "Pas à pas" ?

    Toujours dans la seconde procédure que vous avez publiée dans le fil #10, vous avez la ligne 2 (Nb_max_colonnes As Integer) qui devrait se mettre en erreur car il manque l'instruction Dim

    Ensuite vous faites une boucle avec cette variable (Nb_max_colonnes) que vous semblez ne pas avoir alimentée. Etes-vous certain d'avoir publié votre code complet ?
    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

Discussions similaires

  1. Réponses: 11
    Dernier message: 28/03/2014, 01h36
  2. Boucle pour controler valeurs de cellules et faire des actions ensuite
    Par Le Rom dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/02/2010, 13h43
  3. Réponses: 1
    Dernier message: 20/03/2007, 09h58
  4. Réponses: 3
    Dernier message: 26/09/2006, 12h17
  5. mettre à jour un dataset en fonction des valeurs qu'il contient ?
    Par isachat666 dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/06/2006, 14h03

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