Checkbox Access : nom variable

Résolu
Bonjour,

j'ai un formulaire avec 26 checkbox que j'ai nommés, je voudrais que lorsqu'ils sont cochés une action soit effectuée (cette action dépend du checkbox coché).
seulement je ne veut pas écrire 26 fois la même commande
j'ai donc écrit
for i=1 to 26
if i=1 then checkboxname ="appel"
....

et je voudrais maintenant dire
if checkboxname.value= true then

j'ai essayé d'écrire " & checkboxname & ".value
mais ca ne marche pas
est ce que quelqu'un aurait une idée?

Merci

8 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour,

    Est ce que pourrais mettre ton code en entier stp, histoire de comprendre dans son ensemble ton code relatif aux CHB!

    Sinon au lieu de faire un énorme IF imbriqué d'autres if, perso je préfère utiliser un SELECT CASE, le code est de ce fait plus clair je trouve :)

    Exemple :
    Private Sub CHB_blabla_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CH_blabla.CheckedChanged 
            If Me.CHB_blabla.Checked = True Then
                Me.CB_blabla.Text = ""
                Me.CB_blabla.Items.Clear()
                Me.CB_blabla.Items.Add("Bonjour")
                etc
                etc
                choixCheckbox =Blabla
            End If
        End Sub
    


    Ici cette procédure est lancée si tu sélectionnes la CHB Blabla.
    Ma combobox est remise à zéro, puis j'y ajoute les éléments correspondants à la CHB blabla. Enfin je donne une valeur à choixCheckBox, valeur qui est une constante.
    (Public const Blabla = 0)

    Ensuite dans un autre événement (par exemple lorsque l'on clique sur un bouton confirmant le choix) je recherche la CHB cochée avec un select case :

    SELECT CASE choixCheckBox
    case Blabla
             ton action
    case etc
    
    END SELECT
    


    Perso je préfère coder de manière séquentielle avec un SELECT plutôt qu'avec un IF ^^.
    Après chacun ses goûts!!

    (Bon moi je code en vb.net mais cela ressemble sur quelques points quand même au VBA sur Access :) )
    1. Voilà mon code (en partie), le but final est de copier une table (tablsource) dans une autre (tabldest) si la case correspondante à la table est cochée

      For i = 1 To 26
      If i = 1 Then
      coche = "defin"
      tablsource = "defprojet"
      tabldest = "tbl_surf"
      ElseIf i = 2 Then
      coche = "progeng"
      tablsource = "EngProgress"
      tabldest = "TblProgEng"
      ....
      If coche.Value = True Then
      'on vérifie que la table destinataire ne contient pas déjà des données du projet
      Set tdest = pb.OpenRecordset("" & tabldest & "", dbOpenTable)

      tdest.MoveFirst
      nproj = tdest.RecordCount
      For j = 1 To nproj
      If tdest("Activity_number_surf") <> proj Then
      tdest.MoveNext
      Else
      'on supprime la ligne
      record.Delete
      tdest.MoveNext
      End If
      Next j
      tdest.AddNew
      tdest.Fields(0) = proj
      DoCmd.OpenTable "" & tablsource & ""
      DoCmd.RunCommand acCmdSelectRecord
      DoCmd.RunCommand acCmdCopy
      DoCmd.OpenTable "" & tabldest & ""
      DoCmd.GoToRecord , , acNewRec
      DoCmd.RunCommand acCmdSelectRecord
      DoCmd.RunCommand acCmdPaste
      DoCmd.RunCommand acCmdSaveRecord
      DoCmd.Close acTable, "" & tabldest & ""
      End If
      Next i

      et donc c'est coche.value qui ne marche pas
      (d'ailleurs pour supprimer un record la commande record.delete ne marche pas, donc au passage si vous asavez aussi pour ca..)

      Merci
      1. Hum, essaye quelque chose comme ceci:

        IF coche.Length > 0 THEN 
         etc etc etc 
        END IF 
        


        Tu cherches enfait si coche a une valeur, c'est ça?
        Donc s'il a une valeur, et vu qu'il est de type string, c'est qu'il y a des caractères!
        D'où mon Length qui va compter le nombre de caractères ;)

        J'ai trouvé ça sinon pour ton delete...

        Dim Dbase As Database
        Dim mysql As QueryDef
        
        
        Set Dbase = CurrentDb()
        
        'Supprime les requêtes ce nommant Requête_Supp, c'est pour exécuter ce code a plusieur reprise.
        
        On Error Resume Next
        mydb.QueryDefs.Delete ("Requête_Supp")
        On Error GoTo 0
        
        Set mysql = Dbase.CreateQueryDef("Requête_Supp", "DELETE FROM [Nom_Table] WHERE [CONDITION] ;")
        DoCmd.OpenQuery "Requête_Supp"
        
        1. coche correspond au nom d'un checkbox (défini suivant les différents cas de i)
          je veux vérifier si la case est cochée
          1. Tu pourrais essayer quand meme avec un Select case, ca fait un code + propre et plus simple à comprendre je trouve... comme ci-dessous, après c'est mon avis perso:
            SELECT CASE i
            Case 1
            coche = "defin" 'Ici coche prend une valeur de type "texte"
            tablsource = "defprojet"
            tabldest = "tbl_surf"
            Case 2
            coche = "progeng"
            tablsource = "EngProgress"
            tabldest = "TblProgEng"
            ....
            END SELECT
            
            'A la fin du SELECT, si une CHB a été cochée, coche a forcément une valeur, et c'est du texte.
            
            If coche.Length > 0 Then 'Si coche contient + de 0 caractères, donc s'il contient quelquechose
            'on vérifie que la table destinataire ne contient pas déjà des données du projet
            Set tdest = pb.OpenRecordset("" & tabldest & "", dbOpenTable)
            
            tdest.MoveFirst
            nproj = tdest.RecordCount
            For j = 1 To nproj
            If tdest("Activity_number_surf") <> proj Then
            tdest.MoveNext
            Else
            'on supprime la ligne
            record.Delete
            tdest.MoveNext
            End If
            Next j
            tdest.AddNew
            tdest.Fields(0) = proj
            DoCmd.OpenTable "" & tablsource & ""
            DoCmd.RunCommand acCmdSelectRecord
            DoCmd.RunCommand acCmdCopy
            DoCmd.OpenTable "" & tabldest & ""
            DoCmd.GoToRecord , , acNewRec
            DoCmd.RunCommand acCmdSelectRecord
            DoCmd.RunCommand acCmdPaste
            DoCmd.RunCommand acCmdSaveRecord
            DoCmd.Close acTable, "" & tabldest & ""
            End If
            


            Par contre je ne comprend pas ton FOR i = 1 to 26 ...
            Car avec ça tu vas faire 26 boucles, obligatoirement.

            Cependant tu veux savoir qu'elle case est cochée... donc ce qui veut dire que tu veux faire la boucle qu'une seule fois...

            Explique moi stp
            1. c'est vrai que select serait moins lourd, je ferai le changement
              par contre, désolé mais en ce qui concerne la vérification du "cochage" de la case je ne comprend pas
              si i=1 je lui dit coche ="defin", que la case soit cochée ou non

              pour chaque cas de i (que je fais défiler de 1 à 26) je veux vérifier que la case est cochée, il faut bien que j'utilise .value, non?
              merci
              1. Et si dans chacun de tes cas i, tu vérifiais si la CHB est cochée?
                Du style :

                
                Dim caseCoche as integer = 0
                
                FOR i = 1 to 26
                SELECT CASE i
                Case 1
                coche = "defin"
                tablsource = "defprojet"
                tabldest = "tbl_surf"
                
                IF chechbox_1.checked = true then
                 caseCoche = 1
                END IF
                
                Case 2 
                coche = "progeng"
                tablsource = "EngProgress"
                tabldest = "TblProgEng"
                
                IF chechbox_2.checked = true then
                 caseCoche = 1
                END IF
                
                ...
                
                END SELECT
                

                Puis au lieu de ton coche.value :
                IF caseCoche <> 0 THEN 's'il est sup à 0, c'est qu'une case a été cochée
                 ton code
                ELSE : msgbox("Il n'y a aucune case de cochée!!")
                END IF
                
                NEXT i
                
                1. Oui merci je pense que je devrais y arriver en faisant comme ca.

                  Merci beaucoup pour cette aide
                  1. Et bien écoute, de rien ;)

                    C'est instructif pour moi aussi, car je ne connais pas le vba, je me suis donc un peu penchée sur ton code :)

                    En espérant que ça roule maintenant ton code,

                    Bonne programmation!!