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 :

Code VBA qui marche uniquement avec la touche ECHAP? [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2018
    Messages : 11
    Par défaut Code VBA qui marche uniquement avec la touche ECHAP?
    Bonjour à toutes et à tous,

    Voila mon problème: j'ai écrit un petit programme sous VBA pour modifier un tableau assez conséquent (plus de 40 000 lignes).

    Le programme marche bien si ce n'est que je doit appuyer sur la touche "échap" quelques secondes après l'avoir lancé pour visualiser les modifications que je veux ET pour que Excel arrête de ramer pour rien (je vois le processeur monter en charge petit à petit.. 10%...12%...14%...etc)

    C'est comme si j'avais lancé une boucle infinie .. mais en mettant des stops aux endroits clefs pour voir comment se comporte le programme et où ça pouvait bloquer éventuellement, il se trouve que l'endroit faisant tout "capoter" étant juste avant de changer certaines cellules du tableau (les 4 dernières lignes)

    Je précise que le script est sur une feuille et non un module, que certaines valeurs d'entrée sont récupérées depuis des userform et que j'ai eu quelques soucis du genre "erreur 400" et "erreur 1004" avant que ça fonctionne (j'ai dû changer cells(x,j) en application.cells(x,j).value)

    Voila mon programme 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
    30
    31
    32
    33
    34
    35
    36
    Sub LancementProgramme2()
    
    Dim RefLM As Long, CapaLin As Integer, DateModif As Date, NomPers As String, BoiteDial, i As Long, Nrow As Long, LigneRef As Long, boitedial2
    
    ' Récupération des variables renseignées dans les champs de la feuille CAPA
    
    RefLM = TextBox1.Value
    CapaLin = TextBox2.Value
    DateModif = TextBox3.Value
    NomPers = TextBox4.Value
    
    
    'Comptage du nombre de lignes
    
    Nrow = Range("A65536").End(xlUp).Row
    
    'Vérification si la référence LM est déjà dans le tableau
    
    LigneRef = 999999999
    
    For i = 2 To Nrow
        If Cells(i, 1) = RefLM Then LigneRef = i
    Next
    
    If LigneRef = 999999999 Then boitedial2 = MsgBox("La référence que vous avez renseigné n'est pas dans le tableau, voulez-vous créer une nouvelle référence?", vbYesNo, "Attention")
        If boitedial2 = vbYes Then LigneRef = Nrow + 1
        If boitedial2 = vbNo Then Exit Sub
    
    Application.Cells(LigneRef, 1).Value = RefLM
    Application.Cells(LigneRef, 2).Value = CapaLin
    Application.Cells(LigneRef, 4).Value = DateModif
    Application.Cells(LigneRef, 5).Value = NomPers
    
    
    End Sub
    Merci d'avance pour votre aide!!

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Juste après ton "Nrow = ...", mets la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Debug.Print Nrow
    Debug.Print ActiveSheet.Name
    Debug.Print  Range("A65536").Parent.Name
    Lance la macro et regarde dans la fenêtre d'exécution le résultat de ces trois instructions.

  3. #3
    Membre habitué
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2018
    Messages : 11
    Par défaut
    Ça donne:

    41606
    CAPA
    CAPA

    41606 est le nombre de lignes du tableau.
    CAPA étant le nom de la feuille dans laquelle j'ai le tableau.

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    "Quelques secondes", c'est peut-être normal pour tester une telle quantités de lignes.

    Tu n'aurais pas aussi des macro évènementielles, des calculs complexes comme des formules matricielles, des formules sur chacune de tes lignes ?

  5. #5
    Membre habitué
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2018
    Messages : 11
    Par défaut
    En fait c'est plus que quelques secondes, ça met en charge le processeur sans fin..

    Si je fait "echap" quelques secondes après avoir lancé le programme (quand le processeur commence à monter en charge), ça marche..

    Et non je n'ai rien de tout ça, justement, c'est ce qui m'étonne! Le plus étonnant, comme je l'ai mis dans mon premier post, c'est que si je mets un "stop" dans mon programme APRÈS avoir cherché la valeur RefLM dans le gros tableau (ce qui est censé prendre le plus de temps), ça ne rame pas. Ca rame au niveau des dernières lignes du programme, quand je renseigne les cases de la ligne correspondante avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Application.Cells(LigneRef, 1).Value = RefLM
    Application.Cells(LigneRef, 2).Value = CapaLin
    Application.Cells(LigneRef, 4).Value = DateModif
    Application.Cells(LigneRef, 5).Value = NomPers
    C'est ce bloc qui fait tout ramer.. c'est ce que je ne comprends pas!

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Déjà dans le code il y a un gros souci de logique au niveau des lignes n°25 à 27
    devant toutes être dans le même bloc d'instructions If !

    L'exécution de ce code est déjà ralenti par l'utilisation d'une boucle,
    à remplacer par exemple par la méthode Range.Find ou encore comme dans la
    démonstration suivante par Match correspondant à la fonction de feuille de calculs EQUIV :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub LancementProgramme2()
       Dim RefLM As Long, V
           RefLM = TextBox1.Value
               V = Application.Match(RefLM, ActiveSheet.UsedRange.Columns(1), 0)
    If IsError(V) Then
        If MsgBox("La référence que vous avez renseigné n'est pas dans le tableau, voulez-vous créer une nouvelle référence?", vbYesNo, "Attention") = vbNo Then Exit Sub
        V = Cells(Rows.Count, 1).End(xlUp).Row + 1
    End If
        Cells(V, 1).Resize(, 2).Value = Array(RefLM, TextBox2.Value)
        Cells(V, 4).Resize(, 2).Value = Array(TextBox3.Value, TextBox4.Value)
    End Sub
    ___________________________________________________________________________________________________________

         Merci de cliquer sur en bas à droite de chaque message ayant aidé puis sur pour clore cette discussion …

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/06/2016, 18h08
  2. code VBA qui ne marche pas
    Par mimicha2000 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/07/2015, 19h51
  3. [XL-2010] Code VBA: somme de cellules avec boucle unique
    Par Thomas4530 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/01/2014, 05h16
  4. Réponses: 4
    Dernier message: 13/10/2005, 14h44
  5. Réponses: 2
    Dernier message: 22/09/2005, 10h05

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