Code VBA à imager

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
 

Robert

XLDnaute Barbatruc
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
 

recoverybis

XLDnaute Nouveau
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.
 

Robert

XLDnaute Barbatruc
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...
 

SETILA

XLDnaute Junior
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
 

Staple1600

XLDnaute Barbatruc
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
 

Discussions similaires

Statistiques des forums

Discussions
298 001
Messages
1 965 025
Membres
200 809
dernier inscrit
Ksiba