Programmation VBA

Résolu
cs_pierreroux Messages postés 12 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 12 juin 2006 - 1 juin 2006 à 10:38
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 - 13 juin 2006 à 08:56
Bonjour,

Je suis quasiment débutant sur Visual Basic Application Excel . Je suis en train d'essayer de faire des interfaces conviviales et claires pour le futur utilisateur du programme et j'aimerais, dans la mesure du possible, avoir des précisions et des éclaircissements sur plusieurs points:
1) Pour rentrer les éléments dans une zone de liste déroulante placée sur l'interface Userform (bouton issu de la boîte à outil), que faut-il faire? J'essaie de remplir des mots à la ligne Value dans la colonne appellée Propriétés-UserForm 1 mais cela ne marche pas? Que dois je faire?
2) Quelle est la fonction à utiliser pour associer à un bouton sous excel une macro qui permette de faire apparaître  une interface réalisée sous VBA au moment de la pression sur ce bouton?
3)Quelle est le langage utilisé pour faire apparaitre un curseur clignotant dans une case où l'on veut que l'utilisateur aille obligatoirement après avoir sélectionné un bouton précédent qui le lie obligatoirement avec cette case.
4) Enfin comment peut-on faire pour trouver des fonctions utiles sous VBA et comprendre à quoi elles servent?

En attendant vos réponses, je vous remercie pour l'attention portée à mes interrogations

Bonne journée, pierreroux

22 réponses

jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
1 juin 2006 à 10:55
Salut,

Ah ca fait plaisir de voir un problème clair et bien expliqué

Alors répondons par points:
attention je n'ai renommer aucun des controles
1) Pour rentrer des éléments dans une zone de liste déroulante, utilises la procédure AddItem

l'Exemple suivant ajoutera 5 Ligne lors de l'activation du UserForm

Private Sub UserForm_Activate() 
Dim i As Integer 
Call ComboBox1.Clear  'Efface toutes les eventuelles lignes déja présente
For i = 1 To 5 
    Call ComboBox1.AddItem("Ligne " & i)  'Ajoute la ligne dans la zone de liste
Next 
End Sub 
 

<small> Coloration syntaxique automatique [AFCK]</small>
       

Ensuite.

2) Une fois le bouton inséré dans la feuille excel (je suppose que tu sais le faire), tu doubleclick sur le bouton ajouté et tu place ce code.

Private Sub CommandButton1_Click() 
Call Load(UserForm1) 
Call UserForm1.Show(vbModal) 
End Sub 
 

<small> Coloration syntaxique automatique [AFCK]</small>
       
3) Pas trop compris ce que tu souhaitais donne un exemple STP.

4) Lorsque tu es dans l'interface de développement, appuie sur F2 pour faire apparaître l'explorateur d'objets, il te montre tout ce que tu peux faire. si tu ne trouve pas ton bonheur il faut demander ce que tu souhaites faire et tu truveras qq un qui te diras la fonction à utilise

J'espère que mes exemples sont clairs. SInon n'hésites pas.

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
3
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
9 juin 2006 à 15:23
Salut,

Tu ne peux avoir Qu'un seul événement UserForm_Activate()

Si tu veux remplir deux comboBox lorsque ton Form s'active il suffit d'ajout dans le même événement les ajouts de ligne dans l'autre combo.

Soit dit en passant tes boucles For n'ont pas grand interêt (pour ne pas dire aucun)

Essaie la chose suivante.

Private Sub UserForm_Activate() 
    'Traitement de la premiere zone de liste
    Call ComboBox1.Clear   'Efface toutes les eventuelles lignes déja présente

    Call ComboBox1.AddItem("15%")    'Ajoute la ligne dans la zone de liste
    Call ComboBox1.AddItem("20%")   'Ajoute la ligne dans la zone de liste
    Call ComboBox1.AddItem("25%")   'Ajoute la ligne dans la zone de liste
    Call ComboBox1.AddItem("30%")   'Ajoute la ligne dans la zone de liste
    Call ComboBox1.AddItem("35%")    'Ajoute la ligne dans la zone de liste
    Call ComboBox1.AddItem("40%")   'Ajoute la ligne dans la zone de liste
    Call ComboBox1.AddItem("45%")   'Ajoute la ligne dans la zone de liste
    Call ComboBox1.AddItem("50%")   'Ajoute la ligne dans la zone de liste

    'Traitement de la Seconde zone de liste
    Call ComboBox2.Clear   'Efface toutes les eventuelles lignes déja présente

    Call ComboBox2.AddItem("55%")   'Ajoute la ligne dans la zone de liste
    Call ComboBox2.AddItem("60%")   'Ajoute la ligne dans la zone de liste
    Call ComboBox2.AddItem("65%")   'Ajoute la ligne dans la zone de liste
    Call ComboBox2.AddItem("70%")   'Ajoute la ligne dans la zone de liste
    Call ComboBox2.AddItem("75%")   'Ajoute la ligne dans la zone de liste

End Sub 

 

<small> Coloration syntaxique automatique [AFCK]</small>
       

Si tu veux absolument utilser des boucle fait la chose suivante (exemple juste pour la combo1)

Private Sub UserForm_Activate() 
 Dim i As Integer 
    'Traitement de la premiere zone de liste
    Call ComboBox1.Clear   'Efface toutes les eventuelles lignes déja présente

    For i = 0 To 7 
        Call ComboBox1.AddItem(CStr(15 + (5 * i)) & "%")  'Ajoute la ligne dans la zone de liste
    Next 

    'Traitement de la Seconde zone de liste
    Call ComboBox2.Clear   'Efface toutes les eventuelles lignes déja présente

    Call ComboBox2.AddItem("55%")   'Ajoute la ligne dans la zone de liste
    Call ComboBox2.AddItem("60%")   'Ajoute la ligne dans la zone de liste
    Call ComboBox2.AddItem("65%")   'Ajoute la ligne dans la zone de liste
    Call ComboBox2.AddItem("70%")   'Ajoute la ligne dans la zone de liste
    Call ComboBox2.AddItem("75%")   'Ajoute la ligne dans la zone de liste

End Sub 
 

<small> Coloration syntaxique automatique [AFCK]</small>
       

Et voila

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
3
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
13 juin 2006 à 08:56
Salut,

Au fait tu as réussi avec tes combobox si OUI N'oublie pas les réponses accéptées même si tu l'avais déjà mis avant.

Pour ce qui est de ton nouveau problème je ne sais que te dire. Tu dis "Ca ne marche pas":

- As tu un message d'erreur?
- Le résultat attendu n'est pas le bon?

Astuce: Si tu veux avoir des chiffres à virgule dans formule1 2 et 3 (ou dans  le réultat), il ne faut utiliser le type Integer.

Mais le type Single

donc remplacer les As Integer par des As Single
Et remplacer
TextBox8.Value =  CStr( CInt (formule1) + CInt(formule2) + CInt(formule3)) 

Par

TextBox8.Value  = CStr(CSng(formule1) + CSng(formule2) + CSng(formule3)) 

<small> Coloration syntaxique automatique [AFCK]</small>
       

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
3
Alboure Messages postés 42 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 21 juin 2006
1 juin 2006 à 11:09
Bonjour,
1) tu peux aussi faire:
combobox1.rowsource = "A1:A5" 'si les données à rentrer sont stockées dans ces cellules.

3)J'imagine que tu parles de:
textbox1.setfocus 'à placer dans le code du bouton
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_pierreroux Messages postés 12 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 12 juin 2006
1 juin 2006 à 14:05
Re-bonjour et merci à vous deux  Julien et Alboure,

En fait pour le point 3) Alboure a répondu "textbox1.setfocus ", c'est ce que je voulais.
 
Maintenant, je voudrais mettre en relation une combobox avec une  zone de texte, c'est à dire que la combobox soit directement reliée avec une zone de texte qui se met en surbrillance une fois que l'utilisateur a fait une sélection dans la combobox citée précédemment et qui est reliée à la zone de texte. tant que l'utilisateur n'a pas rempli la zone de texte, il ne peut pas passer à l'étape suivante du Userform. si possible, j'aimerais que cela fonctionne d'une combobox à une zone de texte,d'une combobox à une autre,  d'une zone de texte à une autre, etc...

Merci d'avance et à très bientôt pour de nouvelles questions car je suis actuellement sur un projet assez long de programmation

A+, pierreroux
0
cs_pierreroux Messages postés 12 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 12 juin 2006
1 juin 2006 à 15:55
Re-bonjour, j'ai une nouvelle question: quelle est le code à utiliser pour la logique suivante:

Si la valeur sélectionnée dans une zone de liste sous excel (feuille numéro x du classeur appelée toto) est < 200, alors afficher Userform1, ou bien si cette valeur est>200 afficher Userform2, sinon afficher Userform 3.

Merci d'avance et à très bientôt,

Pierreroux
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
1 juin 2006 à 18:07
Salut,

Tiens essaies ce qui suit.

CEci ouvre un Userform suivant la valeur de la cellule A1 de la feuille "Feuil1" du classeur Actif

Dim ValCell As Integer 
    ValCell = CInt(ActiveWorkbook.Sheets("Feuil1").Range("A1").Value) 

    Select Case ValCell 
        Case Is < 200:  Call Load(UserForm1) 
                        Call UserForm1.Show(vbModal) 

        Case Is > 200:  Call Load(UserForm2) 
                        Call UserForm2.Show(vbModal) 

        Case Else:      Call Load(UserForm3) 
                        Call UserForm3.Show(vbModal) 
    End Select 
 

<small> Coloration syntaxique automatique [AFCK]</small>
       

ATTENTION: il n'y a pas de test effectue sur la valeur de la cellule A1: A savoir qu il faut s'assurer que la valeur entrer est bien un chiffre sinon il y aura une erreur sur la ligne ou il y a le CINT
@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
cs_pierreroux Messages postés 12 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 12 juin 2006
1 juin 2006 à 18:28
Bonjour,

je ne comprends pas pourquoi la syntaxe suivante n'est pas bonne:

Private Sub ComboBox1_Change()
If ComboBox1.Value <= 200 Then
        Call Load(UserForm2)
            Call UserForm2.Show
    ElseIf 200 < ComboBox1.Value < 800 Then
        Call Load(UserForm3)
            Call UserForm3.Show
    Else
    ComboBox1.Value => 800 Then
        Call Load(UserForm4)
            Call UserForm4.Sho
    End If
End Sub

Pour des valeurs supérieures à 800, il continue à m'afficher Userform 3 alors que ca devrait être Userform 4

Merci de m'aider si possible,

Pierreroux
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
2 juin 2006 à 08:55
Salut,

ceci ne fonctionne pas en Vb: ElseIf 200 < ComboBox1.Value < 800 Then

Il faut le faire comme ceci:

ElseIf (200 < ComboBox1.Value) AND   (ComboBox1.Value < 800 ) Then

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
cs_pierreroux Messages postés 12 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 12 juin 2006
2 juin 2006 à 14:11
Bonjour, voilà mon programme:
If ComboBox1.Value <= 200 Then
       Call Load(UserForm2)
            Call UserForm2.Show
          
           
   ElseIf 200 < ComboBox1.Value And ComboBox1.Value <= 800 Then
        Call Load(UserForm3)
            Call UserForm3.Show
           
   Else
        Call Load(UserForm4)
            Call UserForm4.Show
           
    End If
Il marche mais par exemple: je choisis 200, Userform 2 s'affiche. si je clic sur la croix en haut à droite du userform 2, il s'en va et je reviens à ma liste déroulante Combobox sur userform 1 mais si je re-sélectionne 200, je reste sur Userform 1, alors que je voudrais faire ré-apparaître le userform 2, que dois je donc faire?

Merci pour votre aide, Pierreroux
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
2 juin 2006 à 14:18
Salut,

Dans quelle partie du code ce trouve le code que tu as donné?

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
cs_pierreroux Messages postés 12 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 12 juin 2006
2 juin 2006 à 16:46
Salut Julien, le code que j'ai donné est écrit dans mon userform 1. Dans ce userform, il y a une combobox1 qui permet selon la séléction d'afficher les userform 2, 3 ou 4.Voila.

A plus et merci pour ton aide et ton efficacité, pierreroux
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
2 juin 2006 à 16:58
Salut,

Je voulais savoir dans quelle partie du userform1 il etait.

Est ce qu il est dans initialize, dans l'événement click d'un bouton ou du combo box.

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
cs_pierreroux Messages postés 12 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 12 juin 2006
2 juin 2006 à 17:06
Salut, il est dans le combo box  1 du userform1 : Private Sub ComboBox1_Change()
 merci et à plus.
0
cs_pierreroux Messages postés 12 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 12 juin 2006
6 juin 2006 à 18:20
Bonsoir, j'aimerais avoir deux syntaxes:
1) comment on fait pour incluer plusieurs conditions dans un si: exemple: si Toto=8 et si tutu=7 et si ...
2) comment on fait pour récupérer et réutiliser une valeur dans un textbox d'un userform qui n'est pas actif: exemple:
la valeur du textbox 1 du userform 3 est égale à  celle du  textbox 1 du userform 1.

Merci pour votre aide et à bientôt, Pierreroux
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
7 juin 2006 à 08:54
Salut,

1) Utilise le Select case
    Select Case i 
        Case 1:  'Place le code a effectuer lorsque i =  1
        Case 2:  'Place le code a effectuer lorsque i = 2
        Case 3, 4, 5:  'Place le code a effectuer lorsque i = 3 ou 4 ou 5
        Case Is > 5:  'Place le code a effectuer lorsque i > 5
        '...
    End Select 

 

<small> Coloration syntaxique automatique [AFCK] </small>
       

2) Utilise des variables stockées dans un module.

'Dans les Forms ou il y a les textbox qui t'interesse
Private Sub TextBox1_Change() 
    TextUserForm1  = TextBox1.Text 
End Sub 
'Dans un Module
Public TextUserForm1 As String 
Public TextUserForm2 As String 

'La ou tu veux comparer les deux
If TextUserForm1 = TextUserForm2 Then 

End If 
 

<small> Coloration syntaxique automatique [AFCK]</small>
       

Voila en espérant avoir pu t'aider

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
cs_pierreroux Messages postés 12 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 12 juin 2006
7 juin 2006 à 10:03
Salut,

j'ai écris cette équation:
TextBox5.Value = TextBox1.Value + TextBox2.Value + TextBox3.Value + TextBox4.Value et cela ne marche pas.Pourquoi?

De même, je veux faire une somme dans le textbox 5 du userform 6 de valeurs  présentes dans des textbox du userform2, j'ai écris:
Userform6.TextBox5.Value. = Userform2.TextBox1.Value + Userform2.TextBox2.Value + Userform2.TextBox3.Value + Userform2.TextBox4.Value et cela ne marche pas.Pourquoi?

Merci de m'aider si possible,

Pierreroux
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
7 juin 2006 à 10:20
Salut,

Lorsque tu dis "Ca ne marche pas" qu est ce que tu veux dire exactement.

As tu essayer de passer par les variables publiques dans un module?

Petite précision:

Lorsque tu fais

TextBox5.Value = TextBox1.Value + TextBox2.Value + TextBox3.Value + TextBox4.Value

Cela concatènera le contenu des textbox 1 2 3 et 4 dans le 5 (n'oublie pas que le contenu d'un textbox n'est rien d'autre qu une chaine de caractères) meme si tu y rentre des chiffres,
ie:

TextBox5.Value = TextBox1.Value + TextBox2.Value
Si TextBox1.Value 2 et TextBox2.Value 3 et bien  TextBox5.Value = 23 et non 5
Si tu veux faire une addition et avoir le résultat:
TextBox5.Value = Cstr (Cint(TextBox1.Value) + Cint(TextBox2.Value)) 
 

<small> Coloration syntaxique automatique [AFCK]</small>
       

Ensuite:

Userform6.TextBox5.Value. = Userform2.TextBox1.Value + Userform2.TextBox2.Value + Userform2.TextBox3.Value + Userform2.TextBox4.Value

Peu être que cela fonctionne mais si les Userform ne sont pas chargés, la valeurs des champs sera "" donc la concaténation de "" avec "" ... donnera ""

Essaie réellement les variables par module pour voir si ceci contourne ton problème

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
cs_pierreroux Messages postés 12 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 12 juin 2006
7 juin 2006 à 16:42
Salut,

Qu'est ce que tu entends par "variable par module"??

Merci, pierreroux
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
7 juin 2006 à 17:01
SAlut,

Depuis l'IDE VBA Excel

Click Droit sur le projet => Insertion => (jusqu'ici comme si c'était un UserForm)

Choisi Module.

Ensuite dans la fenêtre qui s'est ouverte

Public TextUserForm1 As String 
Public TextUserForm2 As String 

'Dans les Forms ou il y a les textbox qui t'interesse
Private Sub TextBox1_Change() 
    Module1.TextUserForm1 = TextBox1.Text 
End Sub 
'La ou tu veux comparer les deux
If Module1.TextUserForm1 = Module2.TextUserForm2 Then 

End If 

===
En fait le truc est de bien séparé l'interface utilisateur de ton code.
Si l'utilisateur doit rentrer qqch, il faut faire en sorte que le champs de saisie soit relier avec une Variable (possédant la portée souhaite public ou Private).

En utilisant les modules, tes variables deviendront accessibles depuis n'importe quel endroit du code: Userform1, UserForm2... Module1, ...

Voila j'espère avoir été un peu plus clair 

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
Rejoignez-nous