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 :

USERFORM : Chek box dasn USERFORM


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2017
    Messages : 11
    Par défaut USERFORM : Chek box dasn USERFORM
    Bonjour à tous,

    Je dois créer un formulaire de modification / consultation d'une base. J'ai télécharger un modèle sur le site de J. Boisgontier.
    Mais, malgré de multiples recherches, je n'arrive pas à finaliser la personnalisation de mon Userfom. Je précise que je suis novice en VBA.

    J'ai besoin de créer :
    Des cases à cocher : selon l'identifiant (donc ligne) doit reporter 1 ou "" dans la colonne de la feuille BD (range avec variable ligne ? )
    Code : liste intuitive selon le référentiel des codes se trouvent sur une autre feuille "Code_ano", et enregistrement .

    L'affichage doit être le reflet de la BD. Cette dernière est lié à des graphiques, taux, reporting.....

    Je vous joint le fichier épuré (en jaune précision du besoin).

    D'avance merci de votre aide cela fait un moment que j'essaie de le finaliser
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 417
    Par défaut
    Bonjour,

    Partie de la solution pour inscrire ce qui est coché dans les CheckBox dans la feuille BD:
    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
    Private Sub b_valid_Click()
       If Me.Enreg <> "" And Me.TextBox1 <> "" Then
          NoEnreg = Me.Enreg
          For k = 1 To Ncol
             '--- attention: ne reprend pas correctement "Observation" en colonne 43
             x = Replace(Me("textBox" & k), " ", "")
             If IsNumeric(x) Then
               f.Cells(NoEnreg, k) = Val(x)
             Else
               f.Cells(NoEnreg, k) = Me("textBox" & k)
             End If
          Next k
          '--- il y a 31 CheckBox
          '--- attention à ne pas ne changer la numérotation
          '--- 13 = colonne M, 14 = colonne N, ... , 31 = colonne AR
          For k = 1 To 31
             If Me("CheckBox" & k) Then
                '--- case cochée = Vrai
                f.Cells(NoEnreg, k + 12) = 1
             Else
                '--- case décochée = Faux
                f.Cells(NoEnreg, k + 12) = ""
             End If
          Next k
          raz
          Me.Enreg = ""
          UserForm_Initialize
       End If
    End Sub
    b
    mais il vous faudra trouver le moyen de faire la chose inverse, cocher les CheckBox dans le formulaire en fonction de ce qui se trouve dans la feuille BD:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub ListBox1_Click()
        For k = 1 To 12
          Me("textBox" & k) = Me.ListBox1.Column(k - 1)
        Next k
        Me("textBox13") = "?"        '--- à faire: 'Observation' est en colonne 43 (AS)
        For k = 1 To 31
          'Me("CheckBox" & k) = ???  '--- à faire --- sans doute avec un If
        Next k
    End Sub
    Bonne continuation.

  3. #3
    Membre averti
    Femme Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2017
    Messages : 11
    Par défaut
    Bonjour,

    Merci pour votre réponse. J'ai modifié mon code et changer le sens des check box afin qu'ils correspondent à mes colonnes.
    Par contre j'ai essayé de faire remonter l'info dans mon formulaire mais lorsque je valide toutes les check box sont cochées. Pouvez vous me dire ou se situe mon erreur. Dois je inscrire un code pour chaque checkbox ?

    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
    Private Sub b_valid_Click()
        If Me.Enreg <> "" And Me.TextBox1 <> "" Then
          NoEnreg = Me.Enreg
          For k = 1 To Ncol
             x = Replace(Me("textBox" & k), " ", "")
             If IsNumeric(x) Then
               f.Cells(NoEnreg, k) = Val(x)
             Else
               f.Cells(NoEnreg, k) = Me("textBox" & k)
             End If
     
          'Insertion aide Forum report chek dans bd
              Next k       
          For k = 1 To 32
             If Me("CheckBox" & k) Then '--- case cochée = Vrai
                f.Cells(NoEnreg, k + 12) = 1
             Else                       '--- case décochée = Faux
                f.Cells(NoEnreg, k + 12) = ""
             End If
     
             'Insertion perso report bd dans check
             If f.Cells(NoEnreg, k + 12).Value = "1" Then Sheets("Choix").Select
             Me("CheckBox" & k).Value = True
     
             Next k
          raz
          Me.Enreg = ""
          UserForm_Initialize
        End If
    End Sub

    J'ai aussi essayé d'étendre la sélection du tableau jusqu'à la colonne BK en modifiant entre autres le Set rng. Si je sélectionne au dessus de la colonne L j'ai un message d'erreur "Erreur d'exécution '-2147024809 : Objet spécifié introuvable".
    Pourtant si j'ai bien compris je dois définir ma variable rng afin de définir ma variable Ncol ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub UserForm_Initialize()
       Set f = Sheets("bd")
       Set Rng = f.Range("A2:L" & f.[A65000].End(xlUp).Row)
       decal = Rng.Row - 1[ATTACH]368607[/ATTACH]
       Ncol = Rng.Columns.Count
       TblTmp = Rng.Value
       Ncol = Rng.Columns.Count - 1
       ReDim choix(1 To UBound(TblTmp))

    Merci de votre aide

  4. #4
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 417
    Par défaut
    Bonjour,
    Pour récupérer les valeurs des CheckBox, une façon de faire:
    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
    Private Sub ListBox1_Click()
       Dim k As Long, kL As Long
       For k = 1 To Ncol
          Me("textBox" & k) = Me.ListBox1.Column(k - 1)
       Next k
       kL = kLigneDonnees(Me.TextBox1)  '--- voir fonction
       If kL = 0 Then
          '--- ne rien faire, ligne de données non trouvée
       Else
          For k = 1 To 32
             If f.Cells(kL, k + 12) = 1 Then
                Me("CheckBox" & k) = True
             Else
                Me("CheckBox" & k) = False
             End If
          Next k
       End If
    End Sub
    qui fait appel à la fonction kLigneDonnees (car il ne faut bien distinguer Identifiant et Ligne de données):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Function kLigneDonnees(kId As Long) As Long   '--- ligne où trouve les données
       '--- il est supposé que l'indifiant est un nombre entier
       Debug.Print "kId: "; kId
       Dim kL As Long, rFind As Range
       kLigneDonnees = 0
       Set rFind = Rng.Find(What:=kId, LookAt:=xlWhole)
       If rFind Is Nothing Then
          MsgBox "Pas trouvé l'identifiant " & kId
       Else
          kLigneDonnees = rFind.Row
       End If
       Set rFind = Nothing
       Debug.Print "kLigneDonnees: "; kLigneDonnees
    End Function
    fonction qui est également employée pour "valider" les modifications:
    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
    Private Sub b_valid_Click()
       Dim kL As Long, k As Long, x As String
       If Me.Enreg <> "" And Me.TextBox1 <> "" Then
          kL = kLigneDonnees(Me.ListBox1.Column(0))  '--- voir fonction
          '--- attention: on ne peut pas mettre Me.TextBox1 vu que cette valeur peut être modifiée
          If kL = 0 Then
             '--- ne rien faire, ligne de données non trouvée
          Else
             For k = 1 To Ncol
                x = Replace(Me("textBox" & k), " ", "")
                If IsNumeric(x) Then
                  f.Cells(kL, k) = Val(x)
                Else
                  f.Cells(kL, k) = Me("textBox" & k)
                End If
             'Insertion aide Forum
                 Next k
             '--- il y a 32 CheckBox
             '--- attention à ne pas ne changer la numérotation
             '--- 13 = colonne M, 14 = colonne N, ... , 32 = colonne AR
             For k = 1 To 32
                If Me("CheckBox" & k) Then
                   '--- case cochée = Vrai
                   f.Cells(kL, k + 12) = 1
                Else
                   '--- case décochée = Faux
                   f.Cells(kL, k + 12) = ""
                End If
                'Insertion perso
                'If f.Cells(NoEnreg, k + 12).Value = "1" Then Sheets("Choix").Select '--- utile ?
                'Me("CheckBox" & k).Value = True     '--- à mettre dans raz
             Next k
          End If
          raz
          'Me.Enreg = ""
          UserForm_Initialize
        End If
    End Sub
    avec un ajout du décochage des CheckBox dans la routine raz:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub raz()
       Dim k As Long
       For k = 1 To Ncol
          Me("textBox" & k) = ""
       Next k
       For k = 1 To 32
          Me("CheckBox" & k).Value = False
       Next k
       Me.TextBox1.SetFocus
    End Sub
    Par ailleurs je ne peux que recommander l'utilisation systématique de Option Explicit pour tous les codes VBA. Cela permet d'éviter de perdre un temps considérable à rechercher des bugs liés à de simples fautes de frappe dans les noms des variables. Pour cela, dans l'éditeur de code, cliquer dans le menu sur Outils / Options et cocher "Déclaration des variables obligatoire". Cela vous demandera d'ajouter des instructions Dim dans la plupart des routines que vous avez réalisées.

    Bonne continuation.

  5. #5
    Membre averti
    Femme Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2017
    Messages : 11
    Par défaut
    Bonjour

    Tout d'abord merci de m'accorder de votre temps.
    J'ai fait les modifs cela fonctionne en mode ajout ou consult par contre en modif lorsque je clique sur validation, les lignes identique s'ajoute à la BD. J'ai beau essayé de chercher mais action nul voir pire
    Dans la Private KligneDonnées l'identifiant sera en format "Texte" (il commence par 0)

    L'option "Déclaration des variables obligatoire" est déjà coché. Merci pour ce conseil, il est effectivement très utile de l'utiliser. Je modifie en ce sens.

    Cordialement
    Fichiers attachés Fichiers attachés

  6. #6
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 417
    Par défaut
    Bonjour,
    Il faut corriger la fonction kLigneDonnees pour ce qui est de cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Set rFind = RNG.Columns(1).Find(What:=kId, LookAt:=xlWhole)
    la recherche ne devant s'effectuer que sur la colonne A.
    Pour ce qui est de Option Explicit, il faut l'ajouter manuellement pour tous les modules déjà créés.
    Bonne continuation.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. code texte box dans userform
    Par pierrot14 dans le forum VBA Project
    Réponses: 0
    Dernier message: 09/12/2013, 13h36
  2. [XL-2007] Activer bouton userform depuis un autre userform
    Par stephadm dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 13/10/2012, 21h45
  3. creation chek box list
    Par yassin-59 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 18/05/2010, 16h44
  4. [XL-2007] reduire l'userform et agrandir l'UserForm
    Par patricktoulon dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 24/10/2009, 18h41
  5. Userform pilotant un autre Userform
    Par ML0808 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 12/03/2008, 16h57

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