Autres Pb d'affichage d'un objet

JPaul78

XLDnaute Nouveau
Bonjour à tous,
J'ai créé un objet "Shapes("Message_Attente")" que je rend visible au démarrage d'un processus puis invisible à la fin de ce processus.
Le pb est que dans un cas il n'apparait pas et dans l'autre cas cela fonctionne bien.
Le contexte: J'ai une feuille d'entête où J'ai le fameux shapes et 2 boutons, l'un pour rafraichir les requêtes de Powerquery et l'autre pour la sauvegarde du fichier (code des boutons ci-après). j'utilise le même shapes("message_attente"), où je ne modifie que le texte en fonction du bouton. Je n'ai aucun pb pour faire apparaitre le message dans le cas "Private Sub Bouton_Actualiser_Click" mais impossible de le faire apparaitre dans le cas "Private Sub Bouton_Sauvegarde_Click()" alors qu'il finit par apparaitre en toute fin de processus lorsque je fait apparaitre une msgbox qui annonce que le traitement est terminé. Je met aussi le sous-pgm appelé car il doit avoir une influence.
A part ce pb d'affichage tout fonctionne et j'ai de moins en moins de cheveux!
Merci de vos éclairages et d'une solution possible, car là je piétine depuis quelque jours!
Amicalement
JPaul
VB:
'Bouton d'actualisation des datas
'pas de pb d'affichage du message d'attente
Private Sub Bouton_Actualiser_Click()
Dim Message As String

On Error GoTo ErreuR
'"Data_Message" est une variable pour changer le temp à afficher(1mn 20 sec.)
Message = "Mise à jour des données en cours." & vbCrLf & _
            "Temps estimé à " & [Data_Message] & vbCrLf & _
            "Merci de patienter..."

With ws_Entete
    .Unprotect
    .Shapes("Message_Attente").TextFrame2.TextRange.Characters.Text = Message
    .Shapes("Message_Attente").Visible = True
    .Select
    ActiveWorkbook.RefreshAll 'MàJ des requetes powerqueries
    [Date_MaJ] = Date
    .Protect
    .Shapes("Message_Attente").Visible = False
End With

MsgBox "Données actualisées", vbInformation, "Information traitement"

'gestion des erreurs
On Error GoTo 0
Exit Sub
ErreuR:
MsgBox Err.Description & " dans le module d'actualisation des données", vbCritical, "Affichage de l'erreur"
End Sub

'Bouton sauvegarde de l'ensemble des données indicateurs
'version dont l'affichage du message d'attente ne fonctionne pas
Private Sub Bouton_Sauvegarde_Click()
Dim Message As String

Application.Caption = "Sauvegarde en cours"
'l'affichage du message ne marche pas
Message = "Sauvegarde en cours." & vbCrLf & "Merci de patienter..."
With ws_Entete
    .Unprotect
    .Shapes("Message_Attente").TextFrame2.TextRange.Characters.Text = Message
    .Shapes("Message_Attente").Visible = True
    .Select
End With

Application.ScreenUpdating = False
Sauvegarde_V2 'Routine dans un module qui sauvegarde feuille à feuille ce fichier et qui sup. boutons, liaisons et requetes, code VBA (voir plus bas)

Application.Caption = ""
ws_Entete.Shapes("Message_Attente").Visible = False
End Sub

'**********************************************************************************************************
'sauvegarde dans un fichier xlsx avec supression des macros et requetes
Sub Sauvegarde_V2()
Dim CL1 As Workbook
Dim CL2 As Workbook
Dim LaFeuille As Worksheet
Dim Nom_Sauvegarde As String
Dim Connexion As Object

Set CL1 = ThisWorkbook
Set CL2 = Workbooks.Add

Application.ScreenUpdating = False

CL1.Worksheets(1).Unprotect

'recopie de tout les onglets visible dans le classeur sauvegarde
For Each LaFeuille In CL1.Worksheets
    If LaFeuille.Visible = True Then
        LaFeuille.Copy After:=CL2.Worksheets(CL2.Worksheets.Count)
    End If
Next

'sup.de la feuille 1 crée au démarrage du classeur sauvegarde
Application.DisplayAlerts = False
CL2.Worksheets(1).Delete
Application.DisplayAlerts = True

'supprimer les liaisons du classeur sauvegarde
If Not IsEmpty(CL2.LinkSources(xlExcelLinks)) Then
    For Each X In CL2.LinkSources(xlExcelLinks)
        CL2.BreakLink Name:=X, Type:=xlExcelLinks
    Next
End If

'suppression des requetes powerquery du classeur sauvegarde
Dim cn As WorkbookConnection, qry As WorkbookQuery
    For Each cn In CL2.Connections
        cn.Delete
    Next cn
    For Each qry In CL2.Queries
        qry.Delete
    Next qry
   
'supprime le code vba du classeur sauvegarde
Set VBComps = CL2.VBProject.VBComponents

For Each VBComp In VBComps
   Select Case VBComp.Type
      Case vbext_ct_StdModule, vbext_ct_MSForm, _
            vbext_ct_ClassModule
         VBComps.Remove VBComp
      Case Else
         With VBComp.CodeModule
            .DeleteLines 1, .CountOfLines
         End With
   End Select
Next VBComp

'supprime les boutons de l'entete du classeur sauvegarde
'CL2.Worksheets(1).Activate
With CL2.Worksheets(1)
    .Select
    .Unprotect
    .Shapes("Bouton_Actualiser").Delete
    .Shapes("Bouton_Sauvegarde").Delete
    .Shapes("Bouton_Imprim").Delete
    .Shapes("Message_Attente").Delete
    .Protect
End With

'sauvegarde du classeur sauvegarde
Nom_Sauvegarde = ThisWorkbook.Path & "\Sauvegarde Indicateurs_" & Format(Date, "yyyy_mm_dd") & ".xlsx"

Application.DisplayAlerts = False
CL2.SaveAs Nom_Sauvegarde
CL2.Close
Application.DisplayAlerts = True

Set CL1 = Nothing
Set CL2 = Nothing

Application.ScreenUpdating = True
MsgBox "La sauvegarde a bien été effectuée", vbInformation + vbOKOnly

ws_Entete.Protect
End Sub
 
Solution
Bonsoir.
À tout hasard ajoutez un DoEvents juste avant ThisWorkbook.RefreshAll
Beaucoup d'opérations jugées peu urgentes sont différées jusqu'après exécution des macros.
DoEvent force à exécuter de suite toutes les demande de tâches en attente de l'occasion de les finaliser.

Dranreb

XLDnaute Barbatruc
Bonsoir.
À tout hasard ajoutez un DoEvents juste avant ThisWorkbook.RefreshAll
Beaucoup d'opérations jugées peu urgentes sont différées jusqu'après exécution des macros.
DoEvent force à exécuter de suite toutes les demande de tâches en attente de l'occasion de les finaliser.
 
Dernière édition:

JPaul78

XLDnaute Nouveau
Bonjour Dranred,
Merci bcp pour ce retour, mais c'est la partie dont l'affichage fonctionne.
Je n'ai jamais utilisé la commande DoEvent mais j'ai testé ta proposition dans la partie KO du PGM.
J'ai donc mis le DoEvents entre le "end with" qui tentait d'afficher le message et le "Application.ScreenUpdating = False" juste avant l'appel à la procédure.
Cela fonctionne! Merci beaucoup Dranred!
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
311 722
Messages
2 081 930
Membres
101 843
dernier inscrit
Thaly