Besoin d'aide pour une boucle VBA

Thomas_Abitbol

XLDnaute Nouveau
Bonjour à tous,

Ceci est très important pour moi et c'est pour cela que je me tourne vers vous après plusieurs heures de travail. J'arrive à une des dernières étapes qui est vraiment cruciale pour moi puisque cela va me permettre de terminer mon projet de 2eme année de BTS.

Voici mon problème : j'ai effectué une boucle (je ne suis pas expert en VBA) mais celle-ci m'informe un bug dont je ne comprends pas.

Private Sub UserForm_Activate()

Dim x As Integer

x = 2
While Worksheets("BaseMaintenance").Cells(x, 1) <> ""
If ListBox2.List(ListBox2.ListIndex) = Worksheets("BaseMaintenance").Cells(x, 1) Then
Sheets("EnregistrerMaintenance").Label13.Caption = Worksheets("BaseMaintenance").Cells(x, 4)
Sheets("EnregistrerMaintenance").Label12.Caption = Worksheets("BaseMaintenance").Cells(x, 5)
Sheets("EnregistrerMaintenance").Label11.Caption = Worksheets("BaseMaintenance").Cells(x, 6)
End If
x = x + 1
Wend
End Sub

En attendant vos réactions, à bientôt !
Thomas
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Besoin d'aide pour une boucle VBA

Bonjour Thomas, bonjour le forum,

Sans le fichier qui va avec, difficile de t'aider... Je trouve bizarre ce code à l'Activation de l'UserForm
Peut-ête comme ça :
Code:
Private Sub UserForm_Activate()
Dim bm As Object 'déclare la variable bm (onglet BaseMaintenance)
Dim em As Object 'déclare la variable bm (onglet EnregistrerMaintenance)
Dim cel As Range 'déclare la variable cel (CEllule)

Set bm = Worksheets("BaseMaintenance") 'définit l'onglet bm
Set em = Sheets("EnregistrerMaintenance") 'définit l'onglet em
'boucle sur toutes les cellules éditées cel de la colonne A de l'onglet bm
For Each cel In bm.Range("A2:A" & bm.Cells(Application.Rows.Count, 1).End(xlUp).Row)
    With Me.ListBox2 'prend en compte la ListBox2
        If .List(.ListIndex) = cel.Value Then 'condition : si la valeur de la ListBox2 est égale à la valeur de la cellule cel
            em.Label13.Caption = cel.Offset(0, 3).Value 'le label13 de l'onglet em prend la valeur de la cellule cel décalée de 3 colonnes
            em.Label12.Caption = cel.Offset(0, 4).Value 'le label12 de l'onglet em prend la valeur de la cellule cel décalée de 4 colonnes
            em.Label11.Caption = cel.Offset(0, 5).Value 'le label11 de l'onglet em prend la valeur de la cellule cel décalée de 5 colonnes
        End If 'fin de la condition
    End With 'fin de la prise en compte de la ListBox2
Next cel 'prochaine cellule de la boucle
End Sub
 

Paf

XLDnaute Barbatruc
Re : Besoin d'aide pour une boucle VBA

bonjour à tous

que dit le message d'erreur?

si ListBox2 se trouve sur la Userform qu'on active, on n'a rien sélectionné dans la liste et donc ListBox2.ListIndex vaut -1 et ListBox2.List(-1) ne peut être évalué.

Si ListBox2 se trouve sur une autre Userform, il faudrait préciser: AutreUserform.ListBox2...

A+
 

Thomas_Abitbol

XLDnaute Nouveau
Re : Besoin d'aide pour une boucle VBA

Salut à tous !

Tout d'abord merci pour votre aide qui m'est si utile, et désolé pour le retard de ma réponse je suis fort occupé ces derniers temps avec ces exams...

Je vais essayer ça Paf, je suis vraiment stupide sur VBA je fais des erreurs de débutant...
Robert je te remercie beaucoup aussi pour temps passé et la recherche effectuée c'est vraiment gentil !

A bientôt,
Thomas
 

Thomas_Abitbol

XLDnaute Nouveau
Re : Besoin d'aide pour une boucle VBA

Re tout le monde,

Bon et bien je n'arrive toujours pas, comme l'a dit Robert c'est plus simple avec le fichier donc il est en pièce jointe.

J'explique ce que je veux obtenir :
Etant donné que ce fichier est une partie d'un outil d'aide pour les PME PMI, lorsque l'utilisateur selectionne un équipement dans la liste gauche du menu, il voit les opérations de maintenances et vérifications périodiques qui lui sont affectées. Lorsque l'on clic double sur une opération une fenêtre s'ouvre afin d'enregistrer une date d'affectation de l'opération et dans cette fenêtre on peut visualiser les listbox qui posent problème. Ces listbox doivent permettre à l'utilisateur de visualiser à quelle date fut effectuée la dernière opération et à quelle date il doit la refaire. C'est pour cela que j'ai fais ma commande lorsque l'userform s'initialise.
Afin de faire un test j'avais au préalable effectué l'opération sur l'équipement Tronçonneuse OPTICUT S90 et double clik sur nattes de filtres.

Le userfom ou se trouve la listbox se nomme "Menuprincipal", la userfom ou se trouve les label 'EnregistrerMaintenance" et l'onglet excel ou la recherche est effectuée est l'onglet "BaseMaintenance".

Voila voila, j'espère être assez compréhensible, en espérant que vous me sortez de cette galère.

merci !
Thomas
 

Pièces jointes

  • Outil de planification de la maintenance.xlsm
    139.2 KB · Affichages: 53
C

Compte Supprimé 979

Guest
Re : Besoin d'aide pour une boucle VBA

Salut Thomas

1) remplacer dans ton USF "EnregistrerMaintenance" -> "Private Sub UserForm_Activate()"
la ligne
Code:
If Menuprincipal.ListBox2.List(ListBox2.ListIndex)
par
Code:
If Menuprincipal.ListBox2.List(Menuprincipal.ListBox2.ListIndex)

Le plus simple serait de définir une variable public dans un module

Ensuite pour trouver la dernière intervention pour un outillage, je ferais un filtrage dans la feuille "BaseMaintenance"
avec les 2 colonnes A et B, si une ligne existe, c'est la dernière intervention

En tout cas sacré beau boulot ;-)

A+
 

Thomas_Abitbol

XLDnaute Nouveau
Re : Besoin d'aide pour une boucle VBA

Salut Bruno,

D'accord merci pour cette indication je vais le faire de suite.
Et merci aussi pour le boulot que j'ai pu faire jusqu'à présent, je suis pas trop déçus de moi étant donné que je suis encore novice en VBA.

A bientôt !

Thomas
 
C

Compte Supprimé 979

Guest
Re : Besoin d'aide pour une boucle VBA

Re,

Plusieurs petites choses, si je puis me permettre ;)

1) Dans tes USF mieux vaut utiliser l'évènement Initialise que Activate (tu auras des surprises)
2) Utiliser des variables explicites "x" pour un numéro de ligne c'est bof
3) Attention à la déclaration du type de variable, pour les lignes il faut déclarée en Long
Code:
Private Sub UserForm_Initialize()
  Dim DLig As Long, Lig As Long
  ' Effacer le contenu de la Listbox
  ListBox1.Clear
  ' Avec la feuille Equipements
  With Worksheets("Equipements")
    ' Récupérer le numéro de la dernière ligne occupée
    DLig = .Range("B" & Rows.Count).End(xlUp).Row
    ' Pour chaque ligne l'ajouter à la ListBox
    For Lig = 3 To DLig
      Me.ListBox1.AddItem .Cells(Lig, 7)
    Next Lig
  End With
  'If x = 3 Then
  '   MsgBox ("Il n'y a pas d'enregistrements")
  '  Else
  ' MsgBox ("Il y a " & x - 3 & "enregistrement(s)")
  'End If
End Sub

Code pour ton UsF "EnregistrerMaintenance"
Code:
Private Sub UserForm_Initialize()

  Dim sEquipement As String, sOrgane As String, LigF As Long
  ' Récupérer les valeurs à filtrer
  sEquipement = Menuprincipal.ListBox1.List(Menuprincipal.ListBox1.ListIndex)
  sOrgane = Menuprincipal.ListBox2.List(Menuprincipal.ListBox2.ListIndex)
  ' Effectuer le filtrage de la feuille BaseMaintenance
  With Sheets("BaseMaintenance")
    With .Range("A1:F1")
      .AutoFilter
      .AutoFilter Field:=1, Criteria1:=sEquipement
      .AutoFilter Field:=2, Criteria1:=sOrgane
    End With
    ' Trouver le numéro de la dernière ligne visible
    LigF = .Range("A" & Rows.Count).End(xlUp).Row
    ' Si le numéro de la ligne est supérieur à celui de l'entète
    If LigF > 1 Then
      Me.Label13.Caption = .Cells(LigF, 4)
      Me.Label12.Caption = .Cells(LigF, 5)
      Me.Label11.Caption = .Cells(LigF, 6)
    Else
      Me.Label13.Caption = "": Me.Label12.Caption = "": Me.Label11.Caption = ""
    End If
    .ShowAllData
  End With
End Sub

A+
 
Dernière modification par un modérateur:

Thomas_Abitbol

XLDnaute Nouveau
Re : Besoin d'aide pour une boucle VBA

Re,

merci pour les codes que tu as tapé, je viens de les intégrer à mon fichier excel mais cela ne fonctionne toujours pas et me fais un nouveau bug. Je ne comprends pas très bien pourquoi tu utilises la texbox1 du Menuprincipal dans le code ?

Merci
 
C

Compte Supprimé 979

Guest
Re : Besoin d'aide pour une boucle VBA

Re,

La Listbox1 de ton MenuPrincipal contient la valeur de l'équipement sélectionné

En testant, je me suis apperçu du pourquoi du comment de l'utilisation de "Activate"
Tu peux régler le problème comme dans le fichier joint

1) Dans l'UsF MenuPrincipal, supprimer la Sub Private Sub ListBox2_Click() avec son contenu
2) Dans l'USF EnregistrerMaintenance, voici la sub à mettre
Etant donné que ton UsF MenuPrincipal est masqué (.Hide) et pas déchargé (Unload)
Code:
Private Sub UserForm_Initialize()

  Dim sEquipement As String, sOrgane As String, LigF As Long
  ' Inscrire les valeur de l'USF MenuPrincipal
  With Menuprincipal
    Me.Label2.Caption = .ListBox1.List(.ListBox1.ListIndex)
    Me.Label4.Caption = .ListBox2.List(.ListBox2.ListIndex, 0)
    Me.Label6.Caption = .ListBox2.List(.ListBox2.ListIndex, 1)
    Me.TextBox2.Value = .ListBox2.List(.ListBox2.ListIndex, 2)
  End With
  ' Récupérer les valeurs à filtrer dans l'Userform parent
  sEquipement = Me.Label2.Caption: sOrgane = Me.Label4.Caption
  ' Effectuer le filtrage de la feuille BaseMaintenance
  With Sheets("BaseMaintenance")
    With .Range("A1:F1")
      .AutoFilter
      .AutoFilter Field:=1, Criteria1:=sEquipement
      .AutoFilter Field:=2, Criteria1:=sOrgane
    End With
    ' Trouver le numéro de la dernière ligne visible
    LigF = .Range("A" & Rows.Count).End(xlUp).Row
    ' Si le numéro de la ligne est supérieur à celui de l'entète
    If LigF > 1 Then
      Me.Label13.Caption = .Cells(LigF, 4)
      Me.Label12.Caption = .Cells(LigF, 5)
      Me.Label11.Caption = .Cells(LigF, 6)
    Else
      Me.Label13.Caption = "": Me.Label12.Caption = "": Me.Label11.Caption = ""
    End If
    .ShowAllData
  End With
End Sub


J'espère que tu comprendras

A+
 

Pièces jointes

  • Outil de planification de la maintenance vBM45.xlsm
    148 KB · Affichages: 38

Discussions similaires

Réponses
12
Affichages
577
Réponses
10
Affichages
681

Statistiques des forums

Discussions
312 493
Messages
2 088 955
Membres
103 989
dernier inscrit
jralonso