Demande explication code VBA

milianaise

XLDnaute Nouveau
Bonjour,

J'ai trouvé un fichier sur Internet (sur ce site je crois) avec un bout de code qui m'intéresse. Je sais à quoi il sert mais je n'ai pas envie de l'utiliser sans le comprendre.

Quelqu'un pourrait éclairer mes lanternes svp ?

Option Explicit
Option Compare Text

Const Sign As String = "recherche"
'ICI C'est la mise en place initialisation
Private Sub recherche_Initialize()
'pour la date du jour
Me.Caption = Format(Date, "dddd dd mmmm yyyy")
With affichage
.ColumnCount = 7
.ColumnWidths = "100;100;0;100;100;100;0"
End With
Me.CommandButton1.Default = True

' pour définir la couleur des objets lors de l'initialisation d'un UserForm.
With recherche
.BackColor = &H8000000F
.CommandButton1.BackColor = &H8000000F
.CommandButton2.BackColor = &H8000000F
.Label3.BackColor = &H8000000F
End With

End Sub

Private Sub affichage_Click()

End Sub

Private Sub CommandButton1_Click()
Dim F As Worksheet
Dim Plage As Range, C As Range
Dim T As String, Firstaddress As String
Dim X As Integer
affichage.Clear
T = Me.recherche
If T = "" Then Exit Sub
For Each F In Worksheets
With F
Set Plage = Application.Intersect(.UsedRange.Cells, .Range(.Cells(8, 1), .Cells(.Rows.Count, .Columns.Count)))
End With
Set C = Plage.Find(T, LookIn:=xlValues, LookAt:=xlPart)
If Not C Is Nothing Then
Firstaddress = C.Address
Do
With affichage
.AddItem F.Name
For X = 2 To 6
.List(.ListCount - 1, X - 1) = F.Cells(C.Row, X).Text
Next X
.List(.ListCount - 1, 6) = C.Address(False, False)
End With
Set C = Plage.FindNext(C)
Loop While Not C Is Nothing And C.Address <> Firstaddress
End If
Next F

If affichage.ListCount = 0 Then
MsgBox "Le Texte " & T & " n'a pas été trouvé" & vbLf & "Faites un essai sur une partie du nom", vbCritical, Sign
End If
End Sub
'ICI C'est la sélection au Double Click & Sortie du UserForm
Private Sub affichage_dblClick(ByVal Cancel As MSForms.ReturnBoolean)
With affichage
Application.Goto Sheets(.Text).Range(.List(.ListIndex, 6))
End With
Unload Me
End Sub
'ICI Sortie du UserForm
Private Sub CommandButton2_Click()
Unload Me
End Sub

Merci!! :)
 

milianaise

XLDnaute Nouveau
Re : Demande explication code VBA

Bonjour robert,

Merci pour ta réponse. Voici le fichier que j'ai trouvé sur Internet. :)
 

Pièces jointes

  • Management de taches projet.xls
    124 KB · Affichages: 75
  • Management de taches projet.xls
    124 KB · Affichages: 90
  • Management de taches projet.xls
    124 KB · Affichages: 81

Robert

XLDnaute Barbatruc
Repose en paix
Re : Demande explication code VBA

Bonjour Milianaise, bonjour le forum,

On va y aller par étapes...
D'abord les lignes de déclaration :
Code:
Option Explicit 'oblige à déclarer toutes le variables
Option Compare Text 'méthode de comparaison : texte (ne tient pas compte des majuscules et des minuscules A=a)
Const Sign As String = "recherche" 'définit la constante Sign
Ensuite il y a une grave erreur dans le code d'initialisation ! Cette procédure n'est pas utilisée dans l'état actuel des choses.
Code:
Private Sub recherche_Initialize()
End Sub
En effet pour initialisation d'une UserForm la procédure il faut utiliser :
Code:
Private Sub UserForm_Initialize()End Sub
Quel que soit le nom que l'on a attribué à l'Userform (danc ton cas recherche). Donc en corrigeant ça donne :
Code:
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Me.Caption = Format(Date, "dddd dd mmmm yyyy") ''place la date du jour au format "jjjj jj mmmm aaaa" (Mardi 10 juillet 2012) à la barre de tite
With affichage 'prend en compte la ListBox nommée "affichage"
    .ColumnCount = 7 'définit le nombre de colonne de la ListBox (7, de 0 à 6)
    .ColumnWidths = "100;100;0;100;100;100;0" 'définit la taille de chaque colonne (les colonnes 2 et 6 sont masquées car leur taille est définie à 0)
End With 'fin de la prise en compte de la ListBox
Me.CommandButton1.Default = True 'attribue au bouton "RECHERCHE" la propriété True (cela signifie que la touche [Entrée] équivaut à cliquer sur ce bouton)
With recherche 'prend en compte l'Userform nommée "recherche" (il aurait mieux value écrie : "With Me")
    .BackColor = &H8000000F 'définit la couleur de fond de l'Userfom
    .CommandButton1.BackColor = &H8000000F 'définit la couleur de fond du bouton "RECHERCHE"
    .CommandButton2.BackColor = &H8000000F 'définit la couleur de fond du bouton "Fermer"
    .Label3.BackColor = &H8000000F 'définit la couleur de fond du Label3 (Un double Clic sur la Ligne...
End With 'fin de la prise en compte de l'UserForm nommée "recherche"
End Sub
la suite au prochain post...

[Édition]
Dans l'initialisation j'ai écrit on aurait pu écrire : "With Me". Je rectifie ! on doit écrire With Me à la place de With recherche. Sinon ça plante...
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Demande explication code VBA

... la suite :
Code:
Private Sub CommandButton1_Click() 'au clic sur le bouton "RECHERCHE"
Dim F As Worksheet 'déclare la variable F comme un onglet ou feuille
Dim Plage As Range, C As Range 'déclare les variables Plage et C comme des plages de cellules
Dim T As String, Firstaddress As String 'déclare les variables T et Firstaddress comme du texte
Dim X As Integer 'déclare la variabe X comme un entier

affichage.Clear 'vide la ListBox
T = Me.recherche 'définit la variable T (le texte édité dans la TextBox nommée "recherche"
If T = "" Then Exit Sub 'si T est vide, sort de la procédure
For Each F In Worksheets 'boucle sur tous les onglets du classeur
    With F 'prend en compte l'onglet de la boucle
        'définit la plage (intersection de l'ensemble des cellules utilisées dans cet onglet avec la plage définie par les cellules : A8 et la dernière cellule de l'onglet)
        Set Plage = Application.Intersect(.UsedRange.Cells, .Range(.Cells(8, 1), .Cells(.Rows.Count, .Columns.Count)))
    End With 'fin de la prise en compte de l'onglet de la boucle
    Set C = Plage.Find(T, LookIn:=xlValues, LookAt:=xlPart) 'définit la recherche C (recherche dans plage le texte tapé dans la textbox)
    If Not C Is Nothing Then 'condition : si il existe au moins une occurrence trouvée
        Firstaddress = C.Address 'définit l'adresse de la première occurrence trouvée
        Do 'exécute
            With affichage 'prend en compte la ListBox
                .AddItem F.Name 'ajoute le nom de l'onglet (dans la colonne 0)
                For X = 2 To 6 'boucle de 2 à 6
                    .List(.ListCount - 1, X - 1) = F.Cells(C.Row, X).Text 'ajoute dans la colonne (X-1) la valeur de la cellule à l'intersection de la ligne de l'occurrence trouvée et de la colonne X
                Next X 'prochain élément de la boucle
                .List(.ListCount - 1, 6) = C.Address(False, False) 'ajoute en colonne 6 (cachée) de la ListBox l'adresse de l'ocurrence trouvée
            End With 'fin de la prise en compte de de la ListBox
            Set C = Plage.FindNext(C) 'redéfinit la recherche C (occurrence suivante)
        Loop While Not C Is Nothing And C.Address <> Firstaddress 'boucle tant qu'il existe des occurrences ailleurs qu'en C
    End If 'fin de la condition
Next F 'prochain onglet de la boucle
If affichage.ListCount = 0 Then 'condition : si aucune occurence n'a été trouvée
    MsgBox "Le Texte " & T & " n'a pas été trouvé" & vbLf & "Faites un essai sur une partie du nom", vbCritical, Sign 'message
End If 'fin de la condition
End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Demande explication code VBA

...la Suite
Code:
Private Sub affichage_dblClick(ByVal Cancel As MSForms.ReturnBoolean) 'au double-clic dans la ListBox nommée "affichage"
    With affichage 'prend en compte la ListBox
        'atteint la cellule (définie par la la colonne 6 (cachée) de la ligne double-cliquée) dans l'onglet (défini par la colonne 0 de la ligne double-cliquée)
        Application.Goto Sheets(.Text).Range(.List(.ListIndex, 6))
    End With 'fin de la prise en compte de la ListBox
    Unload Me 'vide et ferme l'UserForm
End Sub
Code:
Private Sub Supprimer_Click() 'bouton "Supprimer
Sheets("Projet").Rows(6 + Me.affichage.ListIndex).Delete 'supprime la ligne (6 + l'index de la Listbox) de l'onglet "Projet"
Unload Me 'vide et ferme l'UserForm
End Sub
Code:
Private Sub CommandButton2_Click() 'bouton "Fermer"
Unload Me 'vide et ferme l'UserForm
End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Demande explication code VBA

En résumé...

Même si ça fonctionne je trouve dangereux d'attribuer le même nom à l'UserForm (Recherche) et à la TextBox (recherche), avec en plus la constante Sign qui prend aussi la valeur "recherche"... Ça aurait pu engendrer des erreurs mais surtout ça complique la compréhension...
Une fois les deux erreurs corrigées (Userform_Initialize() et With Me le code semble bien fonctionner.

Ce qu'il fait :
Dans l'onglet Projet cliquer sur le bouton Editer Tâche pour lancer l'Userform. Taper un texte et cliquer sur le bouton RECHERCHE (moi, j'aurais mis le bouton après la TextBox...).
La recherche est lancée. Le code va scanner tous les onglets et alimenter la Listbox d'une nouvelle ligne chaque fois que le texte édité sera trouvé.
Deux possibilités s'offrent à l'utilisateur :
• atteindre l'élément en double-cliquant dans la ListBox
• Supprimer la ligne dans l'onglet Projet qui contient le texte...

Le fichier corrigé avec le code commenté en pièce jointe :
 

Pièces jointes

  • Milianaise_v01.xls
    111 KB · Affichages: 101

ouf746

XLDnaute Nouveau
Bonjour,
j'ai un probleme : quand je remplace le 2 part 1 afin de faire apparaitre la colone 1 de mon tableau dans la listbox le double click renvoie a la ligne ne marche pas
Quelqun peux m'aidé a résoudre se problème ?
merci cdlt

With ListBox1
.AddItem F.Name
For X = 2 To 9
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 814
dernier inscrit
JLGalley