Microsoft 365 Améliorer un code

comardud

XLDnaute Nouveau
Bonjour à tous,

j'ai un code qui cherche la valeur qui se trouve à droite de la cellule active dans un autre onglet et qui vient ensuite inscrire une nouvelle valeur à droite de la valeur trouvée.
Jusque là tout va bien, ça fonctionne parfaitement .

Mon seul soucis est la lenteur de ce processus.
Voilà le code:
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim c As Range
If Not Application.Intersect(Target, Range("I:I")) Is Nothing Then
Call CouleurJaune
Call CopieImpression
End If
If Intersect(Target, [I:I]) Is Nothing Or CStr(Target(1, 3)) = "" Then Exit Sub
Cancel = True
With Feuil1
    Set c = .Columns(5).Resize(, .Columns.Count - 4).Find(CStr(Target(1, 3)), , xlValues, xlWhole)
End With
If Not c Is Nothing Then Application.Goto c.Offset(, 2)
Worksheets("PLANNING").Activate
ActiveCell.Value = "PL"
Worksheets("TABLEAU DE BORD").Activate
End Sub

et voilà la ligne fautive:
Code:
Set c = .Columns(5).Resize(, .Columns.Count - 4).Find(CStr(Target(1, 3)), , xlValues, xlWhole)

et c'est plus spécialement le Columns.Count - 4 qui ralentit le processus.

Y'a t'il un moyen d'accélérer le process ?

Merci
 

job75

XLDnaute Barbatruc
Bonjour comardud,

La ligne de code "fautive" ne fait que rechercher une valeur, ça prend très peu de temps !

Voyez plutôt ce qui se passe dans les macros "CouleurJaune" et "CopieImpression".

Ou si dans les feuilles il y a des macros Worksheet_Activate.

A+
 

patricktoulon

XLDnaute Barbatruc
bonjour
avec ceci tu recherche sur toutes les colonnes de la feuille -- sauf les 4 premières
ça fait encore beaucoup de colonnes en plus sur le rows.count complet
VB:
With Feuil1
    Set c = .Columns(5).Resize(, .Columns.Count - 4).Find(CStr(Target(1, 3)), , xlValues, xlWhole)
End With
il est evident que l'on peut reduire a l'etentiel c'est a dire le usedrange a partir de E1
donc change ta ligne pour celle ci
VB:
  Set c = Intersect(.Range("E1", .Cells(.Rows.Count, .Columns.Count)), .UsedRange).Find(CStr(Target(1, 3)), , xlValues, xlWhole)
ça devrait t’alléger un peu le bourrin

et pour en rajouter une couche
a tu pensé à match en vba qui fonctionne sur plusieurs colonnes dans un range :rolleyes: ;)

;)
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour patricktoulon,

Limiter la recherche au UsedRange ne doit pas changer grand-chose.

Par contre il faudrait savoir quel est l'importance du UsedRange et ce qu'il y a dedans, exécutez ceci :
VB:
Sub a()
With Feuil1
    MsgBox "Adresse du UsedRange : " & .UsedRange.Address(0, 0) & vbLf & "Nombre de cellules remplies : " & Application.CountA(.Cells)
End With
End Sub
Quels résultats ?

Et quel est le poids du fichier en Ko ou Mo ?

A+
 

comardud

XLDnaute Nouveau
Bonjour à tous et merci de votre aide.

job75
le résultat donne:
Adresse du UsedRange: A1: LO402
Nombre de cellules remplies: 110992
Le fichier est énorme (plusieurs onglets dont un qui comporte plusieurs centaines de photos), son poids est de 10740Ko. Les photo ont été compréssées pour optimiser le fichier (il dépassait les 20Mo).

patricktoulon
J'ai utilisé ton code, c'est légèrement plus rapide mais rien de vraiment flagrant par contre ça m'a permis de me rendre compte que mon range n'était pas bon puisque ce n'est pas à partir de E1 que je veux faire cette recherche mais à partir de AG1 jusqu'à LN402.

Ma recherche doit s'effectuer sur toute cette plage ce qui représente 288 colonnes mais les valeurs cherchées ne sont contenues que dans 1 colonne sur 7 c'est à dire 42 colonnes au total. Est-il possible de limiter la recherche juste à ces colonnes ?
 

patricktoulon

XLDnaute Barbatruc
bonjour
patricktoulon
J'ai utilisé ton code, c'est légèrement plus rapide mais rien de vraiment flagrant par contre ça m'a permis de me rendre compte que mon range n'était pas bon puisque ce n'est pas à partir de E1 que je veux faire cette recherche mais à partir de AG1 jusqu'à LN402.

Ma recherche doit s'effectuer sur toute cette plage ce qui représente 288 colonnes mais les valeurs cherchées ne sont contenues que dans 1 colonne sur 7 c'est à dire 42 colonnes au total. Est-il possible de limiter la recherche juste à ces colonnes ?

1° ma fois c'est simple ;)
exemple 1 on connait pas la limite 402 lignes
VB:
Set c = Intersect(.Range("AG:LN"), .UsedRange).Find(CStr(Target(1, 3)), , xlValues, xlWhole)
exemple 2 on bloque simplement la recherche a la plage AG1:LN402
VB:
Set c =.Range("AG1:LN402").Find(CStr(Target(1, 3)), , xlValues, xlWhole)


Est-il possible de limiter la recherche juste à ces colonnes ?
là tu remet en cause ton post tout entier :p:p:p
si tu utilise find c'est que tu sais pas ou LA valeur se trouve
et puis une colonne sur sept ca veut rien dire du tout
la première est elle en AG ou plus loin etc..
et en plus par code il faudrait créer une address non contiguë(allez on en rajoute une couche;))


après sincèrement un find sur 402 lignes sur 280 colonne c'est du pipi de chat
ça vaut pas le coup de s'ennuyer a réduire ou considérer une range non contiguë(1/7)

je soupçonne fortement une conception de ton fichier mal pensée;)
 

Discussions similaires

Réponses
2
Affichages
123
Réponses
1
Affichages
233

Statistiques des forums

Discussions
312 088
Messages
2 085 202
Membres
102 817
dernier inscrit
Nini668