XL 2016 erreur 381 impossible de définir listindex de table de propriété non valide

dadaze

XLDnaute Nouveau
Bonjour,

Comme l'intitulé l'indique voici le message qui s'affiche lorsque lorsque je lance ma macro "userform.show 0 " et ce après avoir insérer les premières données dans mon onglet "BD" auparavant vide. En d'autre terme une fois mes premières données rentrée, je ne peux plus appeler mon userform sans que le message en objet s'affiche.

je crois avoir déceler le code à l'origine de ce bug le voici "
Set f = Sheets("BD")
dans Useform initialize
Me.ChoixNom.List = f.Range("B2:B" & f.[B65000].End(xlUp).Row).Value
je joins mon fichier pour info ce dernier contient 3 combobox qui se superpose donc j'utilise combobox.visible = true selon l'onglet sollicité

Voilà si l'un d'entre vous peut m'aider, je l'en remercie par avance
 

Pièces jointes

  • BD Encodage OK Fonctionel.xlsm
    230.2 KB · Affichages: 12

vgendron

XLDnaute Barbatruc
Re
Nouvelle version 3
j'y ai ajouté la gestion de saisie des numéros de téléphone (au format Français), des codes postaux (5 chiffres) et différentes dates (si tu saisis une date farfelue, elle est refusée)

pour les dates de naissance des enfants 1 et 2, j'ai mis à jour l'age.
 

Pièces jointes

  • BD Encodage OK Fonctionel -Ver 3.xlsm
    231.1 KB · Affichages: 5

patricktoulon

XLDnaute Barbatruc
bonjour
juste en passant le userform est encore trop gros chez moi
les classe testbox c'est pas bon ,je sais pas qui c'est qui a codé cela
par exemple
votre code pour les datebox
VB:
'*********************'Date de Naissance***************************
Private Sub TargetBox_Change()
    Dim Texte As String
    Texte = Me.TargetBox.Text
    If Len(Texte) > 10 Then 'on limite le nombre de caractères saisis à 10 'dd/mm/yyyy
        TargetBox = Left(Texte, 10)
    End If
    If Len(Texte) = 10 Then 'on vérifie qu'il s'agit d'une date
        If Not IsDate(Texte) Then
            MsgBox "cette date n'est pas une date valide"
            Texte = ""
        End If
    End If
    Select Case Len(Texte) 'on ajoute automatiquement les /
        Case 2, 5
            Texte = Texte & "/"
    End Select
    TargetBox.Text = Texte
End Sub
imaginons que je me trompe et que je reviens en arrière avec la touche back
et ben je suis bloqué car des le len 2 ou 5 j'ai le "/" automatique car c'est dans l'event change
exemple
je veux taper 28/02/2021
et je tape par erreur 29
ben ca m'ajoute le slash ok
j'essaie de revenir en arrière j'efface donc le slach
conclusion le change re detecte le len(2) ben il me le remet 😂
a oui ça fout bien les boule ça


et pareil pour le code postal même problème
votre code

VB:
Private Sub TargetBox_Change()
    Dim Texte As String
    Texte = Me.TargetBox.Text
    If Len(Texte) > 6 Then
        Texte = Left(Texte, 6)
    End If
    Select Case Len(Texte)
        Case 2
            Texte = Texte & " "
    End Select
    Me.TargetBox.Text = Texte
End Sub
si je reviens en arrière ben je suis bloqué exactement le même problème que le datebox


pour info
forcer le format d'un textbox avec ajout de caractères en aucun cas se gère dans l'events change
sinon il y aura des soucis d' ordre ergonomique de manipulation
toujours keypress ou keydown

là ou je rejoins @vgendron c'est pour la retranscription dans les tableaux
quand on a beaucoup de données comme ça
soit on tag ou nomme les textbox et autre controls avec soit la colonne du range soit le nom de colonne d'un tableau structuré et on fait des boucles

et bien d'autres choses encore il y a tellement a faire sur ce fichier
un conseil reprenez tout à zero
en commençant par un redimensionnement du userform et controls ajoutez y le cas échéant une adaptation a l’écran utilisé en dynamique au pire si vraiment trop de donné met le tout dans une frame avec scrollbar sauf les boutons d'en bas qui doivent être a porté tout le temp
 

vgendron

XLDnaute Barbatruc
Salut @patricktoulon
pour les classes, c'est tout moi qui a fait à partir de code trouvé sur le net :)
et effectivement, ce problème de retour en arrière me fout bien les boules. Et justement, j'avais prévu de regarder ca aujourd'hui.

si je comprend bien, je dois oublier l'events change, pour utiliser keypress ou keydown
entre ces évènements et les modules de classe==> deux "notions" que je ne maitrise pas du tout

j'ai du boulot
 

patricktoulon

XLDnaute Barbatruc
Dans mes recherches, Je viens de tomber sur un site sympa ;)
ben oui tu a vu qui c'est l'auteur ? ;)

et oui oublie l'event change
tiens kado des exemples simplifiés ;)

edit : bonjour au fait!!! pardon
 

Pièces jointes

  • exemples simple textbox formaté + masque de saisie .xlsm
    34.4 KB · Affichages: 5
Dernière édition:

vgendron

XLDnaute Barbatruc
ben oui tu a vu qui c'est l'auteur ? ;)
évidemment

dans tes codes, ce qui me manque (à moins d'avoir mal vu) c'est la gestion de la sortie du control
typiquement, quand j'ai fini de saisir la date, il faudrait qu'une entrée ou tabulation permette de sortir du control pour passer au suivant
je vais voir pour ajouter un case keycode=7 (tabulation) ou 13 (entrée)
au moment ou j'écris, je n'ai pas encore ouvert ton fichier d'exemple.. la réponse y est peut etre déjà..
 

patricktoulon

XLDnaute Barbatruc
re
l'event exit ne fait pas partie du control de saisie

la saisie c'est uniquement les touches

en général on se sert de exit pour controler la totalité de la saisie

ici ce n'est plus necessaire puisque la saisie est contrôlée à chaque caractère tapé
maintenant pour passer au suivant oui le exit
dans ce cas là la ou j'ai laisser libre a chaque utilisateur de mes codes il faut ajouter le case 13

par exemple dans l'exemple de datebox que je viens de te fournir
après le case 8 et avant le case else tu met et on deplace le keycode= 0 dans chaque case
comme ceci:

VB:
Private Sub DateBoxMasK(ByVal tbx As Object, ByVal KeyCode As MSForms.ReturnInteger, Optional MaskVisible As Boolean = True)
    Dim V$, K&, Mask$, X&, Pos&
    Mask = "__/__/____"
    With tbx
        V = .Value & Mid(Mask, Len(.Value) + 1)    'on prend la valeur actuelle du textbox
        Pos = .SelStart + 1:

        Select Case KeyCode
        Case 96 To 105, 48 To 57
            If Pos = 3 Or Pos = 6 Then Pos = Pos + 1
            K = KeyCode:
            If K >= 96 Then K = K - 48:
            If Pos > 10 Then KeyCode = 0: Exit Sub
            Mid(V, Pos, 1) = Chr(K)
            If Pos = 2 Or Pos = 5 Then Pos = Pos + 1

            '*******Contrôle de la validité de la date*********
            If Val(V) > 31 Or Val(Mid(V, 1, 1)) > 3 Then V = Mask: Pos = 0
            If Val(Mid(V, 4, 1)) > 1 Or Val(Mid(V, 4, 2)) > 12 Then Mid(V, 4, 2) = Mid(Mask, 4, 2): Pos = 3
            If Mid(V, 7, 4) Like "####" Then an = Mid(V, 7, 4) Else an = "2004"
            If Mid(V, 1, 5) Like "##/##" Then If Not IsDate(Mid(V, 1, 6) & an) Then Mid(V, 4) = Mid(Mask, 4): Pos = 3
            '****fin de Contrôle de la validité de la date*****
         KeyCode = 0
      Case 8:
            If Pos = 7 Or Pos = 4 Then Pos = Pos - 1
            If Pos > 1 Then Mid(V, Pos - 1, 1) = Mid(Mask, Pos - 1, 1)
            Pos = Application.Max(0, Pos - 2)
         KeyCode = 0
     
        Case 13
           If Len(.Value) < 10 Or InStr(1, V, "_") > 0 Then KeyCode = 0

  
       
        Case Else: KeyCode = 0    'toutes les autres touches sont automatiquement annulées
        End Select
         If V = Mask Then V = ""
        If V <> "" And Not MaskVisible Then V = Split(V, Mid(Mask, 1, 1))(0)
        .Value = V
        .SelStart = Application.Min(10, Pos)
    End With
End Sub
comme ca tu non seulement tu control d'avoir fini de taper ta date mais tu va vers le suivant avec la touche enter
tu peux faire exactement la meme chose avec
le case 9 'keycode de la touche tab
et avec le même code que le 13

voila
 

vgendron

XLDnaute Barbatruc
alors, effectivement, ca fonctionne bien, mais à l'utilisation, je me rend compte que une fois qu'on est rentré dans le control.. on doit effectuer la saisie.. pas moyen de bypasser le control..
du coup, j'ai contourné en ajoutant un test sur le keycode AVANT d'entrer dans les private Sub CtrL_Date...
j'ai donc "rassemblé" les tests sur les keycode 9 et 13

ca me donne la versin 4 que voici
 

Pièces jointes

  • BD Encodage OK Fonctionel -Ver 4.xlsm
    235.9 KB · Affichages: 1

vgendron

XLDnaute Barbatruc
Hello ici

en PJ une version 5: j'y ai apporté quelques modifs
1) il n'y a plus qu'UN seul combobox==> CBx_Generique
===> adieu les combo.enable, .visible en fonction de la feuille active

2) les checkBox ont été remplacées par des Options boutons
==> idem. adieu les checkbox= false, enable, visible.....
une seule option est selectionnée==> si tu cliques sur une option, les autres sont automatiquement déselectionnées==> ca lance automatiquement le remplissage du combo avec la feuille adéquate (avec une seule macro)

3)j'ai mutualisé certaines opérations: notamment "déplacerligne"
qui pour l'instant permet de déplacer une ligne de la feuille BD vers la feuille Résiliation (bouton Supprimer de BD)
mais je suppose que le bouton "vers SAF" permet de déplacer vers la feuille SAF (mais à partir de la feuille BD uniquement?? ==> dans ce cas, ce bouton ne devrait etre visible que lorsque la feuille BD est active ???)

certains boutons ne font rien encore...
va voir le code et fais nous un retour
 

Pièces jointes

  • BD Encodage OK Fonctionel -Ver 5.xlsm
    214.6 KB · Affichages: 5

dadaze

XLDnaute Nouveau
Salut

Dans la PJ, une version épuré, et lisible
pour comprendre, il faut que tu prennes le temps d'aller voir le code et tous les commentaires que j'y ai mis

pour le tri, c'est l'objet des deux macros "TriBD" et "TriRésiliation"

dans la feuille Listes: des tables qui permettent de ne plus avoir aucun nom de structure et num tel en dur dans le code==> pour la maintenance et le suivi, c'est beaucoup plus sain
Bonsoir,

Désolé en déplacement. Je viens de prendre connaissance de ton fichier à l'instant mille merci d'avoir recodé mon fichier et fourni les explications qui vont avec. Je vais pouvoir progresser et puis je mesure bien la différence entre mes connaissances modeste en VBA et celle d'un codeur aguerri. Encore une fois mille merci.
 

dadaze

XLDnaute Nouveau
Hello ici

en PJ une version 5: j'y ai apporté quelques modifs
1) il n'y a plus qu'UN seul combobox==> CBx_Generique
===> adieu les combo.enable, .visible en fonction de la feuille active

2) les checkBox ont été remplacées par des Options boutons
==> idem. adieu les checkbox= false, enable, visible.....
une seule option est selectionnée==> si tu cliques sur une option, les autres sont automatiquement déselectionnées==> ca lance automatiquement le remplissage du combo avec la feuille adéquate (avec une seule macro)

3)j'ai mutualisé certaines opérations: notamment "déplacerligne"
qui pour l'instant permet de déplacer une ligne de la feuille BD vers la feuille Résiliation (bouton Supprimer de BD)
mais je suppose que le bouton "vers SAF" permet de déplacer vers la feuille SAF (mais à partir de la feuille BD uniquement?? ==> dans ce cas, ce bouton ne devrait etre visible que lorsque la feuille BD est active ???)

certains boutons ne font rien encore...
va voir le code et fais nous un retour
Re bonsoir
je me reconnecte dés demain cette semaine j'aurai un peu plus de temps. En tous cas merci de consacrer de votre temps.
Bonne soirée
 

dadaze

XLDnaute Nouveau
Re bonsoir
je me reconnecte dés demain cette semaine j'aurai un peu plus de temps. En tous cas merci de consacrer de votre temps.
Bonne soirée

Re bonsoir
je me reconnecte dés demain cette semaine j'aurai un peu plus de temps. En tous cas merci de consacrer de votre temps.
Bonne soirée
j
Hello ici

en PJ une version 5: j'y ai apporté quelques modifs
1) il n'y a plus qu'UN seul combobox==> CBx_Generique
===> adieu les combo.enable, .visible en fonction de la feuille active

2) les checkBox ont été remplacées par des Options boutons
==> idem. adieu les checkbox= false, enable, visible.....
une seule option est selectionnée==> si tu cliques sur une option, les autres sont automatiquement déselectionnées==> ca lance automatiquement le remplissage du combo avec la feuille adéquate (avec une seule macro)

3)j'ai mutualisé certaines opérations: notamment "déplacerligne"
qui pour l'instant permet de déplacer une ligne de la feuille BD vers la feuille Résiliation (bouton Supprimer de BD)
mais je suppose que le bouton "vers SAF" permet de déplacer vers la feuille SAF (mais à partir de la feuille BD uniquement?? ==> dans ce cas, ce bouton ne devrait etre visible que lorsque la feuille BD est active ???)

certains boutons ne font rien encore...
va voir le code et fais nous un retour
J'ai téléchargé la dernière version c'est vraiment du grand art. Je vais prendre le temps d'étudier le contenu car à vrai dire je n'ai pas l'habitude faute de connaissances suffisantes d'utiliser un code VBA aussi élaboré. Encore une fois, Je souhaite remercier vivement tous ceux qui m'ont apporté leur aide