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

VBA Access Discussion :

Création dynamique de contrôles


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 49
    Points : 30
    Points
    30
    Par défaut Création dynamique de contrôles
    Bonsoir,

    J'essaie de créer un controle de façon dynamique c'est à dire aprés "click" d'un bouton sur un formulaire.

    Le code que j'utilise est le suivant :
    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
     
    Dim Top, Left, Width, Height, i As Integer 
    Dim NumeroTextBox As Integer 
    Dim TextBoxName As String 
     
    Top = 150 
    Left = 150 
    Width = 2000 
    Height = 275 
    NumeroTextBox = 1 
     
    For i = 0 To 4 - 1 
     
    TextBoxName = "NomdelaTextBox" & NumeroTextBox 
    Set TextBox = Controls.Add("VB.textbox", "" & TextBoxName & "", Me.Name) 
    With TextBox 
    .Visible = True 
    .Top = Top 'Definit la distance entre le bord de la fenetre et le bord du conteneur 
    .Left = Left 'Definit la distance entre le bord gauche de la fenetre et le bord du conteneur 
    .Width = Width 'Definit la largeur de l'objet 
    .Height = Height 'Definit la hauteur de l'objet 
    .Font.Size = 8 ématiqu
    End With 
     
    Top = Top + 500 
    NumeroTextBox = NumeroTextBox + 1 
     
    Next
    Aprés avoir cherché sur différent forums j'ai lié FM20.dll

    Malgré cela j'ai une erreur de compil sur Controls.Add.
    J'utilise Access 2003

    Je ne sais plus comment faire pour résoudre ce pb.

    Quelqu'un peut il me donner un coup de main ?

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 640
    Points : 34 350
    Points
    34 350
    Par défaut
    salut,
    on ne peut pas faire comme avec les objets TableDef ou Field ?
    du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim a as Control
    a.Top = top
    .
    .
    .
    Forms("").Controls.Append a
    ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 49
    Points : 30
    Points
    30
    Par défaut
    Non il n'y a que Controls.Count, ou .Remove en standard mais non souci, je pense, c'est qu'il me manque une référence pour faire reconnaitre Controls.Add.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 047
    Points : 1 042
    Points
    1 042
    Par défaut
    bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                  Dim ctlCréé As Control
                   Set ctlCréé = CreateControl(Nom, acTextBox, , , "numServiceGMAO", 0, 0, 200)
    cela fonctionne.

    Bonne soirée

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juin 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 49
    Points : 30
    Points
    30
    Par défaut
    Merci des réponses, je teste et vous tiens au courant

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juin 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 49
    Points : 30
    Points
    30
    Par défaut
    Je viens de tester, CreateControl ne marche qu'en mode Creation.

    Mon pb reste entier.

  8. #8
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    On ne peut créer de contrôles qu'en mode création
    mais il est possible de créer d'avance des objets non visibles rendus visibles au besoin après avoir modifié quelques propriétés

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Citation Envoyé par Jertho Voir le message
    Je viens de tester, CreateControl ne marche qu'en mode Creation.

    Mon pb reste entier.
    Tout à fait, tu ne peux donc lancer ton code de ton formulaire, il faut le faire d'un autre.

    Petite remarque, si ta base doit être transformée en fichier .mde, la création dynamique de contrôle ne fonctionnera pas.

    Philippe

  10. #10
    Nouveau membre du Club
    Inscrit en
    Juin 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 49
    Points : 30
    Points
    30
    Par défaut
    La "petite remarque" est d'une grande importance pour moi car en effet ma base sera transformée en .mde.
    Donc j'en conclue que dans mon cas il n'est pas possible d'obtenir ce dont j'ai besoin.
    Je suis donc désormais à la recherche d'autres alternatives

    Merci beaucoup à tous.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    bonjour à tous !

    Moi aussi j'ai un problème pour la création dynamique de contrôles.
    En fait je veux créer des textbox et des checkbox. jusque là ça va et ça fonctionne. Seulement, lorsque que je les créé, je veux également leurs attibuer une valeur avec .value.
    Etant en mode création, il me fait une erreur car "cette propriété n'est pas dispo en mode création", alors entre temps je repasse en mode normal, et là il me dit : "Erreur d'éxecution '2467' Erreur défenie par l'application ou par l'objet"

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Set ctl = CreateControl(frm.Name, acTextBox, acDetail)
    With ctl
        .Top = (haut + (cptLigne * (hauteur + ecart)))
        .Left = (gauche + cpt * (largeur + ecart))
        .Height = hauteur
        .Width = largeur
        DoCmd.OpenForm "MonFormulaire"
        .value = ValeurQuiVientDUneTable
        DoCmd.OpenForm "MonFormulaire", acDesign
    End With
    Si quelqu'un pouvais avoir une solution, ou juste une idée de solution ça m'arrangerais bien

  12. #12
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 183
    Points : 1 362
    Points
    1 362
    Par défaut
    Une fois les contrôles créés, il faut fermer le formulaire (en sauvant), puis l'ouvrir normalement pour pouvoir affecter des valeurs aux contrôles.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    j'ai ajouter dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DoCmd.Close acForm, "Monformulaire", acSaveYes
    DoCmd.OpenForm "Monformulaire", acNormal
    .value = MaValeur
    DoCmd.OpenForm "Monformulaire", acDesign
    Et ça ne fonctionne toujours pas...
    Mais est ce qu'il faut d'abord créer tous les controls, puis leur affecter une valeur, ou est ce qu'il y a moyen lors de la création de lui affecter une valeur?

  14. #14
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 183
    Points : 1 362
    Points
    1 362
    Par défaut
    Faut créer tous les contrôles, sauver le formulaire, l'ouvrir et là, tu peux affecter une valeur aux contrôles avec un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Formulaire.control("NomDuControle").value = "La valeur"

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    D'accord !
    Merci pour cette réponse rapide
    Mais bon si ça continu je ne vais pas pourvoir faire ce que je souhaite car là j'ai une "erreur" je crée trop de contrôles à prioris.. il ne veut pas plus de 800

  16. #16
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 640
    Points : 34 350
    Points
    34 350
    Par défaut
    es-tu sûr que ton approche est la bonne dans ce cas là ?
    l'utilisation d'un contrôle dans la zone détail du formulaire ne serait-elle pas suffisante ?

  17. #17
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 183
    Points : 1 362
    Points
    1 362
    Par défaut
    800 contrôles ?!
    A mon avis, y'a un problème de conception.
    Tu veux faire quoi exactement ?

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    En fait je crée une sorte de "tableau" ... car le but est de réaliser un tableau de bord
    Je met en acLabel les titres des "colonnes"
    Puis les différentes zone de texte ou une checkbox ("ça fait plus joli que "oui/non") dans les "cellules".
    Le nombre de colomnes est variable, de même que le monbre de lignes.... donc je ne vois pas comment faire pour crée cela avec avec juste un control..
    De plus dans l'avenir je voudrais que l'on puisse cliquer sur une ligne par exemple pour traiter des info derière, enfin je ne rentre pas dans les détails...
    Enfin bref je crois que je vais devoir réfléchir à autre autre chose...

  19. #19
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 183
    Points : 1 362
    Points
    1 362
    Par défaut
    Ok.
    J'ai fait un truc a peu près identique (et j'en ai un peu ch...) mais le rendu est pas mal.
    1/ il faut créer tes contrôles dans un formulaire, autant de contrôles que de colonnes.
    2/ ouvrir le formulaire en mode liste.

    Un bout du 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
    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
     
        SuppressionForm "Grille"
        DoCmd.CopyObject , "Grille", acForm, "FrmA"
        DoCmd.OpenForm "Grille", acDesign, , , , acHidden
    ...
    ' iRst est le recordset qui renvoie les données à afficher.
    ' La partie droite des noms des champs du recordset indique le format du champ et s'il faut l'afficher ou nom.
    Set mdl = Forms("Grille").Module
            For Each Fl In iRst.Fields
                'Créer le contrôle k
                If InStr(iRst.Fields(k).Name, "INVISIBLE") <> 0 Or right(iRst.Fields(k).Name, 4) = "DATE" Then
                    iInt_Code = iInt_Code + 1
                    ReDim Preserve iStr_Code(iInt_Code)
                    iStr_Code(iInt_Code) = "redim preserve iStr_Param(iInt_Param) : iStr_Param(iInt_Param) = """ & iRst.Fields(k).Name & "$"" & Me![" & iRst.Fields(k).Name & "].Value : iInt_Param = iInt_Param + 1"
                End If
                If InStr(iRst.Fields(k).Name, "INVISIBLE") = 0 Then
                    Set Controle = CreateControl("Grille", acTextBox)
                    With Controle
                        If right(iRst.Fields(k).Name, 3) = "REF" Then
                            .Name = Left(iRst.Fields(k).Name, Len(iRst.Fields(k).Name) - 3)
                            .Tag = "REF" '
                        ElseIf right(iRst.Fields(k).Name, 4) = "DATE" Then
                            .Name = Left(iRst.Fields(k).Name, Len(iRst.Fields(k).Name) - 4)
                            .Tag = "DATE"
                        Else
                            .Name = iRst.Fields(k).Name
                        End If
                        .Left = 1200
                        .Top = 100 + j
                        .ControlSource = iRst.Fields(k).Name
                        iStr_NomChamp = Controle.Name
                    End With
                End If
                If InStr(iRst.Fields(k).Name, "POURCENTAGE") > 0 Then
                    With Controle
                        .Format = "0%"
                        .DecimalPlaces = 2
                        .Name = Left(iRst.Fields(k).Name, Len(iRst.Fields(k).Name) - 11)
                        iStr_NomChamp = Controle.Name
                    End With
                ElseIf InStr(iRst.Fields(k).Name, "NOMBRE") > 0 Then
                    With Controle
                        .Format = "0"
                        .DecimalPlaces = 2
                        .Name = Left(iRst.Fields(k).Name, Len(iRst.Fields(k).Name) - 6)
                        iStr_NomChamp = Controle.Name
                    End With
                End If
                If InStr(iRst.Fields(k).Name, "INVISIBLE") = 0 And right(iRst.Fields(k).Name, 3) <> "REF" And right(iRst.Fields(k).Name, 4) <> "DATE" Then
                    iStr = iStr_NomChamp
                    iStr_NomChamp = Replace(iStr_NomChamp, " ", "_")
                    iStr_NomChamp = Replace(iStr_NomChamp, "-", "_")
                    iStr_NomChamp = Replace(iStr_NomChamp, "<", "Ctl_")
                    iStr_NomChamp = Replace(iStr_NomChamp, ">", "Ctl_")
                    iStr_NomChamp = Replace(iStr_NomChamp, "%", "Ctl_")
                    If Left(iStr_NomChamp, 1) >= "0" And Left(iStr_NomChamp, 1) <= "9" Then
                        iStr_NomChamp = "ctl" & iStr_NomChamp
                    End If
                    'MsgBox iStr & " => " & iStr_NomChamp
                    iLng_Retour = mdl.CreateEventProc("DblClick", Replace(iStr_NomChamp, " ", "_"))
                    iLng_Retour = iLng_Retour + 1: mdl.InsertLines iLng_Retour, "Dim ctl As Control"
                    iLng_Retour = iLng_Retour + 1: mdl.InsertLines iLng_Retour, "Dim iStr_Param() As string"
                    iLng_Retour = iLng_Retour + 1: mdl.InsertLines iLng_Retour, "Dim iInt_Param As integer"
                    iLng_Retour = iLng_Retour + 1: mdl.InsertLines iLng_Retour, vbTab & "redim preserve iStr_Param(iInt_Param) : iStr_Param(iInt_Param) = ""TypeDate$" & lstChoixDate.Value & """ : iInt_Param = iInt_Param + 1"
                    iLng_Retour = iLng_Retour + 1: mdl.InsertLines iLng_Retour, vbTab & "redim preserve iStr_Param(iInt_Param) : iStr_Param(iInt_Param) = ""Valeur$"" & Me![" & iStr & "].Value : iInt_Param = iInt_Param + 1"
                    If iInt_Code > -1 Then
                        For iInt_Code = 0 To UBound(iStr_Code)
                            iLng_Retour = iLng_Retour + 1: mdl.InsertLines iLng_Retour, vbTab & iStr_Code(iInt_Code)
                        Next
                    End If
                    iLng_Retour = iLng_Retour + 1: mdl.InsertLines iLng_Retour, vbTab & "redim preserve iStr_Param(iInt_Param) : iStr_Param(iInt_Param) = ""KPI$" & iRst.Fields(k).Name & """ : iInt_Param = iInt_Param + 1"
                    iLng_Retour = iLng_Retour + 1: mdl.InsertLines iLng_Retour, vbTab & "gStr_NomFormAppelant = cStr_NomFormClose"
                    iLng_Retour = iLng_Retour + 1: mdl.InsertLines iLng_Retour, vbTab & "OuvertureDetailDossier iStr_Param"
                End If
                j = j + 320
                k = k + 1
            Next
     
            Set Formul = Forms.item("Grille")
            Formul.RecordSource = "tblCCMResultat"
            DoCmd.Close acForm, "Grille", acSaveYes
            Application.Echo True
            DoCmd.OpenForm "Resultat"
            Set Formul = Forms.item("Resultat")
            Formul.Caption = lStr_Titre
            Formul.Controls("etiTitre").Caption = lStr_Titre
    Accessoirement, je crée dynamiquement le code pour le double-click, afin de pouvoir ensuite ouvrir un autre formulaire dépendant du contrôle sur lequel on a double-cliqué.

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Et bien merci de ton aide.
    je vais voir un peu ton code et je vais tenter de comprendre ce que tu y fais (je devrais m'en sortir quand même lol )
    Merci encore, et si j'ai une question je sais où poster

Discussions similaires

  1. Création dynamique de contrôle
    Par makhchoune dans le forum VBA Access
    Réponses: 1
    Dernier message: 15/11/2010, 10h20
  2. Création dynamique de contrôles avec événements différents
    Par SphereDuNeant dans le forum Windows Forms
    Réponses: 1
    Dernier message: 26/10/2009, 21h28
  3. Création dynamique de contrôle Treeview
    Par supernova dans le forum Access
    Réponses: 1
    Dernier message: 06/06/2006, 13h25
  4. Erreur création dynamique de contrôle
    Par thierrybatlle dans le forum Access
    Réponses: 1
    Dernier message: 10/02/2006, 11h00
  5. Création dynamique de contrôles
    Par qi130 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 17/12/2004, 13h19

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