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 19/09/2011, 20h26   #1
Candidat au titre de Membre du Club
 
Inscription : novembre 2007
Messages : 46
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 46
Points : 12
Points : 12
Par défaut Accélérer les recherches

Bonjour

Petit problème sur VBA. Je souhaite réaliser des recherches v dans un nombre très élevé de cellules : des plages de 1500 cellules sur 17 onglets différents. N'y connaissant pas grand chose, j'ai utilisé ce bon vieil enregistreur de macros.

Evidemment, Excel prend bien cinq bonnes minutes pour arriver à un résultat. Je me demandais s'il n'y avait pas une autre solution plus rapide...

Merci pour vos réponses !

Pour info, voici le code ci-dessous :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Sub test()
 
Application.ScreenUpdating = False
 
Sheets(Array("2003", "2004", "2005", "2006", "2007", "2008", "2009", "2010", "2011", _
        "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020")).Select
    Sheets("2003").Activate
 
'VLOOKUP dans la cellule B11
 
Range("B11").Select
ActiveCell.FormulaR1C1 = _
    "=IF(ISERROR(VLOOKUP(R[0]C1,INDIRECT(""'""&R10C&""'!A:I""),R1C1-2001,0))=TRUE,"""",VLOOKUP(R[0]C1,INDIRECT(""'""&R10C&""'!A:I""),R1C1-2001,0))" 'R1C1-2001 correspond à la valeur de la cellule A1 - 2001. Cela permet de retrouver la colonne correspondante
 
'Extension du VLOOKUP
 
Range("B11").Select
Selection.AutoFill Destination:=Range("B11:CD11"), Type:=xlFillDefault
Range("B11:CD11").Select
Selection.AutoFill Destination:=Range("B11:CD100"), Type:=xlFillDefault
Range("B11:CD100").Select
 
'Copier en valeur pour supprimer les formules
 
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
 
End Sub
shimuno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 21h06   #2
Membre habitué
 
Avatar de Igloobel
 
Homme
Inscription : septembre 2005
Messages : 153
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2005
Messages : 153
Points : 102
Points : 102
Bonjour Shimuno

Je pense qu'il serait plus rapide d'utiliser carement des boucles comme FOR...NEXT ou WHILE...WEND ou d'autres, et d'utiliser les object CELLS dont la syntaxe est:
"Cells(N°ligne, N°colonne).value "
par exemple et tu fais incrémenter par une variable ton N° ligne et de colonne et tu prends la valeur de la colonne que tu veux (l'équivalent d'un RechercheV sans passé par les formules)

Ta formule me parrait assez lourde et tu pourrais l'alléger en travaillant tout en VBA. Personellement il est très rare je dirais même exceptionnel que j'intègre une formule par du VBA (je crois même que je l'ai jamais fait).

N'oublie pas que les formules sont très lourdes dans un classeur "Bibindum Chamalow", alors les macros sont plutôt "Régime Slim-Fast"

Surtout qu'à la fin tu dis :
Citation:
Code :
1
2
3
4
5
6
7
'Copier en valeur pour supprimer les formules
 
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
 
End Sub
En travaillant avec l'objet cells tu n'a plus besoin de copier en valeur le résultat de ta formule cela se fait direct !



@ bientôt
__________________
C'est en forgeant que l'on devient forgeron, c'est en programmant que l'on devient ... chauve.
Igloobel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 23h23   #3
Candidat au titre de Membre du Club
 
Inscription : novembre 2007
Messages : 46
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 46
Points : 12
Points : 12
Ca a l'air facile, mais en fait je sèche comme un nase... Quelqu'un sait pourquoi ce code ne marche pas ? C'est tout bêtement censé copier une plage de cellule d'un onglet à un autre...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub test20()
 
Dim j As String 'Année en lettre
Dim k As Integer 'Ligne
Dim l As Integer 'Colonne
Dim m As String 'Société
 
j = "2003"
m = "Carrefour"
k = 6
l = 2
 
Sheets(m).Range(Cells(k, 4), Cells(k + 10, l)).Copy Destination:=Sheets(j).Cells(k, l)
 
End Sub
shimuno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 09h54   #4
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,

J'ai changer le nom de certaines variables pour plus de logique bien que ce type de nommage soit pas très parlant pour la maintenance du code par la suite :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
Sub test20()
 
    Dim A As String 'Année en lettre
    Dim L As Integer 'Ligne
    Dim C As Integer 'Colonne
    Dim N As String 'Société
 
    A = "2003"
    N = "Carrefour"
    L = 6
    C = 2
 
    With Sheets(N)
 
        .Range(.Cells(L, C), .Cells(L + 10, 4)).Copy Sheets(A).Cells(L, L)
 
    End With
 
End Sub
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 09h57   #5
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Oups,

Une petite erreur :
Code :
1
2
 
 .Range(.Cells(L, C), .Cells(L + 10, 4)).Copy Sheets(A).Cells(L, L)
corrigée par :
Code :
1
2
 
 .Range(.Cells(L, C), .Cells(L + 10, 4)).Copy Sheets(A).Cells(L, C)
Désolé.
Donc :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
Sub test20()
 
    Dim A As String 'Année en lettre
    Dim L As Integer 'Ligne
    Dim C As Integer 'Colonne
    Dim N As String 'Société
 
    A = "2003"
    N = "Carrefour"
    L = 6
    C = 2
 
    With Sheets(N)
 
        .Range(.Cells(L, C), .Cells(L + 10, 4)).Copy Sheets(A).Cells(L, C)
 
    End With
 
End Sub
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 10h11   #6
Candidat au titre de Membre du Club
 
Inscription : novembre 2007
Messages : 46
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 46
Points : 12
Points : 12
Merci beaucoup Hervé pour ta réponse rapide !

Bonne journée
shimuno 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 03h26.


 
 
 
 
Partenaires

Hébergement Web