IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème Listbox, mise à jour BD via textbox [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Invité
    Invité(e)
    Par défaut Problème Listbox, mise à jour BD via textbox
    Bonsoir à toutes et à tous,

    En cliquant sur une ligne d'une Listbox, je récupère les données de celle-ci dans des textboxs, où j'effectue mes modifications puis en validant avec un bouton ces données doivent être transférées sur la feuille (mise à jour des données) et la Listbox doit se mettre à jour.

    j'ai suivi la procédure pas à pas et je me suis rendu compte qu'après le transfert du 1er textbox (le textbox2) , elle saute à Private Sub ListBox1_Change() et du coup toutes mes modifications disparaissent.

    J'ai eu beau chercher le pourquoi et le comment pour résoudre le problème sans succès. D'autant plus que c'est la première fois que je travaille avec une Listbox.

    je suis parvenu à faire ce formulaire en suivant des tutos et exemples.

    la 1ere colonne représente des outils de productions, les colonnes suivantes leurs caractéristiques et la dernière colonne l’état de l'outil (en service ou hors service).

    Généralement on ne change que l’état de l'outil, c'est pour cela que j'ai mis une checkbox qui doit transmettre directement le changement sur la feuille et la Listbox doit se mettre à jour.

    En espérant que mes explications sont assez claires. Je vous remercie par avance.

    Cordialement
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonsoir Cathodique, bonsoir le forum,

    Le problème vient de l'alimentation de la ListBox1 par la méthode RowSource... C'est pour cela que je n'utilise jamais cette méthode. Son seul avantage c'est que la propriété [ColumnHeads] fonctionne. À toi de choisir la propriété [ColumnHeads] ou un code qui ne plante pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub UserForm_Initialize()
    Set F = ThisWorkbook.Worksheets("Outils")
    Set rng = F.Range("A1").CurrentRegion
    With rng
        Set rng = .Offset(1).Resize(.Rows.Count - 1)    ' Redimensionnement de la plage des données pour ne pas prendre en compte la première ligne
    End With
     
    With Me.ListBox1
        .List = rng.Value
        .ColumnCount = 13   ' Nombre de colonnes à afficher
        .ColumnWidths = "50;60;50;80;80;80;50;50;60;60;80;120;80"    ' Largeur des colonnes à affciher si 0 = invisible
    End With
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub Btn_Modif_Outil_Click()
    Dim LI As Integer
     
    If Me.TextBox1 = "" Then MsgBox "Aucun Poste sélectionné!": Exit Sub
    LI = Me.ListBox1.ListIndex + 2
     
    On Error Resume Next
    ' F.Cells(c.Row, 1) = Me.TextBox1.Value    'No Outil
    F.Cells(LI, 2) = Me.TextBox2.Value    ''site
    F.Cells(LI, 3) = Me.TextBox3.Value    'p
    F.Cells(LI, 4).Value = Me.TextBox4.Value  ' xxxxxx
    F.Cells(LI, 5).Value = Me.TextBox5.Value  'marque
    F.Cells(LI, 6).Value = Me.TextBox6.Value  'no serie
    F.Cells(LI, 7).Value = CInt(Me.TextBox7.Value)  't
    F.Cells(LI, 8).Value = CInt(Me.TextBox8)   'i
    F.Cells(LI, 9).Value = CInt(Me.TextBox9)   'année de fabrication
    F.Cells(LI, 10).Value = CInt(Me.TextBox10)   'année mise en service
    F.Cells(LI, 11).Value = Me.TextBox11.Value   'code
    F.Cells(LI, 12).Value = Me.TextBox12.Value   'observation
    F.Cells(LI, 13).Value = Me.TextBox13.Value   'etat outil
    MsgBox "Correction terminée!", vbInformation
    Unload Me
    UserForm1.Show
    End Sub

  3. #3
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour Thautheme

    As-tu essayé le truc qui consiste à supprimer le lien Rowsource avant les modifications pour le rétablir après les modifications ?
    Ca semble bien fonctionner.
    Ceci dit, je ne suis pas un spécialiste de Rowsource car je ne l'ai jamais utilisé jusqu'à maintenant dans mes programmes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Rowsource = Me.ListBox1.Rowsource
      Me.ListBox1.Rowsource = ""
     
        ' F.Cells(c.Row, 1) = Me.TextBox1.Value    'No Outil
        F.Cells(c.Row, 2) = Me.TextBox2.Value    ''site
         F.Cells(c.Row, 3) = Me.TextBox3.Value    'p
         F.Cells(c.Row, 4).Value = Me.TextBox4.Value  ' xxxxxx
         F.Cells(c.Row, 5).Value = Me.TextBox5.Value  'marque
         F.Cells(c.Row, 6).Value = Me.TextBox6.Value  'no serie
         F.Cells(c.Row, 7).Value = CInt(Me.TextBox7.Value)  't
         F.Cells(c.Row, 8).Value = CInt(Me.TextBox8)   'i
         F.Cells(c.Row, 9).Value = CInt(Me.TextBox9)   'année de fabrication
         F.Cells(c.Row, 10).Value = CInt(Me.TextBox10)   'année mise en service
         F.Cells(c.Row, 11).Value = Me.TextBox11.Value   'code
         F.Cells(c.Row, 12).Value = Me.TextBox12.Value   'observation
         F.Cells(c.Row, 13).Value = Me.TextBox13.Value   'etat outil
     
      Me.ListBox1.Rowsource = Rowsource

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour, je vous remercie beaucoup. Je teste et vous met au courant.

    En fait, mon idée initiale était l'utilisation d'une listview puis je me suis tourné vers une listbox et ce, par rapport à ce que j'ai pu lire sur la listview.

    Il parait qu'elle n'est pas fiable pour des raisons de compatibilité entre les différentes versions d'excel et dépend aussi du système d'exploitation.

    J'ai pu constaté que les fichiers exemples que j'ai pu trouver sur le forum et ailleurs plantaient. J'ai eu des messages d'erreur et dans l'userform on ne retrouve plus la listview.

    Encore merci. Bonne journée!
    Images attachées Images attachées    

  5. #5
    Invité
    Invité(e)
    Par défaut
    Re,
    @Tauthemene, en effet avec ton code ça fonctionne bien, merci beaucoup.

    @Docmarti, Merci mais comment dois-je déclarer RowSource, car j'ai un message:"Erreur de compilation: Variable non définie."

    Les 2 solutions m'intéresse pour en apprendre un peu plus. En vous remerciant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Private Sub Btn_Modif_Outil_Click()
    Dim c As Range
    If Me.TextBox1 = "" Then MsgBox "Aucun outil sélectionné!": Exit Sub
    '
    RowSource = Me.ListBox1.RowSource
      Me.ListBox1.RowSource = ""
     
        ' F.Cells(c.Row, 1) = Me.TextBox1.Value    'No Outil
        F.Cells(c.Row, 2) = Me.TextBox2.Value    ''site
         F.Cells(c.Row, 3) = Me.TextBox3.Value    'p
         F.Cells(c.Row, 4).Value = Me.TextBox4.Value  ' xxxxxx
         F.Cells(c.Row, 5).Value = Me.TextBox5.Value  'marque
         F.Cells(c.Row, 6).Value = Me.TextBox6.Value  'no serie
         F.Cells(c.Row, 7).Value = CInt(Me.TextBox7.Value)  't
         F.Cells(c.Row, 8).Value = CInt(Me.TextBox8)   'i
         F.Cells(c.Row, 9).Value = CInt(Me.TextBox9)   'année de fabrication
         F.Cells(c.Row, 10).Value = CInt(Me.TextBox10)   'année mise en service
         F.Cells(c.Row, 11).Value = Me.TextBox11.Value   'code
         F.Cells(c.Row, 12).Value = Me.TextBox12.Value   'observation
         F.Cells(c.Row, 13).Value = Me.TextBox13.Value   'etat outil
     
      Me.ListBox1.RowSource = RowSource
     
    MsgBox "Correction terminée!", vbInformation
    End Sub

  6. #6
    Invité
    Invité(e)
    Par défaut
    Re,

    Désolé, juste une question qui n'est pas en rapport avec mon sujet.

    Comment avez-vous inséré du texte au bas de votre message. je doute bien que ça se trouve dans mon profil mais où exactement?

    C'est pour ne pas faire de bêtise, merci.

    Bonne journée

  7. #7
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour le fil, bonjour le forum,

    Je me permets de répondre à la place de Docmarti. À mon avis c'est le nom de la variable Rowsource qui pose problème. Essaie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim RS As String
    RS = ListBox1.RowSource
    Pour le texte en bas, c'est dans Tableau de Bord / Modifier la Signature...

  8. #8
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par cathodique Voir le message
    Re,

    @Docmarti, Merci mais comment dois-je déclarer RowSource, car j'ai un message:"Erreur de compilation: Variable non définie."
    C'est parce que tu as mis la commande
    en tête du code de ce module.
    Lorsque Option Explicit apparaît dans un module, on doit déclarer explicitement toutes les variables à l'aide des instructions Dim ou ReDim.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Rowsource As String
    Le but de Option Explicit est de supprimer le risque de mal orthographier le nom des variables.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je vous remercie beaucoup pour votre aide. Voilà, j'ai refait un autre fichier que je joins, ça pourrait servir.

    J'ai créé une plage dynamique BD_Outil=DECALER(outil!$A$1;1;0;NBVAL(outil!$A:$A)-1;NBVAL(outil!$1:$1)) et j'ai renseigné les propriétés suivantes de la ListBox:
    • ColumnCount=13
    • ColumnWidhts=50;60;50;80;80;80;50;50;60;60;80;120;80
    • RowSource=BD_Outil

    On n'a plus besoin d'initialiser l'userform. En suivant vos conseils, je suis parvenu à le faire fonctionner.

    Pour le partage,voici le code et le fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Option Explicit
    Dim F As Worksheet, rng As Range
    Private Sub Btn_Modif_Outil_Click()
    Dim c As Range, RS As String
    Set F = ThisWorkbook.Worksheets("Outil")
     
    If Me.TextBox1 = "" Then MsgBox "Aucun Poste sélectionné!": Exit Sub
     
    RS = Me.ListBox1.rowsource
      Me.ListBox1.rowsource = ""
     Set c = F.[A:A].Find(Me.TextBox1, LookIn:=xlValues)
     
     If Not c Is Nothing Then
    On Error Resume Next
        ' F.Cells(c.Row, 1) = Me.TextBox1.Value    'No Outil
        F.Cells(c.Row, 2) = Me.TextBox2.Value    ''site
         F.Cells(c.Row, 3) = Me.TextBox3.Value    'p
         F.Cells(c.Row, 4).Value = Me.TextBox4.Value  ' xxxxxx
         F.Cells(c.Row, 5).Value = Me.TextBox5.Value  'marque
         F.Cells(c.Row, 6).Value = Me.TextBox6.Value  'no serie
         F.Cells(c.Row, 7).Value = CInt(Me.TextBox7.Value)  't
         F.Cells(c.Row, 8).Value = CInt(Me.TextBox8)   'i
         F.Cells(c.Row, 9).Value = CInt(Me.TextBox9)   'année de fabrication
         F.Cells(c.Row, 10).Value = CInt(Me.TextBox10)   'année mise en service
         F.Cells(c.Row, 11).Value = Me.TextBox11.Value   'code
         F.Cells(c.Row, 12).Value = Me.TextBox12.Value   'observation
         F.Cells(c.Row, 13).Value = Me.TextBox13.Value   'etat outil
     
      Me.ListBox1.rowsource = RS
      End If
     
    MsgBox "Correction terminée!", vbInformation
     
    End Sub
     
    Private Sub Btn_Ajout_Outil_Click()
    Dim i As Byte
    For i = 1 To 13
    Me.Controls("textbox" & i) = ""
    Next
    End Sub
     
    Private Sub Btn_Quitter_Click()
    Unload Me
    End Sub
    '
    Private Sub ListBox1_Change()
        Dim n As Integer
        If ListBox1.ListCount <= 1 Or ListBox1.ListIndex < 0 Then
            Exit Sub
        End If
        For n = 0 To 12
            Controls("TextBox" & n + 1) = ListBox1.List(ListBox1.ListIndex, n)
        Next
    End Sub
    Encore merci à vous deux.
    Fichiers attachés Fichiers attachés

  10. #10
    Invité
    Invité(e)
    Par défaut
    le problème venait de Private Sub ListBox1_Change()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Option Explicit
    Dim F As Worksheet, rng As Range
    Dim StopEvent As Boolean
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Private Sub Btn_Modif_Outil_Click()
    Dim c As Range
    If Me.TextBox1 = "" Then MsgBox "Aucun Poste sélectionné!": Exit Sub
    Set c = F.[A:A].Find(Me.TextBox1, LookIn:=xlValues)
    If Not c Is Nothing Then
        On Error Resume Next
        StopEvent = True
        ' F.Cells(c.Row, 1) = Me.TextBox1.Value    'No Outil
        F.Cells(c.Row, 2) = Me.TextBox2.Value    ''site
        F.Cells(c.Row, 3) = Me.TextBox3.Value    'p
        F.Cells(c.Row, 4).Value = Me.TextBox4.Value  ' xxxxxx
        F.Cells(c.Row, 5).Value = Me.TextBox5.Value  'marque
        F.Cells(c.Row, 6).Value = Me.TextBox6.Value  'no serie
        F.Cells(c.Row, 7).Value = CInt(Me.TextBox7.Value)  't
        F.Cells(c.Row, 8).Value = CInt(Me.TextBox8)   'i
        F.Cells(c.Row, 9).Value = CInt(Me.TextBox9)   'année de fabrication
        F.Cells(c.Row, 10).Value = CInt(Me.TextBox10)   'année mise en service
        F.Cells(c.Row, 11).Value = Me.TextBox11.Value   'code
        F.Cells(c.Row, 12).Value = Me.TextBox12.Value   'observation
        F.Cells(c.Row, 13).Value = Me.TextBox13.Value   'etat outil
        '----------------------------------------
    End If
    StopEvent = false
    MsgBox "Correction terminée!", vbInformation
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Private Sub ListBox1_Change()
    If StopEvent = True Then Exit Sub

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour Rdurupt et un grand bravo, c'est impeccable.

  12. #12
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour rdurupt

    EDIT: Il n'y a rien à dire. Ta solution est parfaitement fonctionnelle.

    La solution du ListBox1.RowSource = ""
    donne le même résultat et présente certains avantages :

    - Elle ne déclenche pas l'événement ListBox1_Change
    - Elle est 10 fois plus rapide.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Private Sub Btn_Modif_Outil_Click()
    Dim c As Range
    If Me.TextBox1 = "" Then MsgBox "Aucun Poste sélectionné!": Exit Sub
     
    Dim rs As String
    rs = ListBox1.RowSource
     
    Dim ListBox1_Listindex As Long
    ListBox1_Listindex = ListBox1.Listindex
     
    Set c = F.[A:A].Find(Me.TextBox1, LookIn:=xlValues)
     
      If Not c Is Nothing Then
    On Error Resume Next
     
     
    ListBox1.RowSource = ""
     
        ' F.Cells(c.Row, 1) = Me.TextBox1.Value    'No Outil
        F.Cells(c.Row, 2) = Me.TextBox2.Value    ''site
         F.Cells(c.Row, 3) = Me.TextBox3.Value    'p
         F.Cells(c.Row, 4).Value = Me.TextBox4.Value  ' xxxxxx
         F.Cells(c.Row, 5).Value = Me.TextBox5.Value  'marque
         F.Cells(c.Row, 6).Value = Me.TextBox6.Value  'no serie
         F.Cells(c.Row, 7).Value = CInt(Me.TextBox7.Value)  't
         F.Cells(c.Row, 8).Value = CInt(Me.TextBox8)   'i
         F.Cells(c.Row, 9).Value = CInt(Me.TextBox9)   'année de fabrication
         F.Cells(c.Row, 10).Value = CInt(Me.TextBox10)   'année mise en service
         F.Cells(c.Row, 11).Value = Me.TextBox11.Value   'code
         F.Cells(c.Row, 12).Value = Me.TextBox12.Value   'observation
         F.Cells(c.Row, 13).Value = Me.TextBox13.Value   'etat outil
     
        ' ListBox1_Change
     
    '----------------------------------------
    End If
       ListBox1.RowSource = rs
     
       ListBox1.Listindex = ListBox1_Listindex
     
    MsgBox "Correction terminée!", vbInformation
     
    End Sub

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonsoir Rdurupt, Bonsoir Docmarti, Bonsoir Le Forum,

    Milles mercis, tu m'as considérablement améliorer le code de mon petit projet.

    ça s'exécute très bien et rapidement, merci beaucoup.

    Mais mon petit projet ne s'arrête pas là. Je voudrais mettre une checkbox pour modifier l'état de outils (en service ou hors-service).

    Le fait de cliquer sur la checkbox doit se répercuter sur la textbox13 et la mise à jour de la BD.

    Pour l'ajout d'un nouvel outil, j'envisage de mettre un bouton pour vider les textboxs (bloquer textbox13(etat) qui ne peut se faire si l'outil est inexistant dans la BD.

    Si ça coince, j'ouvrirai un autre fil.

    Encore merci et très bonne soirée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Problème de mise à jour d'une textbox en fonction de la valeur d'une combobox
    Par benadry dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/06/2014, 10h22
  2. Réponses: 3
    Dernier message: 11/01/2013, 14h28
  3. Réponses: 3
    Dernier message: 15/09/2008, 08h32
  4. problème de mise à jour via un trigger
    Par clement42 dans le forum Sybase
    Réponses: 4
    Dernier message: 17/01/2007, 10h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo