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

XL 2016 Formulaire - listbox modifier une base de données > 10 colonnes

El gato

XLDnaute Nouveau
Bonjour,

Après plus d'une semaine à plancher sur le projet (je débute en VBA...), je pensais avoir trouvé la solution parfaite pour mon formulaire, jusqu'à ce que je découvre qu'une listbox ne peut contenir que 10 colonnes ! Or ma base de données en contient 59....

Ce que je souhaite :
- Au click sur une ligne de la Listbox, les données de la base correspondant apparaissent dans les textbox et combobox
- Je n'ai pas besoin de visualiser la totalité des colonnes de la base de données dans la listbox, seulement les 9 premières. La listbox n'est là que pour aider l'utilisateur à choisir la bonne ligne de données
- Après d'éventuelles modifications des champs, un click sur le bouton "mettre à jour" remplace les données renseignées dans le formulaire dans la base

Mon problème :
- Ça fonctionne pour les premières colonnes (jusqu'à 10 donc), mais après impossible. Y'a-t-il un moyen de contourner le problème ? Ou dois-je modifier tout le code ?


Je sais que mon code est lourd, mais c'est la première fois que je travaille sur VBA je n'ai pas encore les bons réflexes

Merci pour votre aide


Je ne peux partager la base de données, mais j'ai créé un fichier identique :
 

Pièces jointes

  • ExempleVBA.xlsm
    48.1 KB · Affichages: 27
Dernière édition:

jcf6464

XLDnaute Impliqué
Bonsoir El Gato et le forum

une approche avec le fichier joint l'un ou l'autre

bonne continuation
 

Pièces jointes

  • Copie de Commande SAPY-V4.xlsm
    58.6 KB · Affichages: 17
  • FormChoixColonneRechercheComboFiche.xlsm
    130.9 KB · Affichages: 19
Dernière édition:

El gato

XLDnaute Nouveau
Bonsoir,

J'avais l'impression que le fichier fonctionnait mais après plusieurs tests je rencontre un problème :

- le code marche bien lorsque je sélectionne une ligne dans la listbox sans avoir utilisé la recherche intuitive.
- si je cherche une ligne avec la recherche intuitive, la modification de la base de données à lieu systématiquement sur ma première ligne de données ... puisque c'est devenu la première ligne de la listbox ?
--> comment faire en sorte qu'au click pour mettre à jour la base de données, la modification se fasse sur la bonne ligne ?

Dim NumLigne As Integer
NumLigne = formulaireModifierAO2.ListBox1.ListIndex + 3 ' ma base de donnée débute en ligne 3, la ligne 2 étant les en-têtes
If MsgBox("Confirmer la mise à jour ?", vbYesNo, "confirmation") = vbYes Then
Sheets("Feuil1").Cells(NumLigne, 2) = formulaireModifierAO2.txtGC
Sheets("Feuil1").Cells(NumLigne, 58) = formulaireModifierAO2.cboLead
Sheets("Feuil1").Cells(NumLigne, 1) = formulaireModifierAO2.cboResp
.....


Merci pour votre aide !
 

Pièces jointes

  • ExempleVBA2.xlsm
    182.7 KB · Affichages: 23

cp4

XLDnaute Barbatruc
Bonjour El gato,

ton code fonctionne bien. la numérotation d'une listbox commence à zéro (0).

tu as 2 lignes avant la ligne d’entêtes (ligne 3).
si tu veux corriger la 1ère ligne de la listbox (index=0) cette ligne est en ligne 4 sur la feuille.
donc NumLigne = 0 + 3 ----> correspond à ligne 3
 

El gato

XLDnaute Nouveau

Bonjour cp4,

Merci pour votre réponse, mais mon problème persiste ... en fait lorsque je cherche une ligne particulière sur ma listbox à l'aide de la textbox1, par exemple "TEST 234", cette ligne correspond à la ligne 236 dans la base de données mais à la ligne 1 dans la listebox. Si je clique sur modifier, c'est donc la première ligne du tableau qui sera modifiée.

J'ai besoin d'établir une correspondance entre la ligne sélectionnée dans la liste box et la ligne qui lui correspond dans ma base de données. J'ai tenté :

Dim NumLigne As Long
NumLigne = ActiveSheet.Cells.Find(Sheets(1).ListBox1.Value, Range("A3"), xlValues).Row

Mais vba me renvoie une "erreur d'exécution 438" ...
 

cp4

XLDnaute Barbatruc
Je crois que tu te noies dans un verre d'eau. Ton premier code est bon.
Si tu mets ce bout de code dans la partie du bouton
VB:
MsgBox Me.ListBox1.ListIndex
Tu obtiendras la position dans la listbox. Dans ton cas les lignes de ta feuille sont chargées dans listbox telles quelles, elles sont dans le même ordre. il te suffit de remettre ton précédent code.
Code:
NumLigne = formulaireModifierAO2.ListBox1.ListIndex + 3
Etant donné que sur ta feuille, tu as la première ligne vide, en seconde ligne les entetes, ce qui fait 2 lignes.
Mais la numérotation dans une listbox commence à zéro, il faut ajouter 1 pour faire les correspondances. D'où le +3.

exemple pour TEST 234 --->ListIndex renvoie 233 ---> sur la feuille 236 ---> donc 233+3=236

edit: si tu n'es pas convaincu, en retour ton fichier avec Ton idée FIND.
 

Pièces jointes

  • ExempleVBA2_ retour.xlsm
    186.4 KB · Affichages: 48
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour a tous
juste en passant
je vais jouer les trouble fait
A oui!!!???? et depuis quand ??
VB:
Private Sub UserForm_Initialize()
    Dim O As Worksheet, Dl&, plage As Range, C&, W$
    Set O = Sheets("Feuil1")    'définit l'onglet O
    Dl = O.Cells(Rows.Count, 1).End(xlUp).Row
    Set plage = O.Range("A3:bg" & Dl)
    For C = 1 To plage.Columns.Count: W = W & " " & Int(O.Cells(1, C).Width) + 1: Next
    W = Replace(Trim(W), " ", ";")
    With ListBox1
        .ColumnCount = plage.Columns.Count
        .ColumnWidths = W
        .List = plage.Value
    End With
End Sub


juste pour info quand on cherche on trouve

je peux même ajouter qu'avec simplement le moteur de recherche GOOGLE tu aurais trouvé la même


bon d'accords je sort
 
Dernière édition:
Réactions: cp4

Discussions similaires

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