2011 à 2016 : gros problèmes macro

Bonjour,

Je me permets de déposer un message car je rencontre 3 problèmes en tentant d'adapter un fichier avec des macros réalisé sur excel 2011 qui marchait très bien et qui buggue sur la version 2016.

Je précise que je suis sur Mac.

Problème 1 :

J'avais créé une macro sur excel 2011 pour réduire et masquer des cellules.

La macro marchait parfaitement sur excel 2011 et était très rapide.

En passant sur 2016, ça marche mais j'ai un énorme ralentissement : 5 fois plus long...

Voici la macro :

Sub Masque_lig() ' masque les lignes ou la valeur dans les cellules de la colonne I sont =0

Application.ScreenUpdating = False

Sheets("DEVIS OK").Select

Set a = Range("I28", Range("I170").End(xlUp))

Set b = Range("J28", Range("J170").End(xlUp))

Union(a, b).Select

For Each cellule In Selection

If cellule.Value = "0" Then cellule.EntireRow.Hidden = True

Next cellule

Range("C26:F200").Select

Selection.NumberFormat = ";;;"

Application.ScreenUpdating = True

Range("B27").Select

End Sub

Quelqu'un aurait une idée de comment l'accélérer ?

2ème problème : ma macro créant un pdf automatique bugue complètement et plante excel 2016 (elle fait planter la mise en page et me met un message d'erreur) :

Sub RecordPDF()

Application.ScreenUpdating = False

Dim LeRep As String, LeNom As String, LeClient As String, LaDate As String

LeRep = ThisWorkbook.Path & Application.PathSeparator

LeNom = ThisWorkbook.Name

LeNom = Left(LeNom, Len(LeNom) - 4)

LaDate = Format(Date, "ddmmyyyy")

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, FileName:= _

LeRep & LeNom & "_" & LaDate & ".pdf", Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _

:=False, OpenAfterPublish:=False

Application.ScreenUpdating = True

End Sub

3ème problème :

Mes boutons affectant les macros sont devant des cellules dans un coin de la feuille.

Sur 2011, pas de soucis : je passais la souris sur le bouton et il comprenait que je souhaitais cliquer dessus.

Sur 2016 : je passe la souris sur le bouton, je clique mais la souris me sélectionne la cellule juste en dessous...

Si des âmes généreuses et créatives m'entendent et ont des réponses à ces petites galères, je leur en serai extrêmement reconnaissant !

Un grand merci d'avance !

Marty

Bonjour

Problème 1: Essayez avec ce code

Sub Masque_lig() ' masque les lignes ou la valeur dans les cellules de la colonne I sont =0
Application.ScreenUpdating = False
With Sheets("DEVIS OK")
    Set a = .Range("I28", .Range("I170").End(xlUp))
    Set b = .Range("J28", .Range("J170").End(xlUp))
    Union(a, b).Select
    For Each cellule In Union(a, b)
       If cellule.Value = "0" Then cellule.EntireRow.Hidden = True
    Next cellule
    .Range("C26:F200").NumberFormat = ";;;"
    .Range("B27").Select
End With
Application.ScreenUpdating = True
End Sub

Dans ce code, pourquoi mettez-vous le 0 entre guillemets ??

Problème 2 : Cela plante à quelle ligne ?

Problème 3 : je n'ai pas compris "je passais la souris sur le bouton", que voulez vous dire ? Le mieux serait de voir le fichier ou une vue

Cordialement

Bonjour,

Merci beaucoup pour votre réponse.

Concernant le 1er problème, je viens d'essayer votre code. C'est toujours très très lent, rien ne change.

Le 2ème problème : lorsque je lance la macro, il ne crée pas le pdf, il me signale une erreur : "d'exécution 1004 Document non enregistré. Le document est peut être ouvert ou une erreur s'est produite lors de l'enregistrement".

Et quand je retrouve mon doc excel, toute la mise en page est erronée : mon document déborde sur 2 pages en largeur...

Concernant le 3ème problème : c'est simplement que mes boutons affectant les macros sont placés sur la feuille de calcul donc devant des cellules. Si je veux cliquer dessus pour activer la macro du bouton, excel sélectionne la cellule sous le bouton au lieu d'activer le bouton et pourtant il change bien l'icone de la souris en doigt pointé dès lors que j'approche la souris du bouton, je sais pas si c'est très clair...

Merci encore pour votre aide.

Re

Je peux avoir votre fichier ??

Cordialement

Bonjour,

Voici le fichier en question avec les 3 boutons.

Le bouton POSTE SELECTIONNE permet de ne faire apparaitre que les cellules pour lesquelles une valeur est entrée dans "nbre de jours".

Le bouton TOUS LES POSTES permet d'afficher la totalité des postes.

Je reprécise que je suis sur Mac / Excel 2016.

Merci beaucoup pour votre aide,

Cordialement,

Marty

Bonjour,

pour le 1) peux-tu tester en mettant Application.Cursor = xlWait au début,

rétablir avec Application.Cursor = xlDefault à la fin

eric

Bonjour,

Merci, je viens de tester mais cela ne change rien : toujours aussi lent.

Ne faut il pas repenser la formule écrite autrement ?

Merci pour votre aide.

2016 a des ralentissements bizarres, une des cause constatées, aussi étrange que cela paraisse, était la présence du curseur souris sur la fenêtre...

Une façon d’accélérer est de déclarer et typer ses variables, et de prohiber tout .Select inutile, très chronophages.

Par exemple on n'écrit pas

    Range("C26:F200").Select
    Selection.NumberFormat = ";;;"

mais

    Range("C26:F200").NumberFormat = ";;;"

et on évite des lignes inutiles. A quoi sert de remettre un format que personne n'est sensé modifier ???

Et pour ta partie plus spécifique de masquage des lignes, lire les cellules une à une est lent, masquer les lignes une à une est lent.

Donc lire en une fois la plage intéressante (d'ailleurs pourquoi regardes-tu I ET J, 2 fois plus de cellules, alors que c'est H qui t'intéresse ?), noter les lignes et tout masquer d'un coup :

Sub Masque_lig()  ' masque les lignes ou la valeur dans les cellules de la colonne I sont =0
    Dim datas, pl As Range, lig As Long
    Sheets("DEVIS OK").Select
    datas = Range("H29").Resize(Range("C170").End(xlUp).Row - 28).Value
    For lig = 1 To UBound(datas)
        If datas(lig, 1) = 0 Then
            If pl Is Nothing Then Set pl = Rows(lig + 28) Else Set pl = Union(pl, Rows(lig + 28))
        End If
    Next lig
    pl.EntireRow.Hidden = True
    Range("C26:F200").Select
    Selection.NumberFormat = ";;;"
    Application.ScreenUpdating = True
    Range("B27").Select
    Set pl = Nothing
End Sub

De façon plus simple tu pourrais mettre un filtre auto sur la ligne de titres, c'est prévu pour ça.

eric

Bonjour et merci !

En fait je me suis mal exprimé (même trompé, désolé...) : l'idée c'est que la macro détecte dans les colonnes I et J les cellules vides et ne fait apparaitre que les lignes dont les cellules I et J sont remplies.

et ne fait apparaitre que les lignes dont les cellules I et J sont remplies.

ET ça veut dire les 2 remplies...

Donc tu peux tout masquer car aucune ligne ne rempli ce critère.

eric

Bonjour

Je ne vous ai pas oublié...

Concernant le 1er problème, je viens d'essayer votre code. C'est toujours très très lent, rien ne change.

Le fichier ne contient pas le code que je vous avais proposé. Avez-vous fait le test ?

Dans le fichier, en première ligne du code il manque également la ligne Application.screenupdating = False

Je pense que votre problème vient de recalcul qu'Excel fait à l'arrière plan et suspendre ce calcul (par ceci :Application.Calculation = xlCalculationManual) pendant l'exécution du code, ne donne pas le même résultat.

Essayez avec ce code

Sub Masque_lig() ' masque les lignes ou la valeur dans les cellules de la colonne I sont =0
Dim i as integer
Application.ScreenUpdating = False
With Sheets("DEVIS OK")
For i = 28 To .Range("I" & .Rows.Count).End(xlUp).Row
    If .Range("J" & i) = 0 And .Range("I" & i) = 0 Then Rows(i).EntireRow.Hidden = True
Next i
End With
Application.ScreenUpdating = True
End Sub

La présentation en colonne J est un peu différente en dessous mais l'info y est

A vous relire

Cordialement

Bonjour Dan,

J'ai testé et c'est toujours aussi lent...

Merci encore pour votre aide.

Bonjour Eriiic,

J'ai du sans doute mal m'exprimer :

Mon document comporte une liste de postes.

Certaines lignes sont remplies, d'autres pas, en fonction des besoins d'un projet.

La macro permet en 1 clic de ne faire apparaitre que les lignes dont les cellules en colonnes I et J sont remplies), c a d uniquement les postes qui vont travailler sur le projet.

Voici 2 copies d'écrans pour mieux comprendre :

  • 1 quand il y a tous les postes ceux qui ne sont pas sélectionnés pour le projet et ceux qui sont sélectionnés (c a d qui vont travailler un certain nombre de jours)
  • 1 quand j'active la macro qui ne fait apparaitre que ceux qui ont un nombre de jours travaillés (les autres qui n'interviennent pas sur le projet sont masqués).

Est ce que vous comprenez ce que je veux dire ?

capture d ecran 2018 02 17 a 19 12 25 capture d ecran 2018 02 17 a 19 14 54

Re

Bete question mais quand vous exécutez le code vous êtes en mode Page ou e Mode normal sur votre feuille ?

et est-ce que le code que je vous ai proposé donne le bon résultat final ?

Cordialement

Bonjour,

J'avais bien compris, du moins interprété.

Je voulais et faire prendre conscience de l'importance des mots dans une demande.

ET ne veux pas dire OU, tu veux donc :

et ne fait apparaitre que les lignes dont les cellules I OU J sont remplies.

A tester :

Sub Masque_lig()  ' masque les lignes ou la valeur dans les cellules de la colonne I sont =0
    Dim datas, pl As Range, lig As Long
    Sheets("DEVIS OK").Select
    datas = Range("I29").Resize(Range("C170").End(xlUp).Row - 28, 2).Value
    For lig = 1 To UBound(datas)
        If datas(lig, 1) = 0 And datas(lig, 2) = 0 Then
            If pl Is Nothing Then Set pl = Rows(lig + 28) Else Set pl = Union(pl, Rows(lig + 28))
        End If
    Next lig
    pl.EntireRow.Hidden = True
    Range("C26:F200").Select
    Selection.NumberFormat = ";;;"
    Application.ScreenUpdating = True
    Range("B27").Select
    Set pl = Nothing
End Sub

eric

Mille mercis !

@ Eric : votre proposition fonctionne parfaitement ! Et super rapide pour ne pas dire immédiat. En mode page comme en mode normal.

@ Dan : effectivement : j'étais en mode page qui est très lent mais si je passe en mode normal, ça marche en instantané ! Par contre ça va chercher les cellules, jusqu'en bas du coup, problème de mise en page avec le bas de page...

Merci beaucoup à vous !

Et désolé si j'étais imprécis dans ma demande...

Avez vous une idée concernant le problème de macro d'export PDF ?

(Message d'erreur, le pdf ne sort pas et en plus après le lancement de la macro, la mise en page du classeur se décale sur 2 pages en largeur (élargissement des colonnes a b c d...).

Chose étrange : si "j'enregistre sous" en format PDF : ça buggue. Si je crée le pdf en passant par l'impression, ça marche...

re

Avez vous une idée concernant le problème de macro d'export PDF ?

Je n'ai pas la version 2016 chez moi mais à la lecture je pense que vous pourriez adapter votre code à celui repris dans ce lien -> Sub SaveActiveSheetAsPDFInMacExcel2016()

Dites moi

Cordialement

Bonjour,

Merci pour le lien, j'avais trouvé aussi ce lien, je reteste sur plusieurs fichiers mais il me semble que ça buggue...

Je soupçonne le fait d'avoir un fichier travaillé initialement sur 2011 et importer ensuite sur 2016. (corruption possible ?) Je vais tester sur un fichier clean.

Je vous tiens au courant !

merci encore !

re

Pour le fait de l'avoir importé dans 2016, je ne pense pas que ce soit le souci. Il faut bien suivre la procédure donnée dans le lien surtout.

J'attends votre retour car je ne peux pas faire le test vu que je n'ai que Excel 2011

Cordialement

Rechercher des sujets similaires à "2011 2016 gros problemes macro"