Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

recoverybis

XLDnaute Nouveau
Bonjour,

il y a peu de temps LONE WOLF que je remercie à nouveau ainsi que tous les autres membres qui m'ont apporté leur aide m'a élaboré une macro complexe mais redoutablement efficace. Explication, je lance une recherche via un Userform dans une feuille source une fois la cible identifiée cette dernière est copiée ainsi que toute la ligne sur laquelle elle se trouve, ensuite l'ensemble est exporté vers la feuille de destination et ça fonctionne à merveille. Seulement, je souhaiterais comprendre le sens du code qui la compose même en vulgarisant à l'extrême cela me permettrait de progresser. Merci à tous ceux qui se pencheront sur la question.
voilà le code

Dim plage As Range, cel As Range, derlig As Long, lig As Long, col As Long, premaddress

Application.ScreenUpdating = False

With Sheets("BD")
derlig = .Range("a" & Rows.Count).End(xlUp).Row
Set plage = .Range("a2:a" & derlig)
End With

Set cel = plage.Find(TextBox1, , xlValues, xlWhole)
If Not cel Is Nothing Then
premaddress = cel.Address
Do
With Sheets("Temp")
lig = .Range("a" & Rows.Count).End(xlUp).Row + 1
For col = 1 To 22
.Cells(lig, col) = cel.Offset(0, col - 1)
Next col
End With
Set cel = plage.FindNext(cel)
Loop While Not cel Is Nothing And cel.Address <> premaddress
End If
End Sub
 
Bonsoir Recoverybis, bonsoir le forum,

Le Code commenté :

VB:
Sub Macro1()
'déclaration des variables ([plage] et [cel] comme des objet Range (=cellule ou plage),
'[derlig] et [lig] comme des entiers Long et premaddress comme variant [de type String eût été mieux !...])
Dim plage As Range, cel As Range, derlig As Long, lig As Long, col As Long, premaddress
'il manque la déclaration de la variable col : Dim col As Byte

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran

With Sheets("BD") 'prend en compte l'onglet "BD"
    derlig = .Range("a" & Rows.Count).End(xlUp).Row 'définit la dernière ligne édité [derlig] de la colonne A de cet onglet
    Set plage = .Range("a2:a" & derlig) 'définit la plage [plage] de A2 à A...derlig dans cet onglet
End With 'fin de la prise en compte de l'onglet "BD"

'définit la cellule [cel] qui est la recherche [Find] dans la plage [plage] de la valeur entière (xlWhole) de la TextBox1
Set cel = plage.Find(TextBox1, , xlValues, xlWhole)
If Not cel Is Nothing Then 'condition : s'il existe au moins une occurrence trouvée
    premaddress = cel.Address 'définit l'adresse [premaddress] de la première occurrence trouvée
    Do 'exécute
    With Sheets("Temp") 'prend en compte l'onglet "Temp"
        lig = .Range("a" & Rows.Count).End(xlUp).Row + 1 'définit la première ligne vide [lig] de la colonne A de l'onglet "Temp"
        For col = 1 To 22 'boucle sur les colonnes [col] 1 à 22 (=> A à V)
            'récupère dans la cellule ligne [lig] colonne [col] de l'onglet "Temp",
            'la valeur dans la ligne de l'occurrence trouvée décalée de [col] - 1 colonnes à droite
            .Cells(lig, col) = cel.Offset(0, col - 1)
        Next col 'prochaine colonne de la boucle
        End With 'fin de la prise en compte de l'onglet "Temp"
        Set cel = plage.FindNext(cel) 'redéfinit la cellule cel (recherche l'occurrence suivante)
    'boucle tant qu'il existe de nouvelles occurrences aillerus qu'en [premaddress]
    Loop While Not cel Is Nothing And cel.Address <> premaddress
End If 'fin de la condition

'il est recommandé de réafficher les rafraîchissements d'écran à la fin avec
'Application.ScreenUpdating = True
End Sub
 
Bonsoir Recoverybis, bonsoir le forum,

Le Code commenté :

VB:
Sub Macro1()
'déclaration des variables ([plage] et [cel] comme des objet Range (=cellule ou plage),
'[derlig] et [lig] comme des entiers Long et premaddress comme variant [de type String eût été mieux !...])
Dim plage As Range, cel As Range, derlig As Long, lig As Long, col As Long, premaddress
'il manque la déclaration de la variable col : Dim col As Byte

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran

With Sheets("BD") 'prend en compte l'onglet "BD"
    derlig = .Range("a" & Rows.Count).End(xlUp).Row 'définit la dernière ligne édité [derlig] de la colonne A de cet onglet
    Set plage = .Range("a2:a" & derlig) 'définit la plage [plage] de A2 à A...derlig dans cet onglet
End With 'fin de la prise en compte de l'onglet "BD"

'définit la cellule [cel] qui est la recherche [Find] dans la plage [plage] de la valeur entière (xlWhole) de la TextBox1
Set cel = plage.Find(TextBox1, , xlValues, xlWhole)
If Not cel Is Nothing Then 'condition : s'il existe au moins une occurrence trouvée
    premaddress = cel.Address 'définit l'adresse [premaddress] de la première occurrence trouvée
    Do 'exécute
    With Sheets("Temp") 'prend en compte l'onglet "Temp"
        lig = .Range("a" & Rows.Count).End(xlUp).Row + 1 'définit la première ligne vide [lig] de la colonne A de l'onglet "Temp"
        For col = 1 To 22 'boucle sur les colonnes [col] 1 à 22 (=> A à V)
            'récupère dans la cellule ligne [lig] colonne [col] de l'onglet "Temp",
            'la valeur dans la ligne de l'occurrence trouvée décalée de [col] - 1 colonnes à droite
            .Cells(lig, col) = cel.Offset(0, col - 1)
        Next col 'prochaine colonne de la boucle
        End With 'fin de la prise en compte de l'onglet "Temp"
        Set cel = plage.FindNext(cel) 'redéfinit la cellule cel (recherche l'occurrence suivante)
    'boucle tant qu'il existe de nouvelles occurrences aillerus qu'en [premaddress]
    Loop While Not cel Is Nothing And cel.Address <> premaddress
End If 'fin de la condition

'il est recommandé de réafficher les rafraîchissements d'écran à la fin avec
'Application.ScreenUpdating = True
End Sub

Merci beaucoup Robert, je vais pouvoir bosser d'autre part, tu mentionnes qu'il manque une déclaration de variable(Dim col As Byte) mais cette dernière est mentionnée dans la liste Dim col as long ou est ce une autre ? et dans ce cas dois je la déclarer car apparemment le code fonctionne ?
Bien cordialement.
 
Re,

Ooops pardon ! Tu as raison elle est déclarée (il faut que j'arrête de boire !...). En fait la déclaration des variables n'est pas obligatoire. Un code très bien peut fonctionner sans. Toutefois je la recommande toujours car elle facilite l'écriture du code et ça peut éviter des bugs...
 
Re,

Ooops pardon ! Tu as raison elle est déclarée (il faut que j'arrête de boire !...). En fait la déclaration des variables n'est pas obligatoire. Un code très bien peut fonctionner sans. Toutefois je la recommande toujours car elle facilite l'écriture du code et ça peut éviter des bugs...

Bonjour Robert,
Si la déclaration des variables n'est pas faite, est ce que ça peut ralentir le code?
Pourquoi déclarer les variables?
Je suis novice et je cherche à comprendre.
Merci d'avance,
Cordialement,
Setila
 
Bonsoir le fil, le forum

SETILA
Si tu cherches à comprendre, le premier réflexe est la touche F1*
ou désormais hélas*
Ce lien n'existe plus

*: Auparavant la touche F1 lançait l'aide en ligne de VBA
Désormais cette aide en ligne est "uniquement" sur le web
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
4
Affichages
361
Réponses
3
Affichages
599
Réponses
16
Affichages
1 K
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
250
  • Question Question
Microsoft 365 modifier un code
Réponses
1
Affichages
443
  • Question Question
Microsoft 365 Probléme VBA
Réponses
8
Affichages
233
  • Question Question
Microsoft 365 Code VBA
Réponses
7
Affichages
638
Réponses
4
Affichages
529
Réponses
2
Affichages
405
Retour