Comment améliorer la rapidité de traitement Macro ???

  • Initiateur de la discussion Initiateur de la discussion Phileufeu@yahoo.fr
  • Date de début Date de début

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 !

P

Phileufeu@yahoo.fr

Guest
Bonjour à tous,

Je dispose d'un tableau excel avec des noms de joueurs en ligne (environ 19.000) et des infos sur ces joueurs en colonne (voir ex en pj).
J'ai une macro qui me permet une saisie automatique de toute la ligne lorsque je met dans la colonne A le nom d'un joueur qui est déjà présent dans la liste.
Voilà à quoi ça ressemble:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
If Target.Column > 1 Then Exit Sub
With ActiveSheet.Range("A2:A" & Target.Offset(-1, 0).Row)
Set c = .Find(Target.Value, LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
Range(c.Offset(0, 1), c.Offset(0, 6)).Copy
Range(Target.Offset(0, 1), Target.Offset(0, 6)).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Target.Offset(1, 0).Select
End If
End With
End Sub



Le problème est que la recherche est très longue. Comment améliorer la rapidité de traitement ? Peut-on apporter des modifs à la macro pour que ça aille plus vite ?

merci.

Philippe.
 

Pièces jointes

Re : Comment améliorer la rapidité de traitement Macro ???

bonjour Phil,

Essaie déjà ceci:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
    If Target.Column > 1 Then Exit Sub
    With ActiveSheet.Range("A2:A" & Target.Offset(-1, 0).Row)
        Set c = .Find(Target.Value, LookIn:=xlValues, lookat:=xlWhole)
        If Not c Is Nothing Then
'Evite de rappeler l'évènement Change
            [SIZE=3][COLOR=red]Application.EnableEvents = False[/COLOR][/SIZE]
            Range(c.Offset(0, 1), c.Offset(0, 6)).Copy [COLOR=blue]Destination:=Range(Target.Offset(0, 1), Target.Offset(0, 6))[/COLOR]
[COLOR=black]'Rétablit la gestion des évènements[/COLOR]
           [SIZE=3][COLOR=red]Application.EnableEvents = True[/COLOR][/SIZE]
            Application.CutCopyMode = False
            Target.Offset(1, 0).Select
        End If
    End With
End Sub

A+
 
Re : Comment améliorer la rapidité de traitement Macro ???

Re,

Petit complément si tu veux ne copier que les valeurs:

Code:
        If Not c Is Nothing Then
            Application.EnableEvents = False
            Target.Range("B1:H1").Value = c.Range("B1:H1").Value
            Application.EnableEvents = True
            Target.Offset(1, 0).Select
        End If

A+
 
Re : Comment améliorer la rapidité de traitement Macro ???

Hasco,

Qu'entends-tu par "ne copier que les valeurs" ?
Pardon je suis nul en excel, même si j'utilise des macros (que j'ai d'ailleurs bêtement recopié)...
Philippe.
 
Re : Comment améliorer la rapidité de traitement Macro ???

Phil,

T'inquiète, nous apprenons tous, ici.

Lorsque tu veux copier une cellule tu peux copier la valeur + le format, commentaire et toutes les caractéristiques de la cellules ou seulement sa valeur pour garder le format de destination intacte.

Dans ton cas, copier que la valeur, n'a d'intérêt que pour éclaircir la macro. Mais si tu as besoin de tout copier valeur, format etc... garde la soluce avec la méthode .Copy Destination:= .....

Les copies de valeurs sont généralement plus rapides.

A+
 
Re : Comment améliorer la rapidité de traitement Macro ???

OK, en effet la copie seule de la valeur me convient, si ça peut aider excel à aller encore plus vite.
Par contre, j'ai changé la macro par la formule que tu m'as donné:

If Not c Is Nothing Then
Application.EnableEvents = False
Target.Range("B1:H1").Value = c.Range("B1:H1").Value
Application.EnableEvents = True
Target.Offset(1, 0).Select
End If


Mais la reconnaissance ne marche plus. J'ai oublié une étape? Il faut insérer cette formule avec une partie de la précédente?

Philippe.
 
Re : Comment améliorer la rapidité de traitement Macro ???

Re Phil,

Eh oui, ce n'est que la partie modifiée que j'ai joint au message. Voici ce que cela devrait donner:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
    If Target.Column > 1 Then Exit Sub
    With ActiveSheet.Range("A2:A" & Target.Offset(-1, 0).Row)
        Set c = .Find(Target.Value, LookIn:=xlValues, lookat:=xlWhole)
        If Not c Is Nothing Then
            Application.EnableEvents = False
            Target.Range("B1:H1").Value = c.Range("B1:H1").Value
            Application.EnableEvents = True
            Target.Offset(1, 0).Select
        End If
    End With
End Sub

A+

Si jamais cela ne fonctionne pas, essaie de joindre un fichier.
A bientôt
 
Re : Comment améliorer la rapidité de traitement Macro ???

Tout marche impec !
Merci beaucoup.

Mon seul petit souci (rien à voir avec le reconnaissance des noms) est que pour rentrer mes données, je colle en désordre dans excel des infos que je prends sur un site. Ensuite je copie/colle plusieurs cellules pour mettre dans la forme voulue (dans les différentes colonnes.
Et à chaque copier, excel met environ 1 ou 2 secondes (il m'affiche un petit minuteur à la place du pointeur de la souris). Ca peut paraître rapide, mais ça ralentit vachement la saisie de données. Mais bon, là je pense qu'il n'y a pas grand chose à faire, non?

Philippe.
 
Re : Comment améliorer la rapidité de traitement Macro ???

Re phil,

A chaque fois que la valeur d'une cellule de la colonne A (1) est changée, par quelque méthode que ce soit, l'évènement Worksheet_Change est appelé. C'est ce qui fait les longueurs.

Le seul moyen est de déterminer une condition qui permettrait de stopper la gestion des évènements. Mais ne sachant pas excatement comment tu travailles, c'est difficile de te répondre.


A+
 
Re : Comment améliorer la rapidité de traitement Macro ???

Hasco,

Quand je colle les infos du site sur le tableau excel, toutes les données qui m'intéressent sont dans la colonne B (voir pj). Ensuite, dans l'exemple, je colle "American" en B10, San Diego en C10... Donc le ralentissement ne vient pas de la colonne A (mais sûrement des quelques 20.000 lignes qui sont au dessus).

Enfin bref, je ne vais pas te saouler avec ce petit détail.
Merci beaucoup pour ton aide. A bientôt peut être.

Philippe.
 

Pièces jointes

- 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
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
7
Affichages
174
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
1 K
Réponses
4
Affichages
732
Retour