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

XL 2016 Erreur dans code VBA

piga25

XLDnaute Barbatruc
Bonjour,
Dans le fichier joint, en cliquant dans une cellule du tableau cela ouvre un Userform. C'est là que j'ai un problème, après avoir renseigné les 3 combobox de l'EPI concerné, le code suivant devrait normalement me renseigner les 2 label (dernière vérification) - Je n'arrive pas a afficher la ligne qui correspond au critères des 3 combobox.
VB:
Private Sub RenseignerLabels()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Dim rowNum As Long

    ' Boucle à partir de la ligne 6 jusqu'à la dernière ligne non vide de la colonne A
    For rowNum = 6 To ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
        ' Vérifie si les valeurs des cellules correspondent aux ComboBox 1, 3 et 4
        If ws.Cells(rowNum, 1).Value = Me.ComboBox1.Value And _
           ws.Cells(rowNum, 3).Value = Me.ComboBox3.Value And _
           ws.Cells(rowNum, 4).Value = Me.ComboBox4.Value Then
          
            ' Remplir Label10 avec la valeur de la colonne 11 (date de vérification)
            Me.Label10.Caption = ws.Cells(rowNum, 11).Value ' Date de vérification

            ' Remplir Label11 avec la valeur de la colonne 5 (statut)
            Me.Label11.Caption = ws.Cells(rowNum, 5).Value ' Statut

            ' Afficher le numéro de la ligne dans un label (par exemple Label12)
            'Me.Label12.Caption = "Ligne correspondante : " & rowNum

            ' Quitter la boucle une fois la ligne correspondante trouvée
            Exit For
        End If
    Next rowNum
End Sub
 

Pièces jointes

  • Registre EPI V01pour forum.xlsm
    245.9 KB · Affichages: 9
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Piga,
Je n'ai trouvé qu'une colonne "Dernière vérification" en colonne "K".
Que doit on mettre dans la seconde cellule ?
Mais pour la première, dans la macro Worksheet_SelectionChange de la page Habit, vous pouvez faire :
VB:
    ' Mise à jour de la dernière vérification
    UserForm1.Label10 = Cells(ActiveCell.Row, "K")
    
    UserForm1.Show
End Sub
 

TooFatBoy

XLDnaute Barbatruc
Prop :

VB:
Private Sub RenseignerLabels()
'
Dim ts As Range
Dim rowNum As Long

    Set ts = Range("Tableau2")

    ' Boucle sur chaque ligne du tableau
    rowNum = 0
    While rowNum < ts.ListObject.ListRows.Count

        rowNum = rowNum + 1

        ' Vérifie si les valeurs des cellules correspondantes aux ComboBox 1, 3 et 4
        If ts.Cells(rowNum, 1).Value = Me.ComboBox1.Value And _
           ts.Cells(rowNum, 3).Value = Me.ComboBox3.Value And _
           "" & ts.Cells(rowNum, 4).Value = Me.ComboBox4.Value Then

            ' Remplir Label10 avec la valeur de la colonne 11 (date de vérification)
            Me.Label10.Caption = ts.Cells(rowNum, 11).Value ' Date de vérification
            ' Remplir Label11 avec la valeur de la colonne 5 (statut)
            Me.Label11.Caption = "" & ts.Cells(rowNum, 5).Value ' Statut
            ' Afficher le numéro de la ligne dans un label (par exemple Label12)
            Me.Frame2.Label12.Caption = "Ligne n° : " & rowNum

            rowNum = ts.ListObject.ListRows.Count

        End If

    Wend

End Sub
 

Pièces jointes

  • Registre EPI V01pour forum.xlsm
    250.7 KB · Affichages: 1

piga25

XLDnaute Barbatruc
Bonjour,
J'ai réactualisé le code (msg initiale) car j'ai supprimé le label12 dans l'userform.

Sylvanu: C'est dans l'userform que j'aimerai avoir le résultat. C'est lorsque le combobox4 change que cela déclenche le code :
VB:
Private Sub ComboBox4_Change()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    ' Une fois que ComboBox1 à ComboBox4 sont remplies, renseigner les labels 10, 11 et 12
    RenseignerLabels
End Sub

TooFatBoy: Je regarde ton code.
 

piga25

XLDnaute Barbatruc
Mais est-ce qu'il correspond à ce que tu voulais ?
Oui cela correspond a ce que je voulais réaliseré.
Je l'ai même adapté dans un autre code (sauvegarde).
J'ai bien vu que le numéro de ligne était bien celui du tableau et non de la feuille.

En réalité le label12 je n'en ai pas besoin, c'est juste une info. Néanmoins je l'ai gardé au cas ou. Dans celui-ci j'ai comme résultat N° de ligne du tableau et N° de ligne de la feuille.
VB:
' Renseigner les labels pour y afficher le dernier contrôle
Private Sub RenseignerLabels()
Dim ts As Range
Dim rowNum As Long

    Set ts = Range("Tableau2")

    ' Boucle sur chaque ligne du tableau
    rowNum = 0
    While rowNum < ts.ListObject.ListRows.Count
        rowNum = rowNum + 1

        ' Vérifie si les valeurs des cellules correspondantes aux ComboBox 1, 3 et 4
        If ts.Cells(rowNum, 1).Value = Me.ComboBox1.Value And _
           ts.Cells(rowNum, 3).Value = Me.ComboBox3.Value And _
           "" & ts.Cells(rowNum, 4).Value = Me.ComboBox4.Value Then

            ' Remplir Label10 avec la valeur de la colonne 11 (date de vérification)
            Me.Label10.Caption = ts.Cells(rowNum, 11).Value ' Date de vérification
            ' Remplir Label11 avec la valeur de la colonne 5 (statut)
            Me.Label11.Caption = "" & ts.Cells(rowNum, 5).Value ' Statut
            ' Afficher le numéro de la ligne dans un label (par exemple Label12)
            Me.Frame2.Label12.Caption = "Ligne n° " & rowNum & " du tableau" + vbCrLf + "Ligne n° " & rowNum + 5 & " de la feuille"

            rowNum = ts.ListObject.ListRows.Count

        End If

    Wend

End Sub

code adapté pour la sauvegarde :
Code:
' Sauvegarde des informations des TextBox3 à TextBox5 lors du clic sur CommandButton2
Private Sub CommandButton2_Click()
    Dim ts As Range
    Dim rowNum As Long
    Dim ws As Worksheet
    'Dim currentYearCol As Integer
    'Dim currentYear As Integer
    Dim stRech As String
    Dim c As Range
    Dim Col As Integer
   
    Set ts = Range("Tableau2")

    ' Boucle sur chaque ligne du tableau
    rowNum = 0
    While rowNum < ts.ListObject.ListRows.Count
        rowNum = rowNum + 1
   
    Set ws = ActiveSheet
    stRech = Year(Date)
   
    ' Vérifie si les valeurs des cellules correspondantes aux ComboBox 1, 3 et 4
        If ts.Cells(rowNum, 1).Value = Me.ComboBox1.Value And _
           ts.Cells(rowNum, 3).Value = Me.ComboBox3.Value And _
           "" & ts.Cells(rowNum, 4).Value = Me.ComboBox4.Value Then
         
    ' Trouver la colonne de l'année courante
            If stRech <> "" Then
    'On fait la recherche dans la ligne 3 de Feuil2
            Set c = ws.Rows(3).Find(stRech, LookIn:=xlValues, LookAt:=xlWhole)
                If Not c Is Nothing Then
                    Col = c.Column
                    Set c = Nothing
                End If
            End If

    ' Sauvegarder les informations dans les colonnes correspondant à l'année
                   ts.Cells(rowNum, Col).Value = Me.TextBox3.Value ' Date de vérification
                   ts.Cells(rowNum, Col + 1).Value = Me.ComboBox5.Value ' Statut
                   ts.Cells(rowNum, Col + 2).Value = Me.ComboBox6.Value ' Vérificateur
        End If
    Wend
    CommandButton1_Click
End Sub

Merci à vous deux.
 

piga25

XLDnaute Barbatruc
Bonjour Patrick,
Trop fort, je suis très loin d'avoir ce niveau là. C'est vrai que cela est très nettement simplifié.
Si je peux me permettre, dans la combobox4, la deuxième valeur indique le n° de ligne, est-il possible d'inscrire : ligne n° .. ou alors avoir les entêtes de colonne
 

TooFatBoy

XLDnaute Barbatruc
stRech = Year(Date)
...
If stRech <> "" Then
Pourquoi faire un test sur stRech ? Il ne peut pas être vide puisque c'est l'année en cours.


D'autre part, je pense que les trois lignes de sauvegarde ne sont pas au bon endroit logiquement.

Proposition :
VB:
Private Sub CommandButton2_Click()
' Sauvegarde des informations des TextBox3 à TextBox5 lors du clic sur CommandButton2
Dim ts As Range
Dim rowNum As Long
Dim ws As Worksheet
'Dim currentYearCol As Integer
'Dim currentYear As Integer
Dim stRech As String
Dim c As Range
Dim Col As Integer

    Set ws = ActiveSheet
    Set ts = Range("Tableau2")
    stRech = Year(Date)

    ' Boucle sur chaque ligne du tableau
    rowNum = 0

    While rowNum < ts.ListObject.ListRows.Count

        rowNum = rowNum + 1

        ' Vérifie si les valeurs des cellules correspondantes aux ComboBox 1, 3 et 4
        If ts.Cells(rowNum, 1).Value = Me.ComboBox1.Value And _
           ts.Cells(rowNum, 3).Value = Me.ComboBox3.Value And _
           "" & ts.Cells(rowNum, 4).Value = Me.ComboBox4.Value Then

            ' Trouver la colonne de l'année courante dans la ligne 3 de Feuil2
            Set c = ws.Rows(3).Find(stRech, LookIn:=xlValues, LookAt:=xlWhole)
            If Not c Is Nothing Then
                Col = c.Column
                Set c = Nothing
                ' Sauvegarder les informations dans les colonnes correspondant à l'année
                ts.Cells(rowNum, Col).Value = Me.TextBox3.Value ' Date de vérification
                ts.Cells(rowNum, Col + 1).Value = Me.ComboBox5.Value ' Statut
                ts.Cells(rowNum, Col + 2).Value = Me.ComboBox6.Value ' Vérificateur
            End If

        End If

    Wend

    CommandButton1_Click

End Sub
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
alors non sur une combo ou liste dynamique on a pas les entêtes
mais on peut faire ceci
il va de soit bien entendu que l'index 0 est excepté ça ch<ange rien au trucmuche


et si vraiment ça te perturbe on peut masquer la colonne des N° de ligne carrément ça n'empêchera pas de fonctionner l'indexation
 

Pièces jointes

  • Registre EPI V01pour forum V pat .xlsm
    232.1 KB · Affichages: 2

piga25

XLDnaute Barbatruc
Re,
Oui la dernière version est mieux, plus lisible. Le n° de ligne étant dans le label11.

Pour sauvegarder les données de la nouvelle vérification j'ai ce code, mais vous connaissant vous allez encore le simplifier avec juste quelques lignes. (TooFatBoy me l'a déjà corrigé en gardant le style d'origine).

Code:
Private Sub CommandButton2_Click()
' Sauvegarde des informations des TextBox3 à TextBox5 lors du clic sur CommandButton2
Dim ts As Range
Dim rowNum As Long
Dim ws As Worksheet
'Dim currentYearCol As Integer
'Dim currentYear As Integer
Dim stRech As String
Dim c As Range
Dim Col As Integer

    Set ws = ActiveSheet
    Set ts = Range("Tableau2")
    stRech = Year(Date)

    ' Boucle sur chaque ligne du tableau
    rowNum = 0

    While rowNum < ts.ListObject.ListRows.Count

        rowNum = rowNum + 1

        ' Vérifie si les valeurs des cellules correspondantes aux ComboBox 1, 3 et 4
        If ts.Cells(rowNum, 1).Value = Me.ComboBox1.Value And _
           ts.Cells(rowNum, 3).Value = Me.ComboBox3.Value And _
           "" & ts.Cells(rowNum, 4).Value = Me.ComboBox4.Value Then

            ' Trouver la colonne de l'année courante dans la ligne 3 de Feuil2
            Set c = ws.Rows(3).Find(stRech, LookIn:=xlValues, LookAt:=xlWhole)
            If Not c Is Nothing Then
                Col = c.Column
                Set c = Nothing
                ' Sauvegarder les informations dans les colonnes correspondant à l'année
                ts.Cells(rowNum, Col).Value = Me.TextBox3.Value ' Date de vérification
                ts.Cells(rowNum, Col + 1).Value = Me.ComboBox5.Value ' Statut
                ts.Cells(rowNum, Col + 2).Value = Me.ComboBox6.Value ' Vérificateur
            End If

        End If

    Wend

    CommandButton1_Click

End Sub
 

Discussions similaires

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