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 Macro VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2016
    Messages : 18
    Points : 16
    Points
    16
    Par défaut Optimisation Macro VBA
    Bonjour à tous, je souhaite optimiser un code VBA qui ajoute des données et met à jour le fichier excel à partir d'un autre fichier excel extrait d'un logiciel.

    J'ai optimisé comme j'ai pu certaines fonctions mais ces deux suivantes me mènent la vie dure..

    La fonction add() qui va chercher les nouvelles données dans le fichier extract pour les ajouter.
    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
    30
    Sub add()
     
    Dim a, c, i, j, iRC, k, y As Boolean
    Dim WbC As Workbook
     
    Set WbC = ThisWorkbook
    c = WbC.Sheets("Incidents").Range("A1").CurrentRegion.Value
    iRC = UBound(c) + 1
    Workbooks.Open Filename:= _
        "fichierextract.xls"
    a = ActiveWorkbook.Sheets("DATA").Range("A1").CurrentRegion.Value
    ActiveWorkbook.Close
    With WbC.Sheets("Incidents")
     For i = 2 To UBound(a)
       For j = 2 To UBound(c)
                If c(j, 5) = a(i, 5) Then
                    y = True
                End If
            Next j
             If Not y Then
                 For k = 1 To 17
                 Cells(iRC, k) = a(i, k)
                 Next
                    iRC = iRC + 1
              End If
              y = False
        Next i
    End With
    'MsgBox "L'ajout des nouveaux incidents est terminé !"
    End Sub
    La fonction update() qui va vérifier que tout soit a jour.
    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
    30
    31
    Sub update()
    Application.ScreenUpdating = False
    LISTE = ActiveWorkbook.Name
    Workbooks.Open Filename:= _
                "fichierextract.xls"   ' Le chemin du fichier
    IWS = ActiveWorkbook.Name
    LastrowC = Workbooks(LISTE).Sheets("Incidents").Cells.Find("*", ActiveSheet.Range("A1"), , , xlByRows, xlPrevious).Row
    LastrowI = Workbooks(IWS).Sheets("DATA").Cells.Find("*", ActiveSheet.Range("A1"), , , xlByRows, xlPrevious).Row
     
    Dim sheetSource As Worksheet
    Dim sheetDest As Worksheet
     
    Set sheetSource = Workbooks(IWS).Sheets("DATA")
    Set sheetDest = Workbooks(LISTE).Sheets("Incidents")
     
     For i = 2 To LastrowC
            For j = 2 To LastrowI
                If sheetDest.Cells(i, 5) = sheetSource.Cells(j, 5) Then
                            sheetDest.Cells(i, 7) = sheetSource.Cells(j, 7)
                            sheetDest.Cells(i, 9) = sheetSource.Cells(j, 9)
                            sheetDest.Cells(i, 13) = sheetSource.Cells(j, 13)
                            sheetDest.Cells(i, 14) = sheetSource.Cells(j, 14)
                            sheetDest.Cells(i, 15) = sheetSource.Cells(j, 15)
                            sheetDest.Cells(i, 17) = sheetSource.Cells(j, 17)
                End If
            Next j
        Next i
    'MsgBox "La mise à jour des données liées aux incidents est terminée !!!!"
    Workbooks(IWS).Close False
    Application.ScreenUpdating = True
    End Sub
    Pouvez-vous me donner des pistes sur l'optimisation de ce code , qui peut mettre plusieurs heures s'il y a 20 nouveaux incidents à rajouter et mettre à jour..

    Merci d'avance.

  2. #2
    Membre confirmé
    Homme Profil pro
    Responsable des études(en disponibilité)
    Inscrit en
    Juin 2007
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable des études(en disponibilité)
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 365
    Points : 631
    Points
    631
    Par défaut
    plutôt que d'écrire cellule par cellule

    tu pourrait peur être passer par une variable tableau

    et écrire en une seule fois.

    il est possible que tu ai des cellules en calcul dans ton fichier

    si c'est le cas il faudrait figer les calculs en début de code et réactiver en fin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'au début
    Application.Calculation = xlManual
     
    'a la fin
    Application.Calculation = xAutomatic
    bonne journée

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2016
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Bonjour a_diard et merci de ta réponse.

    Etant débutant , pourrais-tu me montrer comment passer par une variable tableau et écrire en une seule fois ?

    Merci d'avance

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    Bonjour,

    Un tuto sur les variables tableaux: http://silkyroad.developpez.com/vba/tableaux/
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2016
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Bonjour halaster08 et merci pour ton lien.

    Pourrais-tu me montrer comment appliquer cette technique sur mes fonctions ?

    D'avance un grand merci

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    Citation Envoyé par simsimz Voir le message
    Pourrais-tu me montrer comment appliquer cette technique sur mes fonctions ?
    Non désolé je ne peux pas faire ton travail à ta place.
    As-tu essayé avant de poser de la question ? Qu'est-ce qui te pose problème ?
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2016
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Je ne sais pas par où ni comment m'y prendre..

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Salut.


    Avant de modifier tout ton code que je n'ai pas regardé, tu pourrais ajouter au code proposé par Halaster le fait de geler l'écran durant ta proc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub...()
      application.screenupdating = false
      application.calculation = xlcalculationmanual
     
      On Error goto EndHandler
      ...
      ...
     ...
    EndHandler:
      Application.calculation=xlcalculationautomatic
      application.screenupdating=true
    end Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2016
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Merci Pierre pour cette info

    Je posterai ici mon nouveau code dès que j'arrive a optimiser le temps d’exécution..

Discussions similaires

  1. [XL-2010] Optimisation Macro VBA
    Par Baraas dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/01/2016, 12h14
  2. [XL-2010] [VBA Userform] optimisation macro copie lignes sous critères
    Par Kannam dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/02/2015, 13h59
  3. [XL-2003] optimisation de macro vba
    Par Lulux57 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/01/2013, 08h30
  4. [XL-2003] Optimiser une macro VBA
    Par momo93240 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/07/2011, 16h46
  5. {VBA Excel} Optimiser macro si possible
    Par Thomas69 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/06/2007, 16h06

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