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 :

Convertir une chaine en nom d'objet


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 2
    Points
    2
    Par défaut Convertir une chaine en nom d'objet
    Bonjour à tous,

    Dans mon exemple, Je n'arrive pas à convertir TextBoxN en nom d'objet.
    (Je débute en VBA)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub TextBox10_Change()
    TextBoxN = Me.ActiveControl.Name
    ...
    ...
    TextBoxN.Value = 0
    End Sub
    Si je fais une MsgBox (TextBoxN), j'ai bien le message "TextBox10".
    Quelqu'un peut-il m'aider ?

    Cordialement

  2. #2
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour

    Pour te donner un idée de l’instanciation d'une variable control
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Ctl As Control
     
    Set Ctl = Me.ActiveControl
     
    Msgbox Ctl.Name

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup.

    J'ai maintenant un message d'erreur quand j'execute la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function TextBoxChange(CTL1 As Control)
     Select Case CTL1.Value
         Case ""
            CTL1.Value = 0
         Case 0 To 99
            Calcule_Tout
         Case Else
            CTL1.Value = 0
            MsgBox ("Caractère interdit !")
     End Select
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub TextBox10_Change()
      Dim CTL As Control
      Set CTL = Me.ActiveControl
      TextBoxChange (CTL)   'j'ai le message 424 objet requis
    End Sub
    Je ne peux pas vérifier la valeur de CTL dans une fonction ?

  4. #4
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Une fonction sert a retourner une information. La tienne ne retourne rien. Remplaces la par une procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub TextBoxChange(CTL1 As Control)
     Select Case CTL1.Value
         Case ""
            CTL1.Value = 0
         Case 0 To 99
            Calcule_Tout
         Case Else
            CTL1.Value = 0
            MsgBox ("Caractère interdit !")
     End Select
    End Sub
    Et l'appeler comme cela

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 2
    Points
    2
    Par défaut
    Merci, ça fonctionne très bien, mais ce que je n'arrive toujours pas à trouver, c'est comment transformer une chaine de caractères en nom d'objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    a="Label"
    b="14"
    c= a & b 
     
    C.Caption="Ok"
    J'ai une erreur d'execution 404 (objet requis)

    Cordialement

  6. #6
    Membre chevronné Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Points : 2 056
    Points
    2 056
    Par défaut
    Bonjour,
    et bonjour Jérôme,

    Si tu es dans un USF

    Essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    a="Label"
    b="14"
     
    Me.Controls(a & b).Caption="Ok"
    Tu dis

    Bon courage

  7. #7
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut

    Le mieux serait sans doute de nous dire ce que tu souhaites faire exactement avec ce style d’écriture, il existe peut être une façon plus approprié de faire ce que tu veux.

    Tu ne peux pas utiliser une variable chaîne (String) et l'utiliser comme un Label qui lui est un Objet. Dis toi que que ton Label quand tu fais appelle à lui en disant

    imagine que VBA il va chercher l'objet Label14 dans un coin de la mémoire de ton PC et qu'il modifie sa propriété Caption.

    Si maintenant tu fais pareil avec une variable de type chaîne, peut importe ce que tu mettras à l’intérieur de ta variable, VBA n'ira jamais voir dans le recoin de mémoire qui contient le Label14, il n'y a aucun lien entre les 2.

    Le type String contient du texte c'est tout.

    [Edit]
    Une comparaison plus concrété:
    Un cahier te sert à noter du texte à l’intérieur (c'est ta variable string)
    Une chaise te sert à t’asseoir (le Label 14)

    Si tu écrit le mot chaise dans ton cahier, ton cahier n'en devient pas pour autant une chaise et il n'aura pas la méthode "s'asseoir".

    Ici ta chaîne de caractère n'aura jamais de méthode "Caption"
    [/Edit]

    Tu devrais lire quelques tutoriels sur la déclaration de variables et leur affectation. Regarde de ce coté la.

    ++
    Qwaz

  8. #8
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 2
    Points
    2
    Par défaut
    En fait, j'ai plusieurs texbox dans mon userform et je souhaitais executer la même procédure pour tous dans un evenement "change". Ca fonctionne très bien avec les conseils que vous m'avez donnés.
    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
    Sub TextBox14Change(TextBox14Num As Control)
       If ChangementManuel = False Then
          XLabel14 = "Label14_" & Right(ActiveControl.Name, 1)
          Select Case TextBox14Num.Value
             Case 0
                Me.Controls(XLabel14).Caption = "0 €"
             Case 1 To 4
                Me.Controls(XLabel14).Caption = "5 €"
             Case 5 To 12
                Me.Controls(XLabel14).Caption = TextBox14Num.Value & " €"
             Case 13 To 99
                TextBox14Num.Value = 0
                Me.Controls(XLabel14).Caption = "0 €"
                MsgBox ("Interdit aux plus de 13 ans")
             Case Else
                TextBox14Num.Value = 0
                Me.Controls(XLabel14).Caption = "0 €"
                MsgBox ("Caractère interdit !")
          End Select
          End If
       Calcule_Tout
    End Sub
    Par contre, j'ai placé 15 checkbox sur ma feuille et utilisé la procédure que vous m'aviez conseillée plus haut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub CheckBox_2012_1_Click()
       Dim Ctl As Control
       Set Ctl = Me.ActiveControl
       MsgBox Ctl.Name
    End Sub
    J'ai un message d'erreur (membre de méthode ou de données introuvable)
    Ca fonctionne pourtant très bien dans un userform.

  9. #9
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, bref la seule solution qui tienne la route est de passer par un module de classe
    http://www.developpez.net/forums/d94...gerer-textbox/
    http://fauconnier.developpez.com/art...neral/classes/
    http://excel.developpez.com/faq/?page=ModuleClasse
    http://www.developpez.net/forums/d87...module-classe/

    Une recherche sur ce site http://www.google.fr/#sclient=psy-ab...w=1021&bih=717

    Un exemple à adapter
    Créer un userform usfTextBoxes
    mettre le code suivant dans le module de cette userform

    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
     
    Option Explicit
     
    Dim TB() As New clsTBox
    Dim CB() As New clsCmdB
     
    Private Sub UserForm_Initialize()
    Dim TxtB As MSForms.TextBox
    Dim cmdB As MSForms.CommandButton
    Dim i As Integer, iLeft As Integer, iTop As Integer
     
        iLeft = 10: iTop = 10
        For i = 1 To 12
            Set TxtB = Me.Controls.Add("Forms.Textbox.1", , True)
            With TxtB
                .Width = 150
                .Height = 20
                .Left = iLeft
                .Top = iTop
                .BorderStyle = fmBorderStyleSingle
                .SpecialEffect = fmSpecialEffectFlat
     
                Select Case i
                    Case 1, 5
                        .BackColor = &HC0E0FF
                    Case Else
                        .BackColor = &HC0FFFF
                End Select
     
                .Tag = i
            End With
     
            iTop = iTop + 25
     
            ReDim Preserve TB(1 To i)
            Set TB(i).GroupeTxtB = TxtB
        Next i
     
        ReDim Preserve CB(1 To i)
        Set cmdB = Me.Controls.Add("Forms.CommandButton.1", , True)
        With cmdB
            .Caption = "Ok"
            .Width = usfTextBoxes.Width \ 4
            .Height = 20
            .Left = usfTextBoxes.Width \ 4 + .Width \ 2
            .Top = iTop + 10
        End With
     
        Set CB(1).cmdB = cmdB
    End Sub
    Dasn un module de classe clsTBox

    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
     
    Option Explicit
     
    Public WithEvents GroupeTxtB As MSForms.TextBox
     
    Const entrees_decimales_permises = ".,0123456789" & vbCr & vbBack
    Const entrees_alpha_permises = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" & vbCr & vbBack
    Const Point = "."
    Const Virgule = ","
     
    Private Sub GroupeTxtB_Change()
    Dim i As Integer
        i = GroupeTxtB.Tag
        Select Case i
            Case 1, 5
                ShTest.Range("A" & i) = GroupeTxtB.Text
            Case Else
                On Error Resume Next
                ShTest.Range("A" & i) = CDbl(GroupeTxtB.Text)
                Err.Clear
        End Select
    End Sub
     
    Private Sub GroupeTxtB_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        Select Case GroupeTxtB.Tag
            Case 1, 5
                If InStr(entrees_alpha_permises, Chr(KeyAscii)) = 0 Then KeyAscii = 0
            Case Else
                If KeyAscii = Asc(Point) Then
                    If InStr(GroupeTxtB.Text, Virgule) = 0 Then
                        KeyAscii = Asc(Virgule)
                    Else
                        KeyAscii = 0
                    End If
                ElseIf InStr(entrees_decimales_permises, Chr(KeyAscii)) = 0 Then
                    KeyAscii = 0
                ElseIf InStr(GroupeTxtB.Text, Virgule) > 0 And KeyAscii = Asc(Virgule) Then
                    KeyAscii = 0
                End If
        End Select
    End Sub
    Dans un module de classe clsCmdB
    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
     
    '----------------------------------------------------------------
    '
    '   Référence à cocher : Microsoft Forms 2.0 Object Library
    '   sinon parcourir et sélectionner c:\windows\system32\FM20.dll
    '
    '----------------------------------------------------------------
     
    Option Explicit
     
    Public WithEvents cmdB As MSForms.CommandButton
     
    Private Sub cmdB_Click()
        Unload usfTextBoxes
    End Sub

  10. #10
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 2
    Points
    2
    Par défaut
    Pour une userform, cest le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a="CheckBox"
    b="14"
    Me.Controls(a & b).Value="Ok"
    mais si mes checkbox sont sur une feuille ?

  11. #11
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Essai comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test()
    Dim objCase As OLEObject
     
    'On pointe la case à cocher, Tu remplaceras NomCaseACocher par le texte a+b des exemples précédents
    Set objCase = ThisWorkbook.Sheets("Feuil1").OLEObjects("NomCaseACocher")
     
    'On coche la case
    objCase.Object.Value = True
     
    End Sub
    ++
    Qwaz

  12. #12
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 2
    Points
    2
    Par défaut
    C'est exactement ce que je cherchais.

    Je pense qu'on peux améliorer le code, mais tout 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Sub Checkbox_Semestre_clic(Vtrimestre As String)
       Dim objCase As OLEObject
       Set objCase = ThisWorkbook.Sheets("Accueil").OLEObjects("CheckBox_" & Vtrimestre)
       XFeuille = Left(Vtrimestre, 4) & "-" & Right(Vtrimestre, 1)
       If objCase.Object.Value = True Then
          If IsError(Evaluate("='" & XFeuille & "'!A1")) Then         CreeNouvelleFeuille (XFeuille)
          End If
          Worksheets(XFeuille).Visible = 1
          Else
          Worksheets(XFeuille).Visible = 0
       End If
    End Sub
     
    Private Sub CheckBox_2011_1_Click()
      Checkbox_Semestre_clic ("2011_1")
    End Sub
    Private Sub CheckBox_2011_2_Click()
      Checkbox_Semestre_clic ("2011_2")
    End Sub
    Private Sub CheckBox_2012_1_Click()
      Checkbox_Semestre_clic ("2012_1")
    End Sub
    Private Sub CheckBox_2012_2_Click()
      Checkbox_Semestre_clic ("2012_2")
    End Sub
    ...
    ...
    Private Sub CheckBox_2025_1_Click()
      Checkbox_Semestre_clic ("2025_1")
    End Sub
    Private Sub CheckBox_2025_2_Click()
      Checkbox_Semestre_clic ("2025_2")
    End Sub
    Private Sub CheckBox_2026_1_Click()
      Checkbox_Semestre_clic ("2026_1")
    End Sub
    Private Sub CheckBox_2026_2_Click()
      Checkbox_Semestre_clic ("2026_2")
    End Sub

    Merci à tous de m'avoir aidé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [11g] Convertir une chaine en nom de colonne
    Par breizou dans le forum SQL
    Réponses: 6
    Dernier message: 09/09/2013, 11h35
  2. Convertir une chaine de caractère en nom de controle
    Par craesys dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/08/2008, 18h57
  3. Réponses: 6
    Dernier message: 14/06/2006, 15h27
  4. Convertir une chaine en format heure
    Par Lars dans le forum ASP
    Réponses: 3
    Dernier message: 24/05/2005, 11h44
  5. Convertir une chaine UTF8 en ISO-8859-1
    Par eods dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 26/08/2004, 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