Explication pas à pas de codes VBA

Bonjour,

je viens vers vous comme j'utilise quelques codes VBA simples sur Excel, je comprends souvent la structure du code mais je ne comprend pas toujours la signification de certains termes utilisés dans le code.

J'ai notamment du mal à comprendre les termes suivant:

(ByVal Target As Range)
If Not Application.Intersect(Keycells, Range(Target.Address))

Aussi, par rapport à ce code ci-dessous, je ne comprend pas tout à fait l'utilisation de "c" (For Each c In application...; Next c; ...). Pourriez vous m'éclairer sur ce sujet?

Private Sub TextBox1_Change()
    Me.ListBox1.Clear
    i = 0
    For Each c In Application.Index(Range("Tableau1[[Eligibilité]:[Libellé]]"), , 4)
        If UCase(c) Like "*" & UCase(Me.TextBox1) & "*" Then
            Me.ListBox1.AddItem
            Me.ListBox1.List(i, 0) = c.Offset(0, -3).Value
            Me.ListBox1.List(i, 1) = c.Offset(0, -2).Value
            Me.ListBox1.List(i, 2) = c.Offset(0, -1).Value
            Me.ListBox1.List(i, 3) = c.Offset(0, 0).Value
            i = i + 1
        End If
    Next c
End Sub

(Il s'agit d'un code inscrit dans un Userform)

Aussi, quelle est la différence entre Public Sub et Private Sub?

Et pourquoi mettre Option Explicit avant une macro?

Merci d'avance

Bonsoir juliak,

voici une partie des réponses :

* Option Explicit : la compilation du code VBA va être bloquée si elle rencontre une variable qui n'a pas été déclarée avant d'être utilisée ; le programmeur est donc obligé de déclarer toutes ses variables, sans faire de faute de frappe dans le nom ; de plus, ça détecte certaines erreurs de type de variable ; si l'instruction « Option Explicit » est utilisé dans un module, elle doit être placée une seule fois en début de module, et c'est valable pour toutes les subs du module, pas que pour une seule.

* différence entre Public Sub et Private Sub : une sub privée ne peut être appelée que par une autre sub du même module où elle est placée ; elle ne peut donc pas être appelée directement par l'utilisateur, ni par une sub d'un autre module ; à l'inverse, une sub publique peut être appelée par une sub d'un autre module (avec transmission d'éventuels paramètres), ainsi que par l'utilisateur (s'il n'y a pas de paramètres) ; dans un module, les subs sont publiques par défaut ; dans un UserForm, c'est le contraire : les subs sont privées par défaut ; voir l'aide VBA pour plus de détails.

* ByVal ; par défaut, c'est ByRef : argument transmis par référence (via un pointeur sur la variable) ; si la variable est modifiée localement au sein de la procédure, la variable de départ de la sub appelante est également modifiée ; avec ByVal (par valeur), la variable locale est une copie de la variable transmise ; ainsi, la modification de cette seconde variable ne modifie pas la variable de la sub appelante.

* Target est la cellule cible d'une sub événementielle telle que Worksheet_Change() ; exemple :

Private Sub Worksheet_Change(ByVal Target As Range)

End Sub

* For Each c In .. Next c : boucle « pour chaque c dans » .. « c suivant »

je laisse à un autre intervenant le soin de t'expliquer le reste.

dhany

Bonsoir,

Je complète la réponse de Dany

Range("Tableau1[[Eligibilité]:[Libellé]]") 

représente la plage de cellules d'un objet tableau comprise entre les colonnes Eligibilité et Libellé.

Application.Index(Range("Tableau1[[Eligibilité]:[Libellé]]"), , 4) 

ou plus clairement

Range("Tableau1[[Eligibilité]:[Libellé]]").Columns(4).Cells 

représente donc les cellules de la colonne 4 de la plage ci-dessus.

"c" est une variable objet représentant la cellule sélectionnée par le " For Each" dans la plage désignée dans le "IN".

Il est d'ailleurs plus judicieux de nommer cette variable "cel" ou "cell" pour bien clarifier ce qu'elle représente. Les variables à une lettre sont plutôt assignées à des indices.

Merci beaucoup pour vos réponses, c'est déjà bien plus claire!

Seuelement c'est cette partie que je ne comprend encore pas trop et la réponse correspondante (de quelle variable parle t-on?):

Private Sub TextBox1_Change()
    Me.ListBox1.Clear
    i = 0
    For Each c In Application.Index(Range("Tableau1[[Eligibilité]:[Libellé]]"), , 4)

        If UCase(c) Like "*" & UCase(Me.TextBox1) & "*" Then

            Me.ListBox1.AddItem
            Me.ListBox1.List(i, 0) = c.Offset(0, -3).Value
            Me.ListBox1.List(i, 1) = c.Offset(0, -2).Value
            Me.ListBox1.List(i, 2) = c.Offset(0, -1).Value
            Me.ListBox1.List(i, 3) = c.Offset(0, 0).Value
            i = i + 1

"c" est une variable objet représentant la cellule sélectionnée par le " For Each" dans la plage désignée dans le "IN".

Il est d'ailleurs plus judicieux de nommer cette variable "cel" ou "cell" pour bien clarifier ce qu'elle représente. Les variables à une lettre sont plutôt assignées à des indices.

Bonjour juliak,

tu a écrit :

de quelle variable parle t-on?

il s'agit de cette variable c :


Private Sub TextBox1_Change()

Me.ListBox1.Clear

i = 0

For Each c In Application.Index(Range("Tableau1[[Eligibilité]:[Libellé]]"), , 4)

If UCase(c) Like "*" & UCase(Me.TextBox1) & "*" Then

Me.ListBox1.AddItem

Me.ListBox1.List(i, 0) = c.Offset(0, -3).Value

Me.ListBox1.List(i, 1) = c.Offset(0, -2).Value

Me.ListBox1.List(i, 2) = c.Offset(0, -1).Value

Me.ListBox1.List(i, 3) = c.Offset(0, 0).Value

i = i + 1


tu peux la déclarer ainsi : Dim c As Range

dhany

Rechercher des sujets similaires à "explication pas codes vba"