débugage userform vba

lolo49

XLDnaute Nouveau
salut le forum,

Je suis débutant un vrai novice sur VBA, après avoir parcourus pas mal de code VBA via ce forum et de tuto sur les userform pendant plus d'une semaine. Je ne progresse pas très vite, voir même çà fonctionne moins bien qu'avant.
Au début j'arrivai en cliquant sur le bouton macro à lancer le userform, mais maintenant cela bug. Et je ne comprends pas pourquoi.

Je vous joint le fichier excel avec le si peu de chose que j'ai réussi à faire et ce qu'il me reste à faire si vous pouvez m'aider, le coup de main serait très apprécié.

a+
 

Pièces jointes

  • test bac.xls
    90 KB · Affichages: 393

pedrag31

XLDnaute Occasionnel
Re : débugage userform vba

Bonjour lolo49, Dranred, Bonjour le forum,

Il faut que tu supprimes la propriété "RowSource" de ta combobox (valeur vide) si tu veux pouvoir la manipuler ensuite. Sinon, "row source" sert a remplir la combobox de façon automatique avec une zone de cellules de ton fichier.

VB:
Private Sub UserForm_Initialize()
With Sheets("Feuil1")
    ' Ici on fait une boucle sur les cellules du range A9:AXX de la feuille 1 et on ajoute chaque valeur "colonne A" et " - " et "colonne B" dans la combobox1
    For Each cell In .Range("A9:A" & .Cells(Application.Rows.Count, 1).Row)
    ComboBox1.AddItem cell.Value & " - " & cell.Offset(0, 1).Value
    Next cell
End With
End Sub
A tester mais je ne pense pas que ce soit la feuille 1 qui contienne tes données sources, donc il faudra surement remplacer
VB:
With Sheets("Feuil1")
par
VB:
With Sheets("Feuil2")


Pour la question:
commment faire pour avoir une préselection imbriquée
exemple ; si la personne clique sur le pays Belgique alors
seulement les clients belge s'affiche dans le combobox
ou si la personne clique sur le dpt alors le pays est choisi
par défaut et seulement les clients correspondants au dpt
s'affiche dans le combobox

Peux tu reformuler? Quelles sont les données sources? En Feuille2? :confused:
Tu veux faire cela sur l'USF ou sur la feuille 1?

avoir un contrôle, si une zone est renseignée
alors les 2 autres zones doivent être remplies
sinon message de blocage

Sur l'USF lorsqu'on clique sur Valider où tu veux que cela se passe au niveau de la feuille1?
Donne qques exemples et précisions, merci ;)

Bonne journée :)

Edit : oups erreur de prénom :eek:
 

Pièces jointes

  • Copy of test bac.xls
    99 KB · Affichages: 67

lolo49

XLDnaute Nouveau
Re : débugage userform vba

Bjr le Forum, Dranreb et Pedrag31,

Un grand merci pour vos réponses, cela me débug mon userform.

Effectivement ma source est la feuil2, je voudrais que l'utilisateur est une sélection de client disponible dans la combobox1 "client" via la BSD de la feuil2 et que lorsque le userform est complété cela alimente la feuil1.

En fait, je crois que je n'avais pas besoin d'utiliser le code "UserForm_Initialize()" je voulais plutôt chercher un code du style "clear", c'est à dire que le userform se vide si on appuie sur Valider ou Quitter. Je vais chercher cela sur le forum.

Si j'ai bien compris en fait je peux remettre les données de ma BSD de la feuille 2 en row source et supprimer le code userfrom initialize qui me sert à rien ici. C'est vrai par contre que j'ai oublié de mettre un combobox pour le n° de cpte client (de la feuil2)

-------------------
Pour la question:
commment faire pour avoir une préselection imbriquée
exemple ; si la personne clique sur le pays Belgique alors
seulement les clients belge s'affiche dans le combobox
ou si la personne clique sur le dpt alors le pays est choisi
par défaut et seulement les clients correspondants au dpt
s'affiche dans le combobox
-------------------------------------------
Quand on a une idée en tête ce n'est pas évident de la faire partagée ;)

pour répondre à pédrag31 : les données sont en feuil2, j'aurai préférer pouvoir le faire depuis l'userform, et pour ensuite le "redispatcher" comme chaque intitulé de combobox dans la feuil1.

J'aurai du écrire que ces "conditions imbriquées" permettent depuis chaque combobox de limiter le nbre de possibilité de choix.

////////////////////

avoir un contrôle, si une zone est renseignée
alors les 2 autres zones doivent être remplies
sinon message de blocage
--------------

dans la frame1 "expédition", si la personne complète le nbre de bacs du textbox3 j'aurai voulu que par défaut le checkbox1 "petit bacs" soit rempli. Et/Ou si la personne clique sur la checkbox4 "grand bacs" alors la textbox4 doit être complété, sinon c'est une erreur de saisie. Cet événement de "contrôle" est préférable depuis l'userform au moment de la saisie.

J'espère avoir été clair, ce qui n'est jamais évident. Grâce à votre aide, j'ai viens de comprendre ce qu'était une boucle enfin je crois :p
 

Dranreb

XLDnaute Barbatruc
Re : débugage userform vba

Si l'ordre des choix dans les ComboBox n'est pas figé, c'est assez compliqué. J'ai bien essayé de créer un module de classe ComboBoxLié dans OutIdx, mais je vais devoir soit le supprimer soit le réécrire complètement. Toutefois, des méthodes ont été ajoutées à ComboBoxCasc pour pouvoir changer l'ordre des ComboBox. Contrairement à moi, certain ne le perçoivent déjà pas hyper simple à utiliser pour des ComboBox en cascade dans un certain ordre figé (voir pourtant le code de la Démo ComboBoxCasc dans DémoOutIdx, on ne peut pas faire plus simple). Mais alors pour commander au moment opportun le mécanisme qui va changer l'ordre et reconstruire le dictionnaire arborescent, ça sera beaucoup plus compliqué. Mais vous pouvez chercher si le cœur vous en dit… Sinon il va falloir vous farcir les AddItem.
Cordialement.
 

lolo49

XLDnaute Nouveau
Re : débugage userform vba

Re Dranreb,
je suis justement tombé sur ton tuto d'OutIdx, et les commentaires des stars du Vba qui ton posé énormément de questions alors vu mon niveau de débutant en vba...
En fait, l'ordre du choix va se faire d'abord par pays, puis par département puis par client. Car en lisant une discussion sur le forum (avec toi et Robert notamment) j'ai justement cru comprendre que cela posait prob et qu'on ne pouvais pas faire de trie "aisément". Je continue à lire le fil de ton post sur OutIdx (petite question : tu parles d'une mise à jour, mais je ne vois pas de nvx fichier ou je me trompe peut-être, j'ai pas fini de lire le post..... de 3 pages)


Je vais essayer de m'inspirer d'un code de Robert :

Private f As Object 'déclare la variable f (onglet Fournisseurs)
Private test As Boolean 'déclare la variable test

Private Sub UserForm_Initialize()
Dim mondico As Object 'déclare la variable mondico
Dim c As Range 'déclare la variable c

Set f = Sheets("FOURNISSEURS")
Set mondico = CreateObject("Scripting.Dictionary")
For Each c In f.Range("F2:F" & f.Cells(Application.Rows.Count, 6).End(xlUp).Row)
mondico(c.Value) = ""
Next c
Me.ComboBox36.List = mondico.keys
With Sheets("fournisseurs")
ComboBox1.List = .Range("a2:a" & .Range("a65536").End(xlUp).Row).Value
TextBox4 = "contacts"
TextBox5 = "téléphone"
TextBox6 = "fax"
TextBox45 = "mail"
End With
End Sub
Private Sub ComboBox36_Change()
Dim mondico As Object
Set mondico = CreateObject("Scripting.Dictionary")

With f
.Activate
test = True 'définit la variable test
Me.ComboBox1.Clear
TextBox4 = ""
TextBox5 = ""
TextBox6 = ""
TextBox45 = ""
For Each c In f.Range("F2:F" & f.Cells(Application.Rows.Count, 6).End(xlUp).Row)
If c = Me.ComboBox36 Then Me.ComboBox1.AddItem c.Offset(0, -5)
Next c
End With
Me.ComboBox1.SetFocus 'place le curseur dans la ComboBox1
test = False 'redéfinit la variable test
End Sub

Private Sub ComboBox1_Change()
Dim r As Range 'définit la variable r (Recherche)
Dim pa As String 'définit la variable pa (Premi1ere Adresse)
Dim ent As Integer 'définit la variable ent

If test = True Then Exit Sub 'si test est vrai, sort de la procédure
Set r = f.Columns(6).Find(Me.ComboBox36.Value, , xlValues, xlWhole) 'définit la recherche r
If Not r Is Nothing Then 'condition 1 : si il existe au moins une occurrence trouvée
pa = r.Address 'définit l'adresse de la première occurrence
Do 'exécute la boucle
If r.Offset(0, -5).Value = Me.ComboBox1 Then 'condition 2 : si la cellule en colonne A de l'occurrence trouvé est égale à la valeur de la ComboBox1
ent = r.Row 'définit la variable ent
GoTo suite 'va à l'étiquette "suite" (sans rechercher les occurrences suivantes...)
End If 'fin de la condition 2
Set r = f.Columns(6).FindNext(r) 'redéfinit la recherche r (occurrence suivante)
Loop While Not r Is Nothing And r.Address <> pa 'boucle tant qu'il existe de nouvelles occurrences ailleurs qu'en pa
End If 'fin de la condition 1
suite: 'étiquette
TextBox4 = Sheets("fournisseurs").Cells(ent, 2) 'contacts'
TextBox5 = Sheets("fournisseurs").Cells(ent, 3) 'téléphone'
TextBox6 = Sheets("fournisseurs").Cells(ent, 4) 'fax'
TextBox45 = Sheets("fournisseurs").Cells(ent, 5) 'mail'
With Sheets("demande")
.Range("l13").Value = ComboBox1.Value 'fournisseurs'
.Range("q17").Value = TextBox5.Value 'telephone'
.Range("r17").Value = TextBox6.Value 'fax'
.Range("l16").Value = TextBox4.Value 'contact'
.Range("l20").Value = TextBox45.Value 'email'
.Range("l18").Value = Range("s17").Value
End With
End Sub

--------------
J'aime bien la lecture, mais quand y'a trop de code inconnu c'est pas évident :p
 

Dranreb

XLDnaute Barbatruc
Re : débugage userform vba

Ah si l'ordre n'est pas figé, c'est simple. Il suffit d'ajouter les ComboBox successifs dans l'ordre des choix en indiquant chaque fois leurs colonnes respectives (Méthode Add), un Actualiser à la fin, et c'est tout. C'est le module de classe ComboBoxCasc qui se charge de tout tant au niveau des List des ComboBox que des choix de l'opérateur, et qui te prévient quant une combinaison de valeurs existantes a été formée par ses choix (évènement Bingo). Contrairement au code de Robert tu ne t'occupe plus de rien de ce qui se passe en amont de cette circonstance. Dans la Démo ComboBoxCasc il n'y a que 2 ComboBox, mais c'est tout aussi facile s'il y en a 3, c'est un Add de plus au début c'est tout.
Les version successives ont toutes été mise dans le 1er post qui ne contient que la dernière.

Je crois reconnaitre le code de Robert d'ailleurs. S'il s'agit bien de cette discussion, j'y ai joint tout le code souhaitable pour un tel userform au post #9. On peut y voir que la part consacrée aux ComboBox est quasi inexistante, l'accent est surtout mis sur l'activation des boutons utilisables.
Cordialement.
 
Dernière édition:

Discussions similaires

  • Résolu(e)
Microsoft 365 Taille UserForm
Réponses
3
Affichages
387

Statistiques des forums

Discussions
312 430
Messages
2 088 365
Membres
103 831
dernier inscrit
Benjaminlutz