XL 2010 For each controls impossible-résolu

Docdav

XLDnaute Junior
Bonjour,
j'ai un formulaire de saisie, avec plusieurs checkbox, nommée Box32,Box33, etc, le nombre étant la colonne dans lequel le résultat va se mettre. Rien de sorcier, une boucle d'écriture.

Mais...certaines checkbox doivent être modifiées en Frame avec 2-3 choix. J'ai la routine pour celles-ci.

Le problème est que la boucle des chekbox est rompue puisque certaines n'existent pas.
Soit faire plusieurs boucles sur les box existantes (pas propre)
Soit faire une boucle qui cherche les chekbox et fais le boulot.

Un exemple de ce que j'ai trouvé et qui ne marche pas : ça doit préremplir toutes les box normalement.

Dim obj As Control
For Each obj In Me.Controls
If TypeOf obj.Object Is msforms.CheckBox Then obj.Object.Value = True
Next obj

Avez-vous une idée.
Je mets mon fichier, pas du tout optimisé (va falloir que je fasse des modules), qui bug si il n'y a pas qq chose en ligne 6.

Il fonctionnait très bien avant de passer à ces choix multiples avec uniquement des box.
J'essaie d'avoir un fichier comptable mac (il faut juste que je déclare les listes dans ce fichier et ça fonctionne)

Merci de votre lecture et de votre aide.
David.
 

Pièces jointes

  • Formulaire-PC-modif.xlsm
    2.3 MB · Affichages: 115

Modeste

XLDnaute Barbatruc
Bonsoir,

Pas trop le temps, mais tu as renommé optSexe, un contrôle qui est un Frame ... et les 2 OptionButton ne sont pas nommés.

Pour le n° de colonne stocké dans le nom, tu peux aussi utiliser la propriété tag de tes contrôles (ce sera sans doute plus simple qu'un Right(control.name, 2 etc... )
 

Docdav

XLDnaute Junior
la modifiction est correcte, le module de nettoyage des champs fonctionne, avec plus d'élégance que ce que j'avais créé.
next...saisie prédictive ou option button...je me tâte. je vais regarder le coup des tag, puis essayer de créer une routine de lecture et de remplissage.

Merci, et bon dimanche...sous mes applaudissements !
 

Docdav

XLDnaute Junior
Bonjour, je reviens vous voir, je n'avais pas d'accés à un pc, et n'arrive pas à mettre windows sur mon mac, je galère pour le double boot...bref...
J'ai fini la saisie prédictive.
Je passe aux controles.
Comme dit au-dessus, le nettoyage fonctionne.

Je veux maintenant faire la lecture dans la feuille excel, puis l'inverse, l'enregistrement du formulaire dans la feuille.
J'ai mis tous les TAG avec la colonne (en chiffres) qui correspond.

Voici la boucle de lecture (dans le module lecture_codage, que j'appelle par call lecture)

Code:
Sub lecture()
    Set F = Sheets("Codage") 'feuille où sont lues les données
    ligneEnreg = Sheets("Codage").[B:B].Find(CmbChoixFiche, LookIn:=xlValues).Row 'cmbChoixFiche est la fiche choisie
  
Dim ctrl As Control

For Each ctrl In Feuille_Saisie.Controls  'Feuille_Saisie est mon formulaire
    Select Case UCase(Left(ctrl.Name, 3))
        Case "Tbx", "Cmb"
        ctrl.Value = F.Cells(ligneEnreg, ctrl.Tag)
        Case "Box", "Opt"
        If F.Cells(ligneEnreg, ctrl.Tag) = "" Then ctrl.Value = False Else ctrl.Value = True

    End Select
Next ctrl

End Sub
 

Pièces jointes

  • Formulaire-PC-V4-relecture out.xlsm
    2.2 MB · Affichages: 41

Docdav

XLDnaute Junior
ne trouvant pas mon erreur et pour essayer d'avancer, je me suis mis a l'enregistrement.
voici la boucle, qui ne fonctionne pas...
Code:
Dim lignevide As Long
lignevide = F.Range("B65535").End(xlUp).Row + 1
MsgBox "Enregistré Ligne " & lignevide

'--------------------Remplissage de feuille----------------------
Dim ctrl As Control
Dim Col As Integer

For Each ctrl In Feuille_Saisie.Controls
        Col = Val(ctrl.Tag)
Select Case UCase(Left(ctrl.Name, 3))
        Case "Tbx", "Cmb"
            F.Cells(lignevide, Col) = ctrl
        Case "Box"
            If ctrl.Value = True Then F.Cells(lignevide, Col) = 1 Else F.Cells(lignevide, Col) = 0
        Case "Opt"
            If ctrl.Value = True Then F.Cells(lignevide, Col) = ctrl.Caption Else F.Cells(lignevide, Col) = 0
    End Select
Next ctrl

End Sub

je pense avoir bien détaillé, je suis passé par une variable suppléméntaire pour lire le Control.Tag, j'ai mis une box pour vérifié la ligne dernière vide, il n'enregistre rien.
Ceci est dans un module appelé par call validation

Merci de vos lumières, j'y suis presque...
 

Modeste

XLDnaute Barbatruc
Bonsoir,

Il faudrait que tu arrêtes de faire deux choses:

  • passer d'un truc à l'autre quand ça ne va pas comme tu le voudrais: place des points d'arrêts dans ton code, exécute des parties en pas-à-pas , regarde quelle valeur ont certaines variables à certains moments, etc.)
  • déposer une version de ton fichier qui fait 2 Mo à chaque fois: dans ta feuille "Codage", il n'y a que 2-3 lignes qui sont utiles; dans 2000 lignes tu n'as que des zéros et si tu fais Ctrl+End, tu verras que tu as +/- 100.000 lignes ... qui ne servent à rien (à part gonfler la taille de ton fichier)

Pas tout passé en revue, mais voici 3 "couacs":

  1. il manque le nom de ton UserForm dans ta Sub lecture, à la ligne ligneEnreg= etc.
  2. 6 lignes plus bas, les TBX, CMB, BOX et OPT doivent être saisis en majuscules (puisque comparés à Ucase(Left(ctrl...
  3. les propriétés Tag des contrôles sont du texte ... quand tu écris Cells(LigneEnreg, ctrl.Tag) multiplie les ctrl.Tag par 1 pour convertir en donnée numérique

PS: tu as un OptionButton (optFemme) dont le tag n'est pas renseigné!?
 
Dernière édition:

Docdav

XLDnaute Junior
Bonsoir,
j'essaie d'avancer sur une fonction en attendant de trouver (ou de recevoir) les corrections.
Je vais regarder les points d'arrêt, je ne connais pas.
Les lignes préremplies datent du fichier avant formulaire, c'était une aide à la saisie. il reste le calcul sur les horaires que je dois mettre dans le code.
Pour les 100.000 lignes ??? Je ne sais comment elles sont arrivées, je les ai virées.

j'essaie de trouver avec les indices :
1-je cherche où mettre le userform ? Comme ça ?
Set F = Sheets("Codage")
ligneEnreg = F.[B:B].Find(Feuille_Saisie.CmbChoixFiche, LookIn:=xlValues).Row

si je mets Feuille_Saisie.CmbChoixFiche j'ai une erreur 381 impossibilité de définir la propriété List.Index
si je ne le mets pas j'ai la même erreur juste en dessous. (mais dans la fenetre varaible (que je viens de découvrir), il a trouvé la 1ere ligne vierge???

Bon, je suis perdu, et je dois allé bosser. je reverrais ça plus tard...

2-j'ai corrigé, je n'avais pas saisie le Ucase

3-j'ai corrigé pour les tag (et le tag manquant sur l'option button, quelle rapidité et quelle expérience pour voir un détail pareil !)

voici le code (j'ai rajouté une variable de colonne pour ma compréhension)

Code:
Sub lecture()
    Set F = Sheets("Codage")
    ligneEnreg = F.[B:B].Find(Feuille_Saisie.CmbChoixFiche, LookIn:=xlValues).Row
   
Dim ctrl As Control
Dim col As Integer

For Each ctrl In Feuille_Saisie.Controls
    col = Val(ctrl.Tag) * 1
    Select Case UCase(Left(ctrl.Name, 3))
        Case "TBX", "CMB"
        ctrl.Value = Val(F.Cells(ligneEnreg, col))
        Case "BOX", "OPT"
        If F.Cells(ligneEnreg, col) = "" Then ctrl.Value = False Else ctrl.Value = True

    End Select
Next ctrl

End Sub

Merci beaucoup.
 

Modeste

XLDnaute Barbatruc
Bonsoir Docdav, le forum,

Ce que je ne sais pas, à la lecture de ton message, c'est s'il contient une question ... ou si tu as fait les questions et les réponses. Ton dernier bout de code, dans un fichier avec les tags renseignés, il est fonctionnel ... ou pas :confused:
 

Docdav

XLDnaute Junior
Bonsoir à tous nos lecteurs, bonsoir Modeste,
malheureusement non, ça ne fonctionne pas.

ligneEnreg = F.[B:B].Find(Feuille_Saisie.CmbChoixFiche, LookIn:=xlValues).Row

si je mets Feuille_Saisie.CmbChoixFiche j'ai une erreur 381 impossibilité de définir la propriété List.Index
si je ne le mets pas j'ai la même erreur juste en dessous. (mais dans la fenetre varaible (que je viens de découvrir), il a trouvé la 1ere ligne vierge??? alors qu'il est censé me laissé choisir une ligne, et que je n'ai pas eu de choix (pas de lancement du formulaire, l'erreur intervient avant.
 

Modeste

XLDnaute Barbatruc
Peux-tu déposer une version actualisée du fichier (de taille raisonnable) avec les différents tags renseignés?
Il en manquait dans le dernier fichier du message #34
Les journées sont bien remplies pour le moment, je ne pourrai me connecter qu'en soirée.
 

Docdav

XLDnaute Junior
Bonjour, le voici, 141 ko, il a fait régime... l'initialisation fonctionne, le remplissage et l'enregistrement aussi (à l'ancienne pour l'instant, j'avais tenté avec une boucle comme la lecture ou le nettoyage mais ça bloque, je l'ai mis de coté pour l'instant).
j'ai corrigé tous les points cités, mais je ne sais pas si je mets l'userform où il faut dans le code.
j'ai séparé les optionbutton car il faut lire et comparer au ctrl.caption.

ça bloque sur la premiere ligne de controle, je n'ai même pas accès au choix de fiche, erreur 1004 ?

Merci beaucoup.
 
Dernière édition:

Docdav

XLDnaute Junior
en fait la boucle ne peut pas tourner puisque je ne choisit pas de fiche, le formulaire ne s'ouvre pas, et la boucle est testée avant même choix de fiches, une erreur de ce coté là ?
Application.EnableEvents = True à rajouter ? je vais tester.
 

Modeste

XLDnaute Barbatruc
Bonsoir,

Il ne faut pas nommer la combobox cmbChoixFiche avec cmb en préfixe (seuls les contrôles qui sont lus/écrits dans une boucle doivent l'être).

Il reste 3 checkBoxes qui n'ont pas de tag (ceux en bas du formulaire: LATA, OML et ECMO DACC)

Une fois ces corrections apportées, je n'ai pas de message d'erreur (au clic sur le bouton dans la feuille, quand je sélectionne une fiche dans la combo ChoixFiche ou quand je vide les champs)



Dans la procédure Initialize, l'instruction Me.comboChoixFiche.ListIndex = 0 entraîne l'exécution de la Private Sub comboChoixFiche_Click(); laquelle appelle la Sub Lecture … Pourquoi afficher les détails relatifs à la première fiche, au premier affichage du formulaire? Mets la première instruction ci-dessus en commentaire et vérifie si elle apportait quelque chose d'utile ...?
 

Statistiques des forums

Discussions
312 108
Messages
2 085 366
Membres
102 874
dernier inscrit
Petro2611