Modification d'un champ d'un formulaire (issu d'une LD en cascade)

Bonsoir à tous,

Je suis presque (...je crois) au bout de mes peines pour mon UF. Même s'il y a d'autres approches possibles visiblement j'ai pris le parti pour le moment de créer:

-un formulaire de saisie avec des listes déroulantes classiques et d'autres en cascade.

-un formulaire de modification qui va chercher la ligne à modifier dans BDD

La saisie fonctionne très bien, la sélection de la ligne à modifier est bien récupérée dans le UF Modification, la modification des champs par les LD classiques ("Type", "Motif") fonctionne bien MAIS la modification des LD en cascade (ex: le choix de la "Direction" détermine la LD suivante "Bureau") ne fonctionne pas.

Private Sub McboDirection_Change()

'frmModification.McboBureau.Clear
i = 2
Sheets("Parambudget").Activate
Do While Cells(1, i).Value <> ""
    If Cells(1, i).Value = McboDirection.Value Then
    Cells(1, i).Select
    Colonne = ActiveCell.Column
        End If
i = i + 1
Loop
        j = 2
        Do While Cells(j, Colonne).Value <> ""
        frmModification.McboBureau.AddItem Cells(j, Colonne)
                j = j + 1
        Loop
        'cboBureau.ListIndex = 0 pour faire apparaître ou non le premier champ de la liste
End Sub

Je ne comprends pas c'est le même type de code que dans le formulaire de saisie (qui fonctionne très bien) adapté pour la modification mais je ne parviens à obtenir les champs des listes déroulantes.

Est-ce que vous pouvez m'aider s'il vous plaît je tourne en rond?

Merci bien!

Bonjour Sylvain24

Voici le fichier "remasterisé", je ne pouvais le laisser ainsi

- Tous les différents paramètres ont été regroupés dans la feuille "Params" dans des TS (Tableau Structuré)
- Un seul et unique USF pour tout faire
- Une variable public "TypeSaisie" pour définir si c'est une nouvelle saisie ou une modification
- L'utilisation de ListObject puisque tu as des TS

J'espère que ces modifications t'aideront à mieux comprendre

A+

Oui, Ajout Modification Suppression même combat et même formulaire.

La seule chose qui diffère c'est qu'on lit ou qu'on écrit (donc le N° de ligne).

Ce N° de ligne est défini soit par recherche ou par paramètre dans le cas de modification ou de suppression, soit par comptage du nombre d'enregistrements si c'est un ajout on ajoute une ligne...

Mais pour le chargement des Combo et ListBox c'est identique. que ce soit en ajout ou modif...

A+

Bonsoir BrunoM45,

C'est "Bô" et concis. Merci beaucoup.

Mais je voudrais te poser une question...philosophique quand même si tu veux bien et pas technique pour une fois.

Le code que j'avais commencé certes beaucoup plus poussif que le tien m'a été inspiré par ce que j'ai pu lire ou voir par ailleurs (et par des auteurs qui semblaient "toucher leur bille" en VBA.

Bref ma question est simple est-ce que "mon" code ne correspond pas au standard du VBA ou est-ce une autre approche que la tienne (...plus lourde certes)?

Je vais décrypter avec attention ton travail.

En tout cas merci beaucoup pour le temps passé sur ce bel outil.

Merci à Galopin01 pour sa contribution.

Bonne soirée!

Bonsoir à tous,

Je ne comprends pas comment le code ci-dessous peut permettre de charger la deuxième liste déroulante (en colonne) à partir du choix fait dans la première LD (en ligne)

'pour liste déroulante2 Catégorie/Grade
Private Sub cboCategorie_change()
  Dim Cel As Range, Choix As String
  Choix = Me.CboCategorie.Value
  ' Effacer la Cbo
  Me.cboGrade.Clear
  ' Ajouter les items
  For Each Cel In Sheets("Params").Range("TabCat[" & Choix & "]")
    If Cel.Value <> "" Then Me.cboGrade.AddItem Cel
  Next Cel
End Sub

...et notamment la partie:

Range("TabCat[" & Choix & "]")
Quelqu'un peut-il me le décrypter car malgré mes recherches je n'ai pas trouvé?
Merci bien.

Bonsoir Sylvain24

En fait dans la feuille "Params" tu as un TS (Tableau Structuré) nommé "TabCat"

Lorsque qu'on veut définir une colonne de ce TS, on l'appelle avec par exemple

Range("TabCat[A]")
image

Donc il suffit de l'utiliser en concaténant le choix dans la 1ère liste qui est le choix de la catégorie en ligne

 For Each Cel In Sheets("Params").Range("TabCat[" & Choix & "]")

Il faut le lire ainsi : pour chaque cellule de la plage TabCat[x]

J'espère que ce sera plus clair

A+

Bonjour BrunoM45,

C'est clair merci bien. Je voyais bien que vba trouvait bien la bonne colonne (sans les & cela ne fonctionnait pas) bref ce sont "simplement" les & qui me perturbent un peu, mais visiblement c'est la syntaxe.

Bref je continue à travailler sur le code que tu as bien voulu rédiger et donc à me "convertir" aux tableaux structurés... J'ai un petit problème de compréhension sur le Type saisie="MODIFICATION" de ton code mais j'y gratte encore un peu avant de t'embêter éventuellement.

En tout cas merci.

Salut

Le "&" sert à concaténer du contenu alphanumérique : "MACHIN" & "TRUC" = "MACHINTRUC"

Sinon pour la variable publique "TypeSaisie", comme on n'utilise qu'un seul USF il faut définir dans quelle situation on se trouve à son ouverture.

J'utilise donc cette variable dans laquelle je peux mettre l'état MODICATION qui indique que tu n'es pas sur un nouvel enregistrement 😉

A+

Je connais bien la syntaxe de concaténation dans Excel avec &, mais c'était le fait de voir "choix" encadré par les deux &:

" & Choix & "

...qui n'est pas intuitif pour dire que c'est la colonne correspondante. Bref c'est la syntaxe.

Pour le Type saisie, je comprends mieux avec ta précision et je vais essayer de bien piger l'articulation du code du bouton "BtnEnreg" autour du TypeSaisie selon qu'on arrive à l'initialisation du formulaire ou par le clic sur une ligne de BDD...

En tout cas merci et bonne soirée.

Rechercher des sujets similaires à "modification champ formulaire issu cascade"