Excel cesse de fonctionner
Résolu/Fermé
will_1234
Messages postés
7
Date d'inscription
lundi 2 février 2015
Statut
Membre
Dernière intervention
18 juillet 2017
-
17 juil. 2017 à 19:01
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 18 juil. 2017 à 17:59
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 18 juil. 2017 à 17:59
A voir également:
- Excel a cessé de fonctionner
- Liste déroulante excel - Guide
- Fonction si et excel - Guide
- Aller à la ligne excel - Guide
- Word et excel gratuit - Guide
- Déplacer une colonne excel - Guide
4 réponses
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
17 juil. 2017 à 21:44
17 juil. 2017 à 21:44
Bonjour,
Il faut éviter l'emploi de Select, Selection et ActiveCell
Éviter aussi le Copy /Insert via le Presse papier (ou vider le Presse papier avant la copie mais ça marche pas à 100%).
Il faut éviter l'emploi de Select, Selection et ActiveCell
Éviter aussi le Copy /Insert via le Presse papier (ou vider le Presse papier avant la copie mais ça marche pas à 100%).
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 714
17 juil. 2017 à 21:50
17 juil. 2017 à 21:50
Bonjour à tous,
En suivant les indications judicieuses de Patrice (que je salue), voici ta macro écrite autrement. Essaies de voir si cela répare ton problème.
En suivant les indications judicieuses de Patrice (que je salue), voici ta macro écrite autrement. Essaies de voir si cela répare ton problème.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) With Application .ScreenUpdating = False .Calculation = xlManual End With Cancel = True If Target.Column = 4 Then With Target .Offset(1, 0).EntireRow.Insert Shift:=xlDown Rows(.Row).Resize(2).FillDown .Offset(1, 6).ClearContents .Offset(1, 2).Resize(1, 2).ClearContents .Offset(1, 0).ClearContents .Offset(1, 0).Activate End With End If With Application .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub
Bonjour,
Voici une version légèrement optimisée du code de gbinforme :
NB : Application.ScreenUpdating = True est implicite et automatique
avant la sortie d'une sub, donc inutile de le mettre explicitement.
Voici une version légèrement optimisée du code de gbinforme :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column <> 4 Then Exit Sub With Application .ScreenUpdating = False: .Calculation = xlManual End With With Target .Offset(1, 0).EntireRow.Insert Shift:=xlDown Rows(.Row).Resize(2).FillDown .Offset(1).ClearContents .Offset(1, 2).Resize(, 2).ClearContents .Offset(1, 6).ClearContents .Offset(1).Activate End With Application.Calculation = xlAutomatic End Sub
NB : Application.ScreenUpdating = True est implicite et automatique
avant la sortie d'une sub, donc inutile de le mettre explicitement.
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 714
17 juil. 2017 à 23:00
17 juil. 2017 à 23:00
Bonsoir steve,
True est implicite et automatique avant la sortie d'une sub,
Ton assertion est très sujette à caution car ce n'est pas ce que dit Microsoft
https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.screenupdating?redirectedfrom=MSDN
Une fois l'exécution de la macro terminée, songez à redéfinir la propriété ScreenUpdating sur True.
Je te confirme d'ailleurs que si tu oublies de le remettre tu risques dans certains cas de chercher longtemps pourquoi tu n'as pas de résultat.
True est implicite et automatique avant la sortie d'une sub,
Ton assertion est très sujette à caution car ce n'est pas ce que dit Microsoft
https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.screenupdating?redirectedfrom=MSDN
Une fois l'exécution de la macro terminée, songez à redéfinir la propriété ScreenUpdating sur True.
Je te confirme d'ailleurs que si tu oublies de le remettre tu risques dans certains cas de chercher longtemps pourquoi tu n'as pas de résultat.
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
Modifié le 17 juil. 2017 à 23:02
Modifié le 17 juil. 2017 à 23:02
Ce code pseudo-optimisé est loin d'être aussi bien écrit que celui de gbinforme (bonsoir à toi).
Quand on code proprement on évite tout ce qui est implicite !!!
Quand on code proprement on évite tout ce qui est implicite !!!
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
17 juil. 2017 à 23:14
17 juil. 2017 à 23:14
Steve, pour le ScreenUpdating, regardes ce post :
https://forums.commentcamarche.net/forum/affich-33931181-bug-affichage-suite-a-l-execution-du-code
https://forums.commentcamarche.net/forum/affich-33931181-bug-affichage-suite-a-l-execution-du-code
steve
>
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
Modifié le 18 juil. 2017 à 01:37
Modifié le 18 juil. 2017 à 01:37
Bonsoir gbinforme,
Tu as écris : « Ton assertion est très sujette à caution ».
J'ai commencé à apprendre Excel avec la version 5.0b (bien avant la 2003),
qui était incluse dans Microsoft Office Professionnel Edition (avec Access).
À l'époque, la documentation était en plusieurs gros manuels papier Microsoft,
et c'est dans le manuel Microsoft Excel qu'il était clairement noté ce que j'ai
écrit en NB : « Application.ScreenUpdating = True est implicite et automatique
avant la sortie d'une sub ».
-----------------------------------------------------
J'ai suivi ton lien sur l'article Microsoft ; juste sous le titre, il y a la version :
« Office 2013 et versions ultérieures » ; puis plus bas, il y a effectivement
cette phrase :
Une fois l'exécution de la macro terminée, songez à redéfinir la propriété
ScreenUpdating sur True.
1) L'exemple VBA qui est donné en dessous impose de le mettre car il y a
une MsgBox qui affiche le temps d'exécution de la sub, et à ce moment-là,
l'utilisateur doit pouvoir voir sur la feuille, à l'arrière-plan, des données
correctes (donc actualisées) ; ça ferait mauvais effet, sinon : l'utilisateur
penserait que la sub n'a pas fait son travail ! sans ce MsgBox, l'instruction
« Application.ScreenUpdating = True » est inutile.
2) Pourquoi alors Microsoft a-t-il marqué la phrase du lien ci-dessus ? Je pense
qu'il a juste voulu simplifier l'explication, pour éviter d'avoir à trop détailler :
voir l'exemple du point 1) ci-dessus, qui est aussi ton « dans certains cas ».
En conséquence, je maintiens mon assertion ; après, chacun est libre de
choisir comme bon lui semble ; moi, du moment que ça marche, je vais
continuer à faire de la même façon. ;)
-----------------------------------------------------
En pratique :
Dans la grande majorité des cas, je n'ai jamais besoin de mettre explicitement
Application.ScreenUpdating = True avant la sortie d'une sub : comme disait le manuel, c'est fait implicitement juste avant la sortie d'une sub, donc une fois
l'exécution de la sub terminée, je vois bien tous les résultats attendus :
l'écran est correctement actualisé.
Dans les autres rares cas (comme l'exemple de Microsoft), c'est là que je mets
explicitement Application.ScreenUpdating = True.
J'ai toujours fait ainsi jusqu'à maintenant sans que ça me pose aucun souci,
pour ma version actuelle d'Excel 2007 (et toutes les versions antérieures).
-----------------------------------------------------
Peut-être que ça a changé dans les versions ultérieures ? fais donc l'essai
de ne pas mettre Application.ScreenUpdating = True avant la fin de la sub,
et si les résultats affichés à l'écran sont ceux attendus, alors ce ne sera
donc pas la peine de le mettre ; sauf si tu tiens absolument à écrire
explicitement quelque chose d'implicite, et c'est ton droit : chacun
est libre de programmer comme il préfère. ;)
Cordialement
steve
>
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
Modifié le 18 juil. 2017 à 03:33
Modifié le 18 juil. 2017 à 03:33
Bonsoir Patrice33740,
Dans mon message du 17 juillet à 22:50, j'avais bien précisé d'emblée :
« Voici une version légèrement optimisée du code de gbinforme ».
Contrairement à ce que tu penses, je n'ai pas fait une pseudo-optimisation,
et je prouve les améliorations apportées :
1) Ligne 4 : on sort de suite de la sub si Target.column <> 4 (donc si l'utilisateur
n'a pas cliqué sur une cellule de la colonne D) ; avantage : inutile de faire tout
ce qui suit (y compris les instructions Application.xxx).
2) J'ai volontairement enlevé l'instruction Application.ScreenUpdating = True
qui était inutile : lis mon message à gbinforme du 18 juillet à 1:07 ; je ne vais
pas réécrire ce que j'ai amplement démontré !
3) J'ai remplacé 2 .Offset(1, 0) par .Offset(1) ; en effet, quand un paramètre
vaut 0 (pour cette instruction), c'est inutile de le mettre ; même si c'est pour
la colonne ; exemple : .Offset(, 1) ; note bien la virgule juste après "(" ! et si
Microsoft avait voulu absolument qu'on mette les 2 paramètres, ils seraient
obligatoires et pas facultatifs ; attention : sur une feuille Excel, l'instruction
DECALER() correspondante exige bien les 2 paramètres ; pas en VBA.
4) Lignes 11 à 13 : j'ai modifié l'ordre des 3 .Offset() pour les mettre dans
un ordre plus naturel (car de gauche à droite) : on efface d'abord Dxx,
puis Fxx:Gxx, puis Jxx (où xx est le bon n° de ligne).
===============================
Tu as écris : « Quand on code proprement on évite tout ce qui est implicite !!! » ;
tu as ta façon de programmer et j'ai la mienne ; je considère qu'à condition de
bien savoir ce que l'on fait, on peut éviter de mettre des choses explicites.
Exemple : rien n'interdit d'écrire cette référence explicite complète :
MsgBox Workbooks("Classeur X").Worksheets("Feuil").Range("B2")
Mais si on lance toujours la macro à partir de Feuil1 du Classeur X,
c'est inutile et il suffit de mettre : MsgBox Range("B2") ; et même,
en utilisant la notation abrégée, ça donne : MsgBox [B2] (qui est
strictement équivalent) ; quelle est l'instruction la plus courte et
la plus clairement lisible ? c'est : MsgBox [B2]
-------------------------------------------------------
Pour être sûr qu'une macro se lance depuis la bonne feuille, ici "Feuil1",
mettre en début de macro : If ActiveSheet.Name <> "Feuil1" Then Exit Sub
ou carrément (selon les cas), mettre : Worksheets("Feuil1").Select
S'il y a plusieurs classeurs, alors ajouter un test pour vérifier si on est sur
le bon classeur.
Mais effectivement, il y a des fois où même en procédant à ma façon, je dois
quand même préciser explicitement la feuille ou le classeur à utiliser.
-------------------------------------------------------
Encore une fois, à chacun sa façon de programmer ; en aucun cas tu n'as
le droit de chercher à me dicter la mienne ; et inversement, je n'ai pas à
exiger que tu programmes à ma façon.
Aussi, ta remarque bien péremptoire « Quand on code proprement »
est tout à fait déplacée !
Cordialement
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
18 juil. 2017 à 16:38
18 juil. 2017 à 16:38
Bonjour,
Le code de gbinforme (que je salue) modifié :
Le code de gbinforme (que je salue) modifié :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) With Application .ScreenUpdating = False .Calculation = xlManual End With Cancel = True If Target.Column = 4 Then With Target .Offset(1, 0).EntireRow.Insert Shift:=xlDown Me.Rows(.Row).Resize(2).FillDown .Offset(1, 6).Formula = "" .Offset(1, 2).Resize(1, 2).Formula = "" .Offset(1, 0).Formula = "" .Offset(1, 0).Activate End With End If With Application .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub
will_1234
Messages postés
7
Date d'inscription
lundi 2 février 2015
Statut
Membre
Dernière intervention
18 juillet 2017
18 juil. 2017 à 17:01
18 juil. 2017 à 17:01
UN gros merci, sa semble avoir régler mon problème !
Merci à tous.
PS: Où puis-je apprendre à coder efficacement sous vba ?
Merci à tous.
PS: Où puis-je apprendre à coder efficacement sous vba ?
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
>
will_1234
Messages postés
7
Date d'inscription
lundi 2 février 2015
Statut
Membre
Dernière intervention
18 juillet 2017
18 juil. 2017 à 17:59
18 juil. 2017 à 17:59
« Où puis-je apprendre à coder efficacement sous vba ? »
Avec du temps, beaucoup d'erreurs et de la rigueur.
Comme tu as pu le constater, les erreurs proviennent très souvent d'une forme de codage qui manque de rigueur.
Sur le web on trouve de très nombreux cours VBA, Malheureusement, je n'en connais aucun qui s'affranchisse de l'utilisation de forme de code implicite (simplifié) dans les apprentissages initiaux.
Voici un des meilleurs cours (un peu ancien mais toujours d'actualité) :
ftp://ftp-developpez.com/bidou/Cours/VBA/formationVBA.pdf
Cdt
Patrice
Avec du temps, beaucoup d'erreurs et de la rigueur.
Comme tu as pu le constater, les erreurs proviennent très souvent d'une forme de codage qui manque de rigueur.
Sur le web on trouve de très nombreux cours VBA, Malheureusement, je n'en connais aucun qui s'affranchisse de l'utilisation de forme de code implicite (simplifié) dans les apprentissages initiaux.
Voici un des meilleurs cours (un peu ancien mais toujours d'actualité) :
ftp://ftp-developpez.com/bidou/Cours/VBA/formationVBA.pdf
Cdt
Patrice