IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Accélérer les recherches


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 47
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Billets dans le blog
    1
    Par défaut
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 47
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é.

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Oups,

    Une petite erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     .Range(.Cells(L, C), .Cells(L + 10, 4)).Copy Sheets(A).Cells(L, L)
    corrigée par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     .Range(.Cells(L, C), .Cells(L + 10, 4)).Copy Sheets(A).Cells(L, C)
    Désolé.
    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é.

  6. #6
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 47
    Par défaut
    Merci beaucoup Hervé pour ta réponse rapide !

    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. accélérer les algorithm
    Par yan dans le forum SL & STL
    Réponses: 36
    Dernier message: 13/05/2008, 17h45
  2. Accélérer les INSERT ?
    Par ctobini dans le forum Requêtes
    Réponses: 4
    Dernier message: 30/10/2007, 11h25
  3. Comment virer les recherches bidons ?
    Par Mat.M dans le forum Dépannage et Assistance
    Réponses: 6
    Dernier message: 15/02/2007, 02h39
  4. supprimer toute ponctuation pour les recherches
    Par wag71 dans le forum Access
    Réponses: 1
    Dernier message: 27/12/2006, 15h21
  5. Combiner les recherches FAQ/Sources
    Par Tofalu dans le forum Evolutions du club
    Réponses: 1
    Dernier message: 04/10/2005, 00h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo