Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Copier fige Excel si classeur contenant des macros

TIGER

XLDnaute Nouveau
Bonjour à toutes et tous,

Je rencontre ce problème sur 2 PC qui tournent sous win10/Excel 365. Cela peut se produire avec différents fichiers contenant des macros.

La durée du "figeage" est variable.

S'il n'y a que le fichier en question je n'ai pas le problème, s'il y a un second classeur ouvert j'ai le problème.

J'ai vu plusieurs causes possibles sur ce forum et sur d'autres et ai tenté plusieurs actions :

- changement d'imprimante par défaut
- Supprimer les MEF conditionnelles
- Mode sans échec -- je peux copier/coller dans tout les sens, même de très grandes quantités de données sans problème
- Du coup arrêter les compléments un à un pour trouver le problème
- Antivirus

Je joins un classeur avec lequel j'ai le problème.

D'avance merci pour votre aide, je sèche.
 

Pièces jointes

  • MEF AUTO.xlsm
    27.1 KB · Affichages: 8
Solution
Bonjour,

Dans le fichier il y avait plusieurs macros de recherche et d'attribution d'un nom à l'imprimante PDF écrites sous cette forme :
VB:
Sub CreerPdf()

    ThisWorkbook.Sheets("CourImp").Select
    For aa = 0 To 9
        Nom = "Bullzip PDF Printer sur Ne0" & aa & ":"
        On Error Resume Next
        Application.ActivePrinter = Nom
        If ActivePrinter = Nom Then Exit For
    Next
    Application.ActivePrinter = "Nom"
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _
                                         "Nom", Collate:=True

End Sub

Nous avons juste réécrit la chose sous la forme :
Code:
Sub CreerPdf()
    Dim Nom As String
    Dim aa As Integer
    
    ThisWorkbook.Sheets("CourImp").Select...

Phil69970

XLDnaute Barbatruc
Bonjour @TIGER

Et si tu nous donnais ton vrai code et que tu nous expliques ce que tu veux vraiment faire.
Car ce que tu nous a donné n'a guère de sens exemple:
Tu supprimes 2000 lignes alors que tu transfères tes lignes 1 à 1 donc tu ne pourras jamais avoir plus de 1 ligne à supprimer

De plus ton code à besoin de nettoyage....

VB:
    Sheets("Resultat").Select
    Rows("2:2000").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlUp

qui pourrait être remplacer par :

Sheets("Resultat").Rows("2:2000").Delete

*On peut se passer des select en général
Pour faire une action même sur une autre feuille on a pas besoin d'y aller "sans bouger" de feuille on peut le faire....

De même tu peux placer en début de code cela fera moins mal au yeux
Application.ScreenUpdating = False

@Phil69970
 

TIGER

XLDnaute Nouveau
Bonjour Phil et merci pour ta réponse.

Je ne suis pas un pro du code et ai pris vraiment un petit fichier exemple pour montrer que le plantage n'arrivait pas qu'avec de gros fichier.

D'ailleurs as tu eu le problème pendant l'utilisation ?
Je précise que lorsque le freeze se produit le processeur et la mémoire sont loin d'être saturés et que les PC tiennent la route (I7, 8Go de Ram et DD SSD).

nb : merci pour les conseils de code; je vais appliquer
nb2 :
VB:
Application.ScreenUpdating = False
je viens d'essayer mais cela rallonge considérablement le temps de traitement
 
Dernière édition:

Phil69970

XLDnaute Barbatruc
Re

D'ailleurs as tu eu le problème pendant l'utilisation ?
Non pas du tout

VB:
VB:
Application.ScreenUpdating = False
je viens d'essayer mais cela rallonge considérablement le temps de traitement D
Au contraire cela devrait diminue considérablement le temps de traitement en évitant de voir les allers retours entre les feuilles.


Pas de réponse à cela :

En rationalisant ton code il en sera que plus efficace et rapide.
C'est comme si pour aller prendre le pain tu fais le tour de la ville pour revenir à la boulangerie qui est au coin de la rue .... (C'est ton code actuel)
Il est nettement plus rapide d'aller directement au coin de la rue ....

@Phil69970
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Si vos macros figent excel quand plusieurs classeurs sont ouverts, c'est probablement à cause du fait que vos macro ne référence ni le classeur sur lequel elle travaillent ni sur quelle feuille.
VB:
Range("E2").Select ' De quelle feuille de quel classeur ?
    ActiveCell.FormulaR1C1 = "=IF(RC[-2]<0,-RC[-2],"""")"

Code:
'Déclaration d'une feuille de travail
Dim Ws as Worksheet
''
' Initialisation de la feuille sur laquelle la macro va travailler
Set Ws = ThisWorkbook.Sheets("CopieEcran")
'
' Travail sur la cellule E2 de la feuille référencée
Ws.Range("E2").FormulaR1C1 = "=IF(RC[-2]<0,-RC[-2],"""")"
'
' Pour faire plusieur tâches sur la même feuille:
With Ws 'objet parent
    ' le . va précéder le référencement des enfants de Ws
    .Range("E2").FormulaR1C1 = "=IF(RC[-2]<0,-RC[-2],"""")"
      .Range("F2").FormulaR1C1 = "=IF(RC[-3]>0,RC[-3],"""")"
    '
    ' La ligne ci-dessous n'a rien à voir avec votre macro, c'est juste un exemple
    ' Lorsqu'on on fait, dans un Block With...End With
    ' référence à un objet qui ne lui est pas enfant (une autre feuille par exemple)
    ' il faut qualifier complétement cet objet en faisant référence à ses objets parents.
    ' Ci dessous .Range("A1") appartient à Ws (objet parent du block With..End With)
    ' Mais la feuille 'Destination' ne lui appartient pas aussi on fait référence explicitement
    ' à son parent (le classeur qui contient la macro pour ici)
    .Range("A1").CurrentRegion.Copy Destination:= Thisworkbook.Sheets("Destination").Range("W392")
 
 
    End With

Je n'ai pas corrigé votre macro. Par contre je vous en ai préparé une qui prend les données de la feuille 'Test' dans un tableau en mémoire, les retravaille et les copie dans la feuille résultats et résultats (2)

La feuille Resultats (2) comporte un tableau structuré nommé 'T_Résultats'.
Travailler sur ce type de tableau vous permettrait de vous abstraire de l'obligation de mise en forme de vos lignes par VBA, ce qui prend toujours du temps.

si vous ne connaissez pas les tableaux structuré, voyez ce tuto:
Dans le classeur joint, cliquez sur le bouton 'Récupérer les données de Test', elle seront transférées après traitement dans la feuille résultat et dans la feuille 'Résulta (2)

Cordialement
 

Pièces jointes

  • MEF AUTO.xlsm
    41.8 KB · Affichages: 2

TIGER

XLDnaute Nouveau
Merci à vous 2 pour les réponses.
Je suis en train de lire le tuto sur les tableaux structurés et en effet je ne connaissais pas. Très bien fait en tout cas.
Je prends le temps de bien tout lire et mettre en place et reviens vous donner des nouvelles.
 

TIGER

XLDnaute Nouveau
Bonjour,
Je suis en train de revoir le code de tout le classeur et il y en a une tonne, pour simplifier est-ce que le code ci-dessous est ok ? :

VB:
    Sub L_T2410M()
        ThisWorkbook.Sheets("LienMail").Select
        Range("C33:D33").Copy
        Range("F1").Select
        ActiveSheet.Paste
        Columns("F:F").EntireColumn.AutoFit
        Columns("G:G").ColumnWidth = 7.14
        Selection.Copy
        ThisWorkbook.Sheets("DocImprimante").Select
    End Sub

ou il faut déclarer à chaque fois la feuille :

VB:
    Sub L_T2410M()
        With ThisWorkbook
        .Sheets("LienMail").Select
        Range("C33:D33").Copy
        Range("F1").Select
        ActiveSheet.Paste
        Columns("F:F").EntireColumn.AutoFit
        Columns("G:G").ColumnWidth = 7.14
        Selection.Copy
        .Sheets("DocImprimante").Select
        End With
    End Sub

nb : je fais déjà cette partie pour débloquer la situation et je passerai en tableau structuré dans un second temps car il y en a pour un moment !
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Euh, si la macro était complète, cela permettrait de vous suivre....

Que doit-il se passer sur la feuille DocImprimante?
Je suppose, le collage de la copie de la cellule F1 de la feuille LienMail. Non ?

Ce que je crois comprendre de votre macro que vous n'avez même pas commenté

VB:
Sub L_T2410M()
    
        With ThisWorkbook.Sheets("LienMail")
            'Copier C33:D33 vers F1:G1 de la même feuille
            .Range("C33:D33").Copy Destination:=.Range("F1:G1")
            
            ' Puis F1:G1 vers la feuille DocImprimante.
            ' Quelles cellules de destination ???? on en sait rie
            .Range("F1:G1").Copy ThisWorkbook.Sheets("DocImprimante").Range("A1")
            '
            ' Réaranger les largeurs de colonnes en automatique pour F et à 7.14 pour G
            .Columns("F:F").EntireColumn.AutoFit
            .Columns("G:G").ColumnWidth = 7.14
        End With
    End Sub

Etudiez un tuto vba excel. Je ne vais pas passer mon temps à réécrire vos codes.
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

Un conseil en passant
Quand un classeur commence à faire tousser Excel ou prend un embonpoint plus que considérable, je me prends pour Raoul Volfoni.
"Mais moi les les classeurs, j'les soigne, j'm'en vais lui faire une ordonnance, et une sévère, j'vais lui montrer qui c'est Raoul. Aux quatre coins de mon VBE qu'on va l'retrouver, éparpillé par petits bouts façon puzzle... Moi quand on m'en fait trop j'correctionne plus, j'dynamite... J'disperse... Et j'ventile..."

Bref, j'exporte le VBA présent dans le worbook souffreteux.
Puis je créé un classeur tout neuf.
Et petit bout par petit bout, je remets les portions de code en testant à chaque fois la procédure réintégrée pour voir à partir de quand le problème réapparait.

NB: Je suis d'accord avec mes camarades de jeux (éviter les Select et Activate le plus possible)
 

TIGER

XLDnaute Nouveau
Oups, désolé de vous agacer à ce point.
Pour moi le contenu n'avait que peu d'importance, je voulais juste valider le fait que pour les "petites" macros nous pouvions nous affranchir du "with".

Bonne idée Staple, je vais mettre en pratique.

Merci à tous.
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Si le but est d'éviter les With...End With alors référencez vos objets dans des variables.

VB:
Dim Wk as workbook
Set Wk = ThisWorkbook
Code:
Dim Ws as WorkSheet
Set Ws = ThisWorkBook.Sheets("LaFeuille")
' Ou si vous avez référencé un classeur
Set Ws = Wk.Sheets("LaFeuille")

Code:
Ws.Range("A1").Copy Wk.Sheets("Destination").Range("Y789")

Les situations et leurs combinaisons possibles sont nombreuses et je ne vais pas les énumérer ici, ce n'est pas l'objet du forum.

A vous de vous entrainer.
 

TIGER

XLDnaute Nouveau
Ok merci Hasco.

pour répondre à Phil69970, j'essaye d'enlever le plus possible de select mais ça ne fonctionne pas toujours

exemple qui fonctionne, avec un classeur contenant 2 feuilles et afin d'adapter la taille des feuilles aux écrans :
VB:
Sub ZoomSurSelectionOK()

    With ThisWorkbook
    
    .Sheets("Feuil1").Select
    Range("A1:k25").Select
    ActiveWindow.Zoom = True
    
    .Sheets("Feuil2").Select
    Range("A1:j9").Select
    ActiveWindow.Zoom = True
    
    End With
End Sub

exemple qui ne fonctionne pas :

VB:
Sub ZoomSurSelectionHS()

    With ThisWorkbook
    
    .Sheets("Feuil1").Range("A1:k25").Select
    ActiveWindow.Zoom = True
    
    .Sheets("Feuil2").Range("A1:j9").Select
    ActiveWindow.Zoom = True
    
    End With
End Sub

Dans cet exemple la première feuille se met bien à la dimension mais la 2nde bug : La méthode select de la classe range à échouer.
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

La question soulevée dans le post#1 a largement été traitée.

Votre question dépasse l'objet du titre de cette discussion, créez une nouvelle discussion, conformément à ce que suggère la charte du forum, ou revenez à l'objet du titre de celle-ci
 

TIGER

XLDnaute Nouveau
Alors pas vraiment d'accord avec vous Hasco car Phil69970 pense que le problème peut venir également des select et donc j'explique pourquoi je suis obligé d'en utiliser dans le classeur qui pose problème et que je suis en train de retravailler au mieux en suivant vos précieux conseils.

Je vais rechercher sur le forum pour trouver la solution à cela, merci.

Edit : Ok j'ai compris pourquoi il était nécessaire de sélectionner d'abord la feuille puis les cellules. Je n'ai donc pas d'autre choix que de laisser le select dans ce cas de figure
 
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…