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 12/08/2011, 11h54   #1
Invité de passage
 
Homme
Étudiant
Inscription : août 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : août 2011
Messages : 9
Points : 2
Points : 2
Par défaut Cherche procédure remplacant un Vlookup (recherchev)

bonjour

Pourriez-vous m'aider SVP à ameliorer une procédure que je lance pour classer des "bonds" en fonction d'un Code?
Pour cela j'utilise actuellement un Vlookup qui fait appel à une autre feuille du classeur dans laquelle se trouve un liste contenant une classification de ces "bonds".
voila ma macro mais une fois apliquée le fichier devient trop lourd et est difficile à manipuler.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
Dim ligne
Function LastRowG()
'feuille active, colonne N
  LastRowG = Cells(Cells.Rows.Count, "N").End(xlUp).Row
End Function
 
sub category
 
'Catégorie
 
    Range("AA2").Select
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(RC[-19],'bonds data new'!C[-26]:C[-13],5,FALSE)"
    Selection.AutoFill Destination:=Range("AA2:AA" & LastRowG)
    Range("AA2").Select
 
end sub
Merci à vous
Mirak87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 12h07   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 885
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 885
Points : 7 151
Points : 7 151
Bonjour,

une solution serait de faire un copier/coller valeur après calcul des vlookup

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub category
 
'Catégorie
 
Range("AA2").Select
ActiveCell.FormulaR1C1 = _
"=VLOOKUP(RC[-19],'bonds data new'!C[-26]:C[-13],5,FALSE)"
Selection.AutoFill Destination:=Range("AA2:AA" & LastRowG)
application.calculate
Range("AA2:AA" & LastRowG).Copy
Range("AA2:AA" & LastRowG).PasteSpecial Paste:=xlPasteValues
Range("AA2").Select
 
end sub
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 12/08/2011, 12h34   #3
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
Par défaut valeurs vlookup

Bonjour Mirak87, Bonjour Jérôme,

Si je peux me permettre.

Une autre solution serait de traiter la formulation dans sa globalité au niveau des cellules à informer.

D'autre part, plutôt que d'effectuer un collage spécial, il est tout aussi efficace d'utiliser une astuce (de mercatog, je crois) consistant à affecter une valeur à la valeur de la formule.

Ce qui donne (à adapter, notamment en termes d'adressage des champs)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Sub ESSAI3()
 
Dim dercel As Range
 
With Sheets(3)
        Set dercel = .Cells(.Rows.Count, 1).End(xlUp)
        With .Range("A1", dercel).Offset(0, 1)
            .Formula = "=VLOOKUP(A1, $I$1:$J$3,2)"
            'astuce collage spécial
            .Value = .Value
        End With
End With
 
Set dercel = Nothing
 
End Sub
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 12/08/2011, 13h07   #4
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 8 198
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 8 198
Points : 14 403
Points : 14 403
Envoyer un message via Skype™ à Pierre Fauconnier
Salut.

Tu pourrais appliquer la formule sur la plage directement, plutôt que de l'appliquer sur la première cellule puis de recopier.

Code :
Range("AA2:AA" & LastRowG).FormulaR1C1="=VLOOKUP(RC[-19],'bonds data new'!C[-26]:C[-13],5,FALSE)"
Pour améliorer éventuellement encore un peu la vitesse d'exécution, tu pourrais désactiver le calcul avant et le réactiver après. Tu pourrais aussi désactiver application.screenupdating et le réactiver en fin de macro.

Evite de sélectionner des cellules. Cela ralentit le système et est souvent superflu. Tu gagneras du temps et de la clarté de code à travailler directement avec les objets Cells ou Range appropriés.
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 13h17   #5
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
Par défaut formulation

Salut Pierre,

Nos méthodes, je pense, sont similaires.

Au demeurant, j'ai testé cette méthode sur 65530 cellules avec un champ de référence sur la même feuille. Le temps d'exécution est de l'ordre de 2 secondes tout au plus.
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/08/2011, 13h45   #6
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 8 198
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 8 198
Points : 14 403
Points : 14 403
Envoyer un message via Skype™ à Pierre Fauconnier
Tout à fait, Marcel,

Je n'avais pas vu le "dercell" dans ton code... Mea culpa!

Je pense aussi qu'il faut vraiment de grosses tables de données pour que le vlookup "pagaie dans la semoule"...
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 10h55   #7
Invité de passage
 
Homme
Étudiant
Inscription : août 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : août 2011
Messages : 9
Points : 2
Points : 2
Bonjour,

Merci pour vos reponse Pierre et Marcel!
effectivement c une base de 65 000 lignes!!

je ne parviens pa à appliquer la copie valeur suggéré en debut de discussion!

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Sub ESSAI3()
 
Dim dercel As Range
 
With Sheets(3)
        Set dercel = .Cells(.Rows.Count, 1).End(xlUp)
        With .Range("A1", dercel).Offset(0, 1)
            .Formula = "=VLOOKUP(A1, $I$1:$J$3,2)"
            'astuce collage spécial
            .Value = .Value
        End With
End With
 
Set dercel = Nothing
 
End Sub
Pourriez-vous svp me suggérer un code qui copierai toute une feuille sans les formules sur une autre feuille du classeur??
Mirak87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 15h18   #8
Membre éclairé
 
Inscription : février 2006
Messages : 287
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 287
Points : 348
Points : 348
Citation:
Envoyé par Mirak87 Voir le message
Pourriez-vous svp me suggérer un code qui copierai toute une feuille sans les formules sur une autre feuille du classeur??

Je pense qu'on peut faire ça avec un tableau de variables, qui plus est c'est très rapide :

Code :
1
2
3
4
5
6
Sub test()
Dim mon_tableau()
mon_tableau = Range("A1:A65000").Value
 
Range("C1:C65000") = mon_tableau
End Sub
Ici ça copie la colonne A, où il y aurait des formules, dans la colonne C où il n'y a alors que les valeurs. A adapter bien sûr.


EDIT : je suis très con, il y a même un moyen bien plus simple :
Code :
1
2
3
Sub test()
Range("C1:C2") = Range("A1:A2").Value
End Sub
Ce doit être à peu de chose près la même chose que ce que suggère MarcelG avec .Value = .Value
neupont est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h17.


 
 
 
 
Partenaires

Hébergement Web