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 :

Optimisation de code [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 28
    Par défaut Optimisation de code
    Bonjour,

    j ai un code qui fonctionne, mais une partie prend plus d une minute a compiler et j aimerais essayer de l optimiser.
    Explication de mon code :
    Stock est un tableau a 2 colonnes, une sur laquelle j effectue une recherche, et une ou je vais chercher la valeur voulue. Il est rempli a partir de Classeur1. Le code suivant s effectue sur Classeur2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For Each Cell In Range(Cells(7, 1), Cells(1100, 1)) 
        For w = 7 To 1100
            If Cell.Value = Stock(0, w) Then 'on cherche la valeur correspondante
                                           'de la ligne 0 du tableau Stock
                Cells(Cell.Row, 4).Value = Stock(1, w) 'on recopie la valeur voulue
                                     'contenue dans la ligne 1 du tableau Stock
            End If
        Next
    Next
    Mon idee etait de sotcker dans un tableau intermediaire (Stock) mes valeurs pour ne pas activer 1000 fois de suite Classeur1 puis Classeur2.
    J ai bien essaye de passer par la methode .Find mais je suis bloquee avec mon tableau Stock. J obtiens des erreurs du type "object required".
    Je ne m y connais pas enormement et donc une autre idee d optimisation ne me saute pas aux yeux.

    Merci d avance si quelqu un a une petite idee pour m aider !

  2. #2
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    essaies de voir ce tutoriel, en travaillant en variables tableaux pures, tu peux parcourir tous les éléments bien plus vite qu'avec une collection de cellules.

    vois le code des taxis jaunes aussi.

    ainsi que cet autre tutoriel.

    cordialement,

    Didier

  3. #3
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    On va limiter les lignes à celle utiles (à la place du 1100), et puis on va instancier la variable Stock en référence à une plage du Classeur1
    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
    Dim wbk1 As Workbook, wbk2 As Workbook
    Dim Stock As Range, c As Range
    Dim LastLig As Long, i As Long
     
    Application.ScreenUpdating = False
    Set wbk1 = Workbooks("tableau.xls")
    Set wbk2 = ThisWorkbook
    With wbk1.Sheets("Feuil1")                            'à adapter
       LastLig = .Cells(Rows.Count, 1).End(xlUp).Row
       Set Stock = .Range("A7:B" & LastLig)
    End With
    With wbk2.Sheets("Feuil2")                            'à adapter
       LastLig = .Cells(Rows.Count, 1).End(xlUp).Row
       For i = 7 To LastLig
          Set c = Stock.Columns(1).Find(.Range("A" & i).Value, LookIn:=xlValues, LookAt:=xlWhole)
          If Not c Is Nothing Then
             .Range("D" & i).Value = c.Offset(0, 1).Value
          End If
       Next i
    End With
    Set wbk1 = Nothing
    Set wbk2 = Nothing
    Edit:
    PS: pour ci peu de données, la méthode find est rapide Mais, elle s'applique à des Range et non à des tableaux.
    Cette méthode recherche une information spécifique dans une plage et renvoie un objet Range qui représente la première cellule où cette information apparaît. Cette méthode renvoie la valeur Nothing si l'information n'est pas trouvée. N'affecte ni la sélection ni la cellule active.

    Pour plus d'informations sur la fonction de feuille de calcul Find de Visual Basic, consultez Utilisation des fonctions de feuille de calcul dans Visual Basic.

    expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
    expression Obligatoire. Expression qui renvoie un objet Range.

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

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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