Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/10/2011, 23h02   #1
 
Inscription : juillet 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 21
Points : -5
Points : -5
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 :
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
Sterne est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 31/10/2011, 23h51   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 905
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 905
Points : 7 199
Points : 7 199
Bonjour

Pour te donner un idée de l’instanciation d'une variable control
Code :
1
2
3
4
5
Dim Ctl As Control
 
Set Ctl = Me.ActiveControl
 
Msgbox Ctl.Name
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 00h34   #3
 
Inscription : juillet 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 21
Points : -5
Points : -5
Merci beaucoup.

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

Code :
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 :
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 ?
Sterne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 09h19   #4
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 905
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 905
Points : 7 199
Points : 7 199
Une fonction sert a retourner une information. La tienne ne retourne rien. Remplaces la par une procédure

Code :
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
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 15h22   #5
 
Inscription : juillet 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 21
Points : -5
Points : -5
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 :
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
Sterne est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 04/11/2011, 15h37   #6
Membre Expert
 
Avatar de Jean-Pierre49
 
Homme J-Pierre Catherine
Conception Calcul
Inscription : juillet 2007
Messages : 659
Détails du profil
Informations personnelles :
Nom : Homme J-Pierre Catherine
Âge : 57
Localisation : France, Maine et Loire (Pays de la Loire)

Informations professionnelles :
Activité : Conception Calcul
Secteur : Industrie

Informations forums :
Inscription : juillet 2007
Messages : 659
Points : 1 856
Points : 1 856
Bonjour,
et bonjour Jérôme,

Si tu es dans un USF

Essaie
Code :
1
2
3
4
5
 
a="Label"
b="14"
 
Me.Controls(a & b).Caption="Ok"
Tu dis

Bon courage
__________________
Jean-Pierre Pensez à Voter pour les réponses qui vous ont aidés, d'avance merci
---------Et n'oubliez pas de mettre : ..quand c'est le cas !---------
Jean-Pierre49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 19h56   #7
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
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
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2011, 06h38   #8
 
Inscription : juillet 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 21
Points : -5
Points : -5
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 :
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 :
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.
Sterne est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 07/11/2011, 08h07   #9
Expert Confirmé
 
Homme Philippe
ex Observeur CGG / Analyste prog.
Inscription : juin 2006
Messages : 1 710
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Localisation : France, Finistère (Bretagne)

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

Informations forums :
Inscription : juin 2006
Messages : 1 710
Points : 3 640
Points : 3 640
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 :
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 :
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 :
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
__________________
Pensez à Voter, d'avance merci. ( Pouces en bas à la droite de Citer )
Balisez votre code après l'avoir indenté sous Excel via Smart Indenter
Autre utilitaire : MZ Tools 3.0 VBA

Contribution : Excel / Word / PDF avec Adobe Acrobat Pro / PDFCreator 1 2
kiki29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 08h54   #10
 
Inscription : juillet 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 21
Points : -5
Points : -5
Pour une userform, cest le code :

Code :
1
2
3
a="CheckBox"
b="14"
Me.Controls(a & b).Value="Ok"
mais si mes checkbox sont sur une feuille ?
Sterne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 13h10   #11
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut
Essai comme ceci

Code :
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
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 10h07   #12
 
Inscription : juillet 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 21
Points : -5
Points : -5
C'est exactement ce que je cherchais.

Je pense qu'on peux améliorer le code, mais tout fonctionne.

Code :
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é.
Sterne est déconnecté   Envoyer un message privé Réponse avec citation 01
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h29.


 
 
 
 
Partenaires

Hébergement Web