Microsoft 365 Macro erreur 438 suite passage sur 365

isataz

XLDnaute Nouveau
Bonjour à tous,

je viens de basculer sur la version 365 et j'ai une erreur 438 "Propriété ou méthode non gérée par cet objet" sur la macro suivante (qui s'exécute quand même) :

VB:
Sub reopen()

Dim wb As Excel.Workbook
Set wb = ThisWorkbook
Dim pth As String
pth = wb.FullName

Application.OnTime Now + TimeValue("00:00:01"), Application.Workbooks.Open(pth)
wb.Close (True)

End Sub

Je suis bien trop novice pour comprendre ce que je dois changer, j'ai donc besoin de votre aide ^^

Merci beaucoup
 
Solution
Bonjour isataz, patricktoulon,

Le code :
VB:
Application.OnTime Now + TimeValue("00:00:01"), Application.Workbooks.Open(pth)
est incorrect sur toute version Excel, celui-ci est très classique et va bien sur toute version :
Code:
Sub reopen()
Application.OnTime Now + TimeValue("00:00:01"), "Ouvrir"
ThisWorkbook.Close True
End Sub

Sub Ouvrir()
MsgBox "Bonsoir"
End Sub
A placer dans un module standard.

A+

job75

XLDnaute Barbatruc
Bonjour isataz, patricktoulon,

Le code :
VB:
Application.OnTime Now + TimeValue("00:00:01"), Application.Workbooks.Open(pth)
est incorrect sur toute version Excel, celui-ci est très classique et va bien sur toute version :
Code:
Sub reopen()
Application.OnTime Now + TimeValue("00:00:01"), "Ouvrir"
ThisWorkbook.Close True
End Sub

Sub Ouvrir()
MsgBox "Bonsoir"
End Sub
A placer dans un module standard.

A+
 

isataz

XLDnaute Nouveau
Bonjour c'est quoi là le but
d'ouvrir le fichier quasiment tout de suite apres sa fermeture ?
Bonjour,
Oui tout ça fait, c'est bien ça.
Dans les étapes précédentes, le fichier est réduit (quelques feuilles supprimées), il est "enregistré sous" et envoyé par mail.
Il faut qu'il s'ouvre directement après ça parce que le travail n'est pas terminé pour l'utilisateur.
 

isataz

XLDnaute Nouveau
Bonjour isataz, patricktoulon,

Le code :
VB:
Application.OnTime Now + TimeValue("00:00:01"), Application.Workbooks.Open(pth)
est incorrect sur toute version Excel, celui-ci est très classique et va bien sur toute version :
Code:
Sub reopen()
Application.OnTime Now + TimeValue("00:00:01"), "Ouvrir"
ThisWorkbook.Close True
End Sub

Sub Ouvrir()
MsgBox "Bonsoir"
End Sub
A placer dans un module standard.

A+

Merci beaucoup @job75, j'ai juste enlevé le MsgBox qui ne me sert pas et ça marche parfaitement bien!
 

isataz

XLDnaute Nouveau
Bonjour @Yeahou

Comme je ne suis pas certaine de bien comprendre où je dois faire le changement, je te mets tout le code (ou presque), ce sera plus clair.
Je souhaite que le fichier de base reste intact. L'utilisateur ouvre le fichier de base, fait ce qu'il a à faire et quand il appuie sur le bouton qui lance la macro "saveAndQuit", le fichier est enregistré sous un nouveau nom et doit donc se rouvrir après l'envoi mail.
Avant de faire partir le mail, je suis obligée de supprimer des données pour réduire la taille du fichier qui frôle les 12Mo, donc je dois bien séparer le fichier de base et le fichier final.


VB:
Sub saveAndQuit()
'bouton fin de traitement

    If MsgBox("Ce fichier va être réduit pour sauvegarde et envoi. Etes-vous prêts à continuer?", vbYesNo, "Tout est fini?") = vbYes Then
    
    Sheets("CLIENT").Range("AX1").Value = "DONE" 'empêche le reset à la réouverture du fichier
    
    Application.ScreenUpdating = False
    
    Call SAVE_DISCOUNTS 'garder les conditions clients
    
    Application.DisplayAlerts = False
    
    On Error Resume Next
    Sheets("discounts").Delete
    Sheets("help").Delete
    On Error GoTo 0

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
        
ThisWorkbook.SaveAs ThisWorkbook.Path & "\" & Sheets("Cover").Range("F17").Value & " - " & Sheets("Cover").Range("D15").Value & " - " & "Tarif Numérique" & " - " & Format(Date, "dd.mm.yyyy") & ".xlsm"
    
      
    Else: End
    End If
    
    Call Envoi_mail

    Call reopen

End Sub

Sub reopen()
Application.OnTime Now + TimeValue("00:00:01"), "Ouvrir"
ThisWorkbook.Close True
End Sub

Sub Ouvrir()

End Sub

Sub Envoi_mail()

Dim chemin As String, fichier As String
 
    chemin = ThisWorkbook.Path
    
 
    Dim MonOutlook As Object
    Dim MonMessage As Object
 
    Set MonOutlook = CreateObject("Outlook.Application")
    Set MonMessage = MonOutlook.CreateItem(0)
 
        MonMessage.To = "yyy.yyy@xxx.com"
        MonMessage.Cc = "yyy.yyy@xxx.com"
        MonMessage.Subject = Sheets("Cover").Range("F17").Value & " - " & Sheets("Cover").Range("D15").Value & " - " & "Tarif Numérique" & " - " & Format(Date, "dd.mm.yyyy")
        MonMessage.body = "Bonjour," & _
                    Chr(13) & Chr(13) & "Merci d'enregistrer ce tarif pour mon client." & _
                    Chr(13) & Chr(13) & "Bonne réception."
        
        MonMessage.Attachments.Add ActiveWorkbook.FullName
        MonMessage.display
 
    Set MonOutlook = Nothing

End Sub
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour
d'accords avec @Yeahou sur ce coup là
c'est bien un savecopyas qu'il faudrait ou un save as mais en xlsx (sans macro )
voir même uniquement les feuille concernée pour le mail
comme ça tu ferme pas le fichier
et pas besoins de truc bancal de fermeture réouverture( Wrong Way;))

propre et net
@Yeahou 👍 je n'y avais pas pensé
 

isataz

XLDnaute Nouveau
J'ai du louper un truc...
J'ai mis donc un savecopyas et mis mon fichier final en .xlsx.
Je me retrouve avec mon fichier de base en pj du mail plutôt que le fichier final, le fichier final qui est bien créé en .xlsx mais qui est fermé et mon fichier de base qui lui reste ouvert (et qui a lui aussi subi la suppression des onglets donc qui devient inutilisable).

Je vais garder mon truc bancal encore un peu, l'urgence c'est que mes utilisateurs ne voient pas de message d'erreur effrayant 😅
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour le fil, le forum

@isataz , j'ai refait tes macros avec un savecopyas
par contre pas testé car pas de fichier de test et je ne sais pas ce que fait ta macro SAVE_DISCOUNTS non fournie.
Je te laisse faire la modif pour le xlsx
si c'est juste quelques feuilles à envoyer, il suffit à la place de ce code de faire un .copy sur ces feuilles et de sauver/fermer l'activeworkbook sous le nom que tu as choisi, ce sera beaucoup plus court.

Bien cordialement, @+
VB:
Public Classeur_Mail$
Sub saveAndQuit()
'bouton fin de traitement

    If MsgBox("Ce fichier va être réduit pour sauvegarde et envoi. Etes-vous prêts à continuer?", vbYesNo, "Tout est fini?") = vbYes Then
        Application.ScreenUpdating = False
        Sheets("CLIENT").Range("AX1").Value = "DONE" 'empêche le reset à la réouverture du fichier
        Classeur_Mail = ThisWorkbook.Path & "\" & Sheets("Cover").Range("F17").Value & " - " & Sheets("Cover").Range("D15").Value & " - " & "Tarif Numérique" & " - " & Format(Date, "dd.mm.yyyy") & ".xlsm"
        ThisWorkbook.SaveCopyAs Classeur_Mail
        Workbooks.Open Classeur_Mail
        On Error Resume Next
        Call SAVE_DISCOUNTS 'garder les conditions clients
        Application.DisplayAlerts = False
        With ActiveWorkbook
            .Sheets("discounts").Delete
            .Sheets("help").Delete
            .Close True
        End With
        Application.ScreenUpdating = True
        Application.DisplayAlerts = True
        On Error GoTo 0
    Else
        Exit Sub
    End If
    Call Envoi_mail
End Sub
Sub Envoi_mail()

Dim chemin As String, fichier As String
 
    chemin = ThisWorkbook.Path
 
 
    Dim MonOutlook As Object
    Dim MonMessage As Object
 
    Set MonOutlook = CreateObject("Outlook.Application")
    Set MonMessage = MonOutlook.CreateItem(0)
 
        MonMessage.To = "yyy.yyy@xxx.com"
        MonMessage.Cc = "yyy.yyy@xxx.com"
        MonMessage.Subject = Sheets("Cover").Range("F17").Value & " - " & Sheets("Cover").Range("D15").Value & " - " & "Tarif Numérique" & " - " & Format(Date, "dd.mm.yyyy")
        MonMessage.body = "Bonjour," & _
                    Chr(13) & Chr(13) & "Merci d'enregistrer ce tarif pour mon client." & _
                    Chr(13) & Chr(13) & "Bonne réception."
     
        MonMessage.Attachments.Add Classeur_Mail
        MonMessage.display
 
    Set MonOutlook = Nothing

End Sub
 
Dernière édition:

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Re,

si c'est juste quelques feuilles à envoyer, il suffit à la place de ce code de faire un .copy sur ces feuilles et de sauver/fermer l'activeworkbook sous le nom que tu as choisi, ce sera beaucoup plus court.
Un truc comme ça !

Bien cordialement, @+
Code:
Public Classeur_Mail$
Sub saveAndQuit()
'bouton fin de traitement

    If MsgBox("Ce fichier va être réduit pour sauvegarde et envoi. Etes-vous prêts à continuer?", vbYesNo, "Tout est fini?") = vbYes Then
        Application.ScreenUpdating = False
        Classeur_Mail = ThisWorkbook.Path & "\" & Sheets("Cover").Range("F17").Value & " - " & Sheets("Cover").Range("D15").Value & " - " & "Tarif Numérique" & " - " & Format(Date, "dd.mm.yyyy") & ".xlsx"
        Sheets("feuil1", "feuil2", "feuil3").Copy
        ActiveWorkbook.SaveAs Classeur_Mail, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        ActiveWorkbook.Close False
        Application.ScreenUpdating = True
    Else
        Exit Sub
    End If
    Call Envoi_mail
End Sub
Sub Envoi_mail()

Dim chemin As String, fichier As String
 
    chemin = ThisWorkbook.Path
    
 
    Dim MonOutlook As Object
    Dim MonMessage As Object
 
    Set MonOutlook = CreateObject("Outlook.Application")
    Set MonMessage = MonOutlook.CreateItem(0)
 
        MonMessage.To = "yyy.yyy@xxx.com"
        MonMessage.Cc = "yyy.yyy@xxx.com"
        MonMessage.Subject = Sheets("Cover").Range("F17").Value & " - " & Sheets("Cover").Range("D15").Value & " - " & "Tarif Numérique" & " - " & Format(Date, "dd.mm.yyyy")
        MonMessage.body = "Bonjour," & _
                    Chr(13) & Chr(13) & "Merci d'enregistrer ce tarif pour mon client." & _
                    Chr(13) & Chr(13) & "Bonne réception."
        
        MonMessage.Attachments.Add Classeur_Mail
        MonMessage.display
 
    Set MonOutlook = Nothing

End Sub
 

isataz

XLDnaute Nouveau
Bonjour @Yeahou , @patricktoulon
Je vous joins un fichier d'exemple qui est quasi l'original (moins pas mal de produits pour la taille acceptée ici) à part que je n'ai laissé qu'un seul client avec de faux % de remise et j'ai laissé les produits avec de faux prix d'achats (donc les marges sont fausses aussi). Pour le reste, normalement je n'ai rien à cacher lol ce sont des infos publiques.

Donc le process actuel quand l'utilisateur ouvre le fichier de base, il fait une mise à 0 du fichier (qui est proposée) pour s'assurer qu'aucune donnée ne traine. Il a ensuite un pop-up pour entrer les infos clients (136592 est le code client test que j'ai laissé). Avec ce code je récupère toutes les remises de tous les produits pour ce client. L'utilisateur a donc l'info sur chaque onglet "marque" et peut cliquer sur un bouton pour copier et remettre toutes ces remises à jour (comme on applique des dates de fin de validité, même s'il n'y a rien à changer, il faut relancer ces remises dans le système à un moment).
Une fois que la partie % est faite, l'utilisateur va sélectionner les produits qu'il veut mettre dans l'onglet Client (qui fera un PDF par la suite).
Quand tout ça est fait, le bouton "Fin de traitement" intervient. La marco "Save_Discounts" est là pour faire un copier/coller valeur de toutes les moyennes et des remises trouvées pour le client car l'utilisateur est amené à ouvrir à nouveau ce même fichier plus tard pour retravailler dessus. Ensuite, ça va donc supprimer les onglets contenant les remises et les moyennes de remises (pour limiter la taille du fichier dans le mail) et ensuite, ça enregistre sous un nouveau fichier (pour laisser la base intacte) à destination des services internes qui vont sauver ce fichier sur le réseau et qui auront un bouton pour générer le fichier à envoyer dans l'ERP.
L'utilisateur, après l'envoi du mail, reste sur son fichier final et peut faire le PDF à destination du client via mail ou alors un PDF simple pour son archivage perso et enfin fermer le fichier final. Il est possible que 2 semaines plus tard, l'utilisateur revienne sur le même fichier pour ajouter des produits à remiser et pourra donc cliquer à nouveau sur le bouton "Fin de Traitement" qui refera les actions requises (par ex. la suppression des onglets est passée puisqu'ils sont déjà supprimés) pour refaire l'envoi mail aux internes et le PDF à son client.

Pardon pour ce long message, j'essaye de donner le plus de détails possibles.
 

Pièces jointes

  • Fichier test.xlsm
    998.9 KB · Affichages: 7

Discussions similaires

Statistiques des forums

Discussions
314 653
Messages
2 111 574
Membres
111 204
dernier inscrit
Petko