Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/11/2011, 15h55   #1
Membre à l'essai
 
Femme Catherine ETESSE
Assistante logistique
Inscription : août 2011
Messages : 64
Détails du profil
Informations personnelles :
Nom : Femme Catherine ETESSE
Localisation : France, Manche (Basse Normandie)

Informations professionnelles :
Activité : Assistante logistique
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 64
Points : 20
Points : 20
Par défaut Simplification recherche valeur

Bonjour,

J'ai une macro qui fonctionne mais je pense qu'elle peut être améliorée afin de gagner en rapidité. J'ai cherché sur le forum mais je n'ai rien trouvé de précis.

J'ai un fichier récapitulatif de données assez important : environ 2000 lignes. Avec une référence dans la colonne B.

Dans un autre fichier excel je tape cette référence ainsi qu'un commentaire que je dois coller dans la colonne AS sur la ligne correspondant à la référence voulue.

Voici ce qui fonctionne :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    mavaleur = Range("num")
    mavaleur1 = Range("e16")
 
    Windows("Liste globale des ordres.xlsx").Activate
    Sheets("Liste des ordres").Select
    Range("b2").Select
 
1  If ActiveCell = mavaleur Then
 
        Cells(ActiveCell.Row, Column + 45).Select
        ActiveCell = mavaleur1
        Range("a2").Select
 
    Else
        Cells(ActiveCell.Row + 1, Column + 2).Select
        GoTo 1
 
    End If
mais c'est assez long car il faut tester chaque ligne.

Y a t-il une solution plus rapide ?

Merci pour votre aide

Catherine
catetesse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 16h14   #2
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Déjà évite les Select et Activate et préfixe chaque Range ou Cells par la feuille mère.
Au lieu de
Code :
1
2
3
sheets(X).Select
Range(Y).Select
activecell.value="toto"
mets
Code :
worksheets(X).Range(Y).value="toto"
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 16h20   #3
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 861
Points : 1 861
Aaaaahhh ! Un GoTo !
Je vais regarder ton code, mais effectivement, l'utilisation du GoTo est à proscrire le plus possible, à part pour la gestion des erreurs.
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 16h33   #4
Membre à l'essai
 
Femme Catherine ETESSE
Assistante logistique
Inscription : août 2011
Messages : 64
Détails du profil
Informations personnelles :
Nom : Femme Catherine ETESSE
Localisation : France, Manche (Basse Normandie)

Informations professionnelles :
Activité : Assistante logistique
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 64
Points : 20
Points : 20
Bonjour,

J'ai simplifié cela

Code :
1
2
3
    Windows("Liste globale des ordres.xlsx").Activate
    Sheets("Liste des ordres").Select
    Range("b2").Select
par cela
Code :
1
2
    Windows("Liste globale des ordres.xlsx").Activate
    Worksheets("Liste des ordres").Range("b2").Select
Mais pour la recherche, faut-il mettre :
Code :
Worksheets("Liste des ordres").Range("b2").value=mavaleur
et que faire ensuite ?

Merci
catetesse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 17h08   #5
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 861
Points : 1 861
Essaie ce code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dim wsRecap As Worksheet
'Attention, il faut que le classeur global soit ouvert (ce qui était déjà le cas pour toi)
Set wsRecap = Workbooks("List globale des ordres.xlsx").Worksheets("Liste des ordres")
 
Dim rg As Range
Set rg = wsRecap.Range(wsRecap.Range("B2"), wsRecap.Range("B65536").End(xlUp))
 
Dim maRef As String
Dim monComment As String
 
maRef = Range("num")
monComment = Range("e16")
 
Dim ligneRef As Integer
On Error Resume Next
ligneRef = WorksheetFunction.Match(maRef, rg, 0)
If Err.Number <> 0 Then ligneRef = -1
On Error GoTo 0
 
If ligneRef <> -1 Then
    rg.Offset(ligneRef - 1, 45).Value = monComment
End If
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2011, 08h27   #6
Membre à l'essai
 
Femme Catherine ETESSE
Assistante logistique
Inscription : août 2011
Messages : 64
Détails du profil
Informations personnelles :
Nom : Femme Catherine ETESSE
Localisation : France, Manche (Basse Normandie)

Informations professionnelles :
Activité : Assistante logistique
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 64
Points : 20
Points : 20
Bonjour,

Merci pour ce code.
Je l'ai introduit dans macro mais ça plante à
Code :
Set wsRecap = Workbooks("List globale des ordres.xlsx").Worksheets("Liste des ordres")
Comme je ne connais pas du tout cette commande je ne comprend pas pourquoi cela plante.

Avez vous une idée ?
Merci

Catherine
catetesse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2011, 09h50   #7
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 861
Points : 1 861
J'ai oublié le "e" au premier "liste".

En fait je déclare un objet feuille puis indique qu'il correspond à la feuille "liste des ordres" dans le classeur "liste globale des ordres.xlsx".
On peut ensuite travailler sur l'objet directement sans faire des "select" ou des "activate" qui ralentissent le code et sont souvent source d'erreur. L'intérêt est surtout que l'on peut déclarer plusieurs feuilles et donc échanger facilement des informations entre ces feuilles.

renvoie le classeur "Toto.xls" s'il est ouvert.
renvoie l'onglet "Titi" s'il existe.
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/11/2011, 10h03   #8
Membre à l'essai
 
Femme Catherine ETESSE
Assistante logistique
Inscription : août 2011
Messages : 64
Détails du profil
Informations personnelles :
Nom : Femme Catherine ETESSE
Localisation : France, Manche (Basse Normandie)

Informations professionnelles :
Activité : Assistante logistique
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 64
Points : 20
Points : 20
Merci beaucoup Zebreloup, ça fonctionne parfaitement bien et c'est beaucoup plus rapide.

j'ai ajouté à la fin du code
Code :
1
2
    Workbooks("Liste globale des ordres.xlsx").Save
    Workbooks("Liste globale des ordres.xlsx").Close
Bonne fin de journée

Catherine
catetesse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2011, 10h16   #9
Membre à l'essai
 
Femme Catherine ETESSE
Assistante logistique
Inscription : août 2011
Messages : 64
Détails du profil
Informations personnelles :
Nom : Femme Catherine ETESSE
Localisation : France, Manche (Basse Normandie)

Informations professionnelles :
Activité : Assistante logistique
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 64
Points : 20
Points : 20
En fait ça fonctionne très bien sauf que mon commentaire est collé 1462 fois.

Il est collé une première fois dans la bonne cellule, mais sur les 1461 lignes suivantes également !

Y a t-il un solution pour éviter ce problème ?

Merci

Catherine
catetesse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2011, 10h55   #10
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 861
Points : 1 861
Oui désolé, c'est parce que le Offset est appliqué au range tout entier qui contient 1462 lignes. Il ne faut prendre qu'une cellule.

Remplace :

Code :
1
2
3
If ligneRef <> -1 Then
    rg.Offset(ligneRef - 1, 45).Value = monComment
End If
Par :

Code :
1
2
3
4
5
6
7
8
9
If ligneRef <> -1 Then
    rg.Cells(1, 1).Offset(ligneRef - 1, 45).Value = monComment
    'Première plage du range, puis offset pour aller à la bonne ligne et la bonne colonne
End If
ou
If ligneRef <> -1 Then
    rg.Cells(ligneRef, 1).Offset(1, 45).Value = monComment
    'Bonne ligne du range, puis offset pour aller à la bonne colonne
End If
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/11/2011, 11h49   #11
Membre à l'essai
 
Femme Catherine ETESSE
Assistante logistique
Inscription : août 2011
Messages : 64
Détails du profil
Informations personnelles :
Nom : Femme Catherine ETESSE
Localisation : France, Manche (Basse Normandie)

Informations professionnelles :
Activité : Assistante logistique
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 64
Points : 20
Points : 20
Cette fois ci c'est parfait.
Merci beaucoup.

Catherine
catetesse est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h42.


 
 
 
 
Partenaires

Hébergement Web