Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Bizarreries d'une procédure déjà utilisée sans erreur !

W

Willy

Guest
Bonjour à tous

La procédure suivante permet à partir d'une listBox de saisir des cellules automatiquement, puis en cliquanr de nouveau dans la listBox, une autre ligne est saisie sous la première ligne et ainsi de suite, jusqu'à la dernière ligne ( dans mon cas la 4eme).



Private Sub List_Stage_Agt_Click()

' Affiche automatiquement les infos dans le formulaire avec passage à la ligne automatique
Dim VarDerL As Integer
'Dernière ligne du formulaire
VarDerL = Sheets("FORMULAIRE_FORMATION").Range("A56").End(xlUp).Row + 1

' Arrivé à la dernière ligne des stages du formulaire
If VarDerL = 40 Then
MsgBox "Vous êtes arrivé à la dernière ligne !", vbCritical, "STAGES COMPLET !"
Range("A50").Select
Unload Select_Agent
Exit Sub
End If

' AFFICHE LES RESULTATS DANS LES CELLULES DU FORMULAIRE
With Sheets("FORMULAIRE_FORMATION")
.Range("A" & VarDerL) = DS_A_15 ' TextBox titre stage
.Range("G" & VarDerL) = DS_A_16 ' TextBox Numéro stage
.Range("K" & VarDerL) = DS_A_17 ' TextBox date du stage
End With

Exit Sub
End Sub


Cette procédure adapté à partir d'une démo de @+Thierry fonctionne parfaitement, je l'utilise dans un autre projet, mais dans le projet actuel le lignes saisies ne correspondent pas et je n'arrive pas à écrire à la ligne suivante, en clair la saisie se fait ou elle veut !!!

J'y ai passé une bonne partie de la journée à essayer de comprendre ou ça cloche mais je sèche !


De plus dans un ancien projet j'utilisai également la procédure suivante à la suite de la première qui permet de supprimer la ligne de la listBox qui a été cliquée :

' Après avoir cliqué dans la listBox, le nom du stage concerné disparait de la listbox
If List_Stage_Agt.ListCount >= 1 Then
If List_Stage_Agt.ListIndex = -1 Then
List_Stage_Agt.ListIndex = List_Stage_Agt.ListCount - 1
End If
List_Stage_Agt.RemoveItem (List_Stage_Agt.ListIndex)
End If

Et j'ai une erreur actuellement à :
List_Stage_Agt.RemoveItem (List_Stage_Agt.ListIndex)

????

Décidément c'est pas le jour ! lol

Merci de vos conseils
Willy
 
@

@+Thierry

Guest
=> DEMO UserForm ListBox Méthode RemoveItem sur Action Click de la ListBox

Salut Willy, le Forum

Oui tu te compliques un peu la vie j'ai l'impression Willy, pourquoi vouloir tout faire en en coup avec une Action "Click" sur la ListBox dans laquelle tu veux faire un RemoveItem... C'est réalisable, mais il faut t'y prendre autrement...

Ensuite pour ce qui est des reports de données aléatoirement faux, je ne sais que te dire car je n'ai pas reconstruis ton UserForm avec tous tes controls... Tout ce que je peux dire c'est que pour "les lignes saisies ne correspondent pas et je n'arrive pas à écrire à la ligne suivante, en clair la saisie se fait ou elle veut !!!

C'est probablement dû à ce que ta variable "VarDerL " pointe dans la Colonne "A" (en remontant de la ligne 56 jusqu'à la dernière ligne remplie et en redescendant en dessous "+1"... Est-ce que c'est normal que tu reportes des données en "G" et "K", que se passe-t'il en "B, C, D, E, F" ? et surtout n'y a t'il rien d'écrit entre la cellule "A56" et ton tableau ???...

Enfin de toute manière je suis partie sur une nouvelle démo où tu (vous)découvrirez comment je m'y prendrai pour un cas de figure de la sorte...

J'y ai mis des encardré sur les parties "sensibles" du code pour effectuer un RemoveItem sur l'action Click de la ListBox concernée sans se faire enguirlander par le débugueur !!!

En espérant que celà te fera comprendre ton/tes erreurs

Bonne Soirée
@+Thierry
 

Pièces jointes

  • USF_ListBox_RemoveItem.zip
    18.1 KB · Affichages: 25
W

Willy

Guest
Re: => DEMO UserForm ListBox Méthode RemoveItem sur Action Click de la ListBox

Bonsoir Thierry et merci de te pencher sur mon pb.

Je répond à tes questions :
Je souhaite faire tout d'un coup avec la listbox car c'est un opération qui va énormément se répéter dans la journée, donc voici le principe :

Dans ma feuille j'ai créé mon formulaire prêt à recevoir les données.
Par un bouton, j'ouvre mon USF. 2 listbox sont présentes, la première recevant une liste de nom, la seconde recevant après avoir cliqué sur un nom, tous les stages de la personne.

Et donc je souhaiterai que en cliquant sur chaque stage dont j'ai besoin, ceux-ci viennent remplir le formulaire.

C'est du luxe, mais j'aurai aimé en plus qu'après avoir cliqué sur un stage, celui-ci sorte de la listbox pour éviter qu'il soit saisie par erreur de nouveau ( pour ce projet c'est vraiment du luxe, mais en fait pour le projet suivant cela me sera vraiment nécessaire, donc j'essai de me faire la main avant ! lol)

Je te cite :
C'est probablement dû à ce que ta variable "VarDerL " pointe dans la Colonne "A" (en remontant de la ligne 56 jusqu'à la dernière ligne remplie et en redescendant en dessous "+1"... Est-ce que c'est normal que tu reportes des données en "G" et "K", que se passe-t'il en "B, C, D, E, F" ?

Et oui je commence à cerner l'erreur, en fait oui j'ai des cellules remplies ( qui représente le modèle de mon formulaire en fait ) et donc effectivement ça doit s'affoler ! dans mon ancine projet cela fonctionnait bien mais bien sur les cellules de la colonne de référence étaient vides !!!!

Pourquoi les données en A, G et K ? Ben cela correspond à l'emplacement dans le formulaire ou les données doivent être écrites.

Je m'empresse de regarder ton exemple.
A+ Willy
 
W

Willy

Guest
Re: => DEMO UserForm ListBox Méthode RemoveItem sur Action Click de la ListBox

Re Bonsoir Thierry et le forum,

Effectivement après avoir parcouru ton exemple, le removeItem n'est pas chose simple !!
J'ai essayé de réadapter mon code mais il me génère toujours une erreur ( non commenté d'ailleur !).
Je suis pas mal avancé dans mon projet et je n'ai pas assez d'expérience pour trouver le pb.
Je n'incluerai pas cette fonction dans l'appli pour le moment mais je vais y travailler ! ( j'abandonne pas facilement !! lol)

Concernant mon pb de ligne et de saisie auto faite à l'arrache, c'est bon j'ai repris le formulaire et ça fonctionne enfin correctement !

Par contre si je puis me permettre, j'avais posté (2 ou 3 jours ) un post ( mal formulé d'ailleur ) concernant la listBox mais très en rapport avec celui-ci, a savoir :

Je cherche comment masquer des lignes dans la même listBox selon condition.
J'ai remonté dans les archives jusqu'à 1 an et demi sans rien trouver qui traite plus ou moins du sujet.

Ce que je recherche à faire plus précisément :

La listbox récupère les stages de la personne concernée.
Dans ma liste Stage de référence il y a environ une centaine de stages et tous les stages que la personne ne possède pas sont indiqués comme ceci : ***

Donc par ex, dans ma lisBox je me retrouve avec les infos suivantes :

CFASPE
CFAPSR
DSA 1
***
DSA 2
***
MNPS
INPS
***
***
***
FDF 1
***
FDF 2
***
***
***
***
***
Etc ...


Je souhaiterai afficher dans la listBox uniquement les stages que la personne possède et non les ***.

Est-ce possible en vb sur la listBox ?

J'ai pensé le cas échéant à une formule conditionnelle directement dans la liste qui effacerai les ***,
mais bon j'adore vb et mon souhait c'est de manipuler Excel le plus possible par le code.

Merci beaucoup
Willy
 
@

@+Thierry

Guest
Re salut Willy, le Forum

Vite fait avec la brosse à dents dans une main et l'autre sur le clavier :

Private Sub UserForm_Initialize()
Dim WS As Worksheet
Dim Plage As Range
Dim Cell As Range

Set WS = ThisWorkbook.Sheets("Feuil1")
Set Plage = WS.Range("A1:A" & WS.Range("A65536").End(xlUp).Row)

For Each Cell In Plage
If Left(Cell, 1) <> "*" Then Me.ListBox1.AddItem Cell
Next
End Sub

Si çà peut t'aider pour faire de beaux rêves

Bonne nuit à tous et toutes
@+Thierry
 
W

Willy

Guest
Bonjour Thierry, le forum

Concernant :

Set WS = ThisWorkbook.Sheets("Feuil1")
Set Plage = WS.Range("A1:A" & WS.Range("A65536").End(xlUp).Row)

For Each Cell In Plage
If Left(Cell, 1) <> "*" Then Me.ListBox1.AddItem Cell
Next
End Sub


ben il ne se pass erien . j'ai toujours mes lignes contenants les ***
?

Merci encore
 
@

@+Thierry

Guest
Bonsoir Willy, le Forum

A ce stade, la procédure que je t'ai donnée est un exemple comme tu pourrais trouver dans l'aide, mais à partir de là c'est ton esprit de déduction qui te permettra de l'adapter à tes ambitions.

Essaie ceci :

Matériel nécessaire :

1 Classeur Vierge
1 Feuille nommée "Feuil1" dans laquelle de A1 à A100 tu "dragues" n'importe quoi..
1 UserForm nommé "UserForm1"
1 ListBost dans ce UserForm1, nommée "ListBox1"

Avant de lancer la macro suivante tu prends soin de mettre des "****" ou des "*totos" ou encore des "**zaza" dans les cellules comprises entre "A1" et "A100"...

Puis tu coles cette macro dans le Private Module du UserForm1
Private Sub UserForm_Initialize()
Dim WS As Worksheet
Dim Plage As Range
Dim Cell As Range

Set WS = ThisWorkbook.Sheets("Feuil1")
Set Plage = WS.Range("A1:A" & WS.Range("A65536").End(xlUp).Row)

For Each Cell In Plage
If Left(Cell, 1) <> "*" Then Me.ListBox1.AddItem Cell
Next
End Sub

Et tu n'auras aucune des valeurs "****" ou des "*totos" ou encore des "**zaza"

Voilà, c'est tout ce que je peux faire pour toi... Dans le VBA, il est souvent nécessaire de comprendre la structure et le fonctionnement d'un code, car malheureusement tout ne se fait pas par copié/collé et zou çà marche

Bonne programmation, bonne soirée, bon courage
@+Thierry
 
W

Willy

Guest
Bonjour Thierry, le forum

c'est vrai, tu as raison je devrais toujours essayer sur un projet nouveau et non dans l'appli en cours, parce que j'ai tout triturer dans tous les sens, avec les mêmes données et déclarations ( que j'avais déjà pour traiter d'autres actions ) mais avec un projet en cours je doit avoir des contradictions et mon experience limité en vba ne me permet pas encore de les déceller.

Ca rentre, mais doucement ... lol

Bonne journée

Willy
 

Discussions similaires

Réponses
21
Affichages
664
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…