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 :

VBA rame jusqu'a planter Excel.


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de jonathan.chaf
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2018
    Messages : 34
    Par défaut VBA rame jusqu'a planter Excel.
    Bonjour,
    J'ai créer un classeur excel avec une 15ene d'userform me permettant de gérer différentes liste de données (contact, relevé...) tout les userform et toutes les macro fonctionnent bien.
    Sauf que... au bout d'un certain temps les userforms mettent de plus en plus de temps à s'ouvrir et à se charger et même une fois les listebox chargées ça rame férocement du coup je referme le classeur et le réouvre et comme par magie ce repart à vitesse normale mais seulement pour quelques minutes.

    Alors je précise que ce n'est que les macro qui mettent plus de temps à s'exécuter et non pas excel en lui même.
    Je peut travailler aussi longtemps que je veux sur excel mais des que j'utilise trop les userforms ceux ci font la tête.

    C'est comme si la mémoire de vba se surchargait

    En espérant vraiment que vous aller trouver la solution sinon j'aurai tout ce travail pour rien

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    si tu penses que c'est "comme si la mémoire de vba se surchargait", je t'invite, dans chaque procédure, à décharger tes variables objets.

    Egalement, limiter au maximum les variables publiques

    Et, au possible, privilégier les Unload (et Reload quand y'a besoin) tes Userform, au lieu de les .Hide, afin de soulager la gestion des variables et contrôles

    S'intéresser également aux potentielles formules excel (trop de formules, tformules complexes etc...), aux Mises En Formes conditionnelles.
    Travailler en désactivant le recalcul automatique, le rafraichissement d'écran etc...

    Bref, optimiser encore plus ta machinerie

  3. #3
    Membre averti Avatar de jonathan.chaf
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2018
    Messages : 34
    Par défaut amélioration de macro
    voici un exemple d'une de mes macro.
    Celle ci met de plus en plus de temps a s'actionner étant donner que les tableaux se remplissent de jour en jour. si vous pouviez me donnez des conseils pour l'améliorer.

    C'est une macro qui lance un code pour afficher les résultat dans une listebox dans une feuille de calcul

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    Option Explicit
     
     
    Sub Lister()
     Dim no_ligne As Integer
     Dim no_ligne2 As Integer
        Dim i As Integer
        Dim j As Integer
        Dim Id_R As Long
        Dim FrequenceR As Integer
        Dim Frequence As Integer
        Dim NomClient As String
        Application.ScreenUpdating = False
       Me.ListBox1.Clear
      Sheets("BD_Contrat").Select
        'les entrées commencent a la 2 ligne
        'no_ligne = ListBox2.ListIndex.adress
        'on chercvhe la derniere ligne de BD_Contrat
             no_ligne = Feuil7.Range("TBL_Contrat[[ID_Client]]").Column
             no_ligne = Feuil7.Columns(no_ligne).Find("*", , , , xlByColumns, xlPrevious).Row
      Sheets("BD_Releve").Select
        'les entrées commencent a la 2 ligne
        'no_ligne = ListBox2.ListIndex.adress
        'on chercvhe la derniere ligne de BD_Releve
             no_ligne2 = Feuil6.Range("TBL_Releve[[ID_Releve]]").Column
             no_ligne2 = Feuil6.Columns(no_ligne2).Find("*", , , , xlByColumns, xlPrevious).Row
     If no_ligne2 = 2 Then
     MsgBox "Pas de données enregistrées"
      Sheets("Acceuil").Select
     Application.ScreenUpdating = True
     Exit Sub
     End If
     
     'marque l'entête
      Me.ListBox1.AddItem "ID"
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = "Nom Client"
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = "Contrat"
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = "Marque"
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 4) = "Modele"
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 5) = "Frequence"
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 6) = "Date dernier relevé"
     For i = 2 To no_ligne 'on passe les contrat 1 par 1 et on prend ID_Releve
        Sheets("BD_Contrat").Select
        Id_R = Feuil7.Cells(i, Feuil7.Range("TBL_Contrat[[ID_Releve]]").Column)
        Frequence = Feuil7.Cells(i, Feuil7.Range("TBL_Contrat[[Frequence_Releve]]").Column) * 30 'converti en jours
     
    If Id_R <> 0 Then 'on ne prend pas ID = 0 car ID de base pour garder les formules dans le tableau si effacement
     
        Sheets("BD_Releve").Select
            For j = 2 To no_ligne2
            If Id_R = Feuil6.Cells(j, Feuil6.Range("TBL_Releve[[ID_Releve]]").Column) Then
                FrequenceR = Date - Feuil6.Cells(j, Feuil6.Range("TBL_Releve[[Date]]").Column) 'on test si la date du relevé n'est pas trop vielle
                If FrequenceR > Frequence Then
                Me.ListBox1.AddItem Feuil7.Cells(i, Feuil7.Range("TBL_Contrat[[ID_Client]]").Column)
        NomClient = Feuil7.Cells(i, Feuil7.Range("TBL_Contrat[[ID_Client]]").Column) 'prend le code clients
        NomClient = Feuil4.Columns(Feuil4.Range("TBL_Clients[[ID_client]]").Column).Find(NomClient, LookAt:=xlWhole).Row 'regarde l'emplacement du code clients
        NomClient = Feuil4.Cells(NomClient, Feuil4.Range("TBL_Clients[[Nom Entreprise]]").Column) 'donne le nom du clients
     
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = NomClient
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = Feuil7.Cells(i, Feuil7.Range("TBL_Contrat[[N_Contrat]]").Column)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = Feuil7.Cells(i, Feuil7.Range("TBL_Contrat[[Marque]]").Column)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 4) = Feuil7.Cells(i, Feuil7.Range("TBL_Contrat[[Modele]]").Column)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 5) = Feuil7.Cells(i, Feuil7.Range("TBL_Contrat[[Frequence_Releve]]").Column) & " mois"
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 6) = Feuil6.Cells(j, Feuil6.Range("TBL_Releve[[Date]]").Column)
     
     
                Exit For
                End If
                Exit For
            End If
            Next j
     End If
     Next i
     Sheets("Acceuil").Select
     Application.ScreenUpdating = True
     
    End Sub
     
    Private Sub CommandButton1_Click()
    Application.ScreenUpdating = False
    Call Lister
    Application.ScreenUpdating = True
    End Sub

  4. #4
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Celle ci met de plus en plus de temps a s'actionner étant donner que les tableaux se remplissent de jour en jour.

    Ne pas utiliser Excel pour gérer des données. Il n'est pas fait pour cela.

    https://www.developpez.net/forums/d1...s/#post8497640

    https://www.developpez.net/forums/d1...l/#post9484493

Discussions similaires

  1. [XL-2010] VBA/Programme qui fait planter Excel au bout de la 25e ligne
    Par rododom05 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 17/03/2017, 17h31
  2. [XL-2003] Pouvoir ouvrir des fichiers excel avec vba sans le faire planter
    Par perpitou dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 01/12/2011, 15h52
  3. [VBA]Barre d'outils personnalisée excel
    Par fikren dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/11/2005, 13h06
  4. [VBA] Comparer des données en excel
    Par Micavk dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/10/2005, 12h26
  5. [VBA-E] Sélection feuilles sous excel
    Par Mystic eyes dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/02/2004, 13h27

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