Exécution macro à une heure précise

Bonjour,

Non je n'ai que ce code dans ThisWorkBook :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'Pour appeler la macro Horaire du fichier de macros personnelles
Application.Run "PERSONAL.XLSB!HoraireFich"

End Sub

Private Sub Workbook_Open(Cancel As Boolean)
'Pour appeler toute macro du fichier cible
Stop
Call SendToProduit
Stop
End Sub

Re,

Un truc que je ne comprends pas

On appelle une sub "Call SendToProduit" mais qui n'existe nulle part !?

Je pense qu'il faut modifier le nom de cette procédure

Bonjour,

Sur le code du Workbook_open().

Ne pas mettre Cancel as Boolean. Les parenthèses ne doivent contenir aucun texte à l'intérieur.

Contrairement au workbook_BeforeClose.

Refais un test comme indiqué dans mon message précédent. Et enlève ensuite les stop si tous est OK.

Un truc que je ne comprends pas

On appelle une sub "Call SendToProduit" mais qui n'existe nulle part !?

Je pense qu'il faut modifier le nom de cette procédure

Il est dans un module d'un autre classeur cible.

Sur le code du Workbook_open().

Ne pas mettre Cancel as Boolean. Les parenthèses ne doivent contenir aucun texte à l'intérieur.

Contrairement au workbook_BeforeClose.

Refais un test comme indiqué dans mon message précédent. Et enlève ensuite les stop si tous est OK.

J'ai un nouveau message d'erreur. Le fichier cible s'ouvre mais affiche :

"Erreur de compilation :

Variable ou procédure attendue, et non un module"

A nouveau,

Le classeur cible, donc celui qui s'ouvrira à l'horaire souhaité doit être celui qui comporte la macro SendToProduit. Et ce classeur cible comporte les 2 macros évenementielles Workbook.

Si ce n'est pas le cas, la macro SendToProduit ne pourra jamais être éxecutée. C'est selon ton premier message.

Oui c'est bien cela. Le classeur cible contient la macro à exécuter dans un module :

Et ce code dans ThisWorbook :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'Pour appeler la macro Horaire du fichier de macros personnelles
Application.Run "PERSONAL.XLSB!HoraireFich"

End Sub

Private Sub Workbook_Open()
'Pour appeler toute macro du fichier cible
Stop
Call SendToProduit
Stop
End Sub

Suite,

Donc ouvre à nouveau ton classeur cible directement. Si le code se met en arrêt par surlignance. Arrête le code. Puis place ton curseur à l'intérieur de la macro Workbook_open, juste après la ligne du Private Sub Workbook_open(), donc au niveau du commentaire 'pour appeler...

Puis exécute le code. Il devrait d'abord faire un arrêt sur le 1ier Stop. Continue ensuite l'exécution. Vérifie que ta macro SendToProduit passe. Si c' est le cas, le code va s'arrêter sur le 2ième stop.

Et fais moi un retour.

Bonjour,

Le code ne s'arrête pas sur le stop :O.

Il va directement sur le CALL et m'affiche le message d'erreur

Bonjour,

C'est donc ta macro qui pose problème. Remplace SendToProduit par une autre macro très courte pour faire le test. Ou vérifie son nom et/ou son emplacement dans ton fichier. Tu ne dois avoir que 2 fichiers présents, le personal.xlsb et ton fichier cible dans une seule application Excel ouverte.

Je joins ci-dessous un petit fichier cible qui présente les macros dans la partie code du Workbook. Et qui fonctionne très bien sur mon PC.

8forumtest.xlsm (34.96 Ko)

Je ne comprends pas car la macro fonctionne quand je l'exécute:

Voici le code :

Option Explicit

Const olMailItem As Integer = 0
Const olImportanceHigh = 2

Sub SendToProduit()

  Application.ScreenUpdating = False

Call EffacerTousLesFiltres
Call Afficher_Toutes_Lignes_Colonnes

  Dim sDest As String, sCopie As String, Objet As String
  Dim Texte(2) As String
  Dim Cel As Range, Plage As Range
  Dim OutLk As Object, eMail As Object, Rng As Object, wdDoc As Object
  Dim Dlig As Long

  Objet = "Nouvelles demandes VAX du " & [F1]
  Texte(1) = "Bonjour," & vbCr & vbCr & "Tu trouveras ci-dessous les nouvelles demandes VAX pour l'activité KITS AIRBUS:"
  Texte(2) = "Merci,"

  ' eMails du/des destinataires et copie
  sDest = "XXXXXXX"
  '
  ' Création de l'instance Outlook et de l'objet email
  Set OutLk = CreateObject("outlook.application")
  Set eMail = OutLk.CreateItem(olMailItem)
  'Definition de la plage à copier => Plage H:P et toutes les lignes contenant "À AJOUTER PL. PRODUIT" (voir plus bas la suite du code à partir de "ajout tableau 1")

  With Workbooks("VAX Follow-Up")
  Dlig = Sheets("VAX").Range("A" & Rows.Count).End(xlUp).Row
  ' Plage à copier
  Set Plage = Range("A1:B" & Dlig)

    'Filtrer la plage et si pas de filtre, sortir de la macro
    With ThisWorkbook.Sheets("VAX").ListObjects("Tableau1")
    .Range.AutoFilter Field:=3, Criteria1:=""
    On Error Resume Next
    If ActiveSheet.Range("Tableau1").SpecialCells(xlCellTypeVisible).Count = 1 Then 'Donc si il n'y a que ta ligne d'en tête
    Call EffacerTousLesFiltres
    MsgBox "Pas de nouvelle demande VAX à transmettre aux équipes"
    Exit Sub
    End If
    End With
End With
  With eMail
    .Display  ' ICI pour afficher la signature et la conserver
    .To = sDest
    .Cc = sCopie
    .Subject = Objet
    .Importance = olImportanceHigh
    ' Corps du mail
    Set wdDoc = eMail.GetInspector.WordEditor
    Set Rng = wdDoc.Range(0, 0)
    ' Insertion avant la copie du tableau
    Rng.InsertAfter Texte(1) & vbNewLine 'introduction
    '-------------------------------------------------------------------------
    'ajout du titre tableau 1
    Rng.InsertAfter vbNewLine         'titre tableau 1
    '-------------------------------------------------------------------------
    'ajout du tableau 1
    Set Rng = Rng.Paragraphs.Add().Range  'on ajoute un nouveau paragraphe
    Plage.Copy  ' Copie du tableau 1
    ' collage du tableau
    Rng.Paste:   Rng.Move 1, 1
    ' pied de page
    Rng.InsertAfter vbNewLine & Texte(2)
    .Send     'Envoyer le message
  End With
 With Application
    .EnableEvents = True
    .ScreenUpdating = True
  End With
  ' On efface les variables objets
  Set OutLk = Nothing: Set eMail = Nothing: Set wdDoc = Nothing

  Call EffacerTousLesFiltres

  MsgBox "Nouvelles demandes transmises aux équipes"

End Sub
Public Sub EffacerTousLesFiltres()
On Error Resume Next
  Dim fc As Worksheet
  For Each fc In ActiveWorkbook.Worksheets
    If fc.FilterMode = True Then
      fc.ShowAllData
    End If
  Next fc
End Sub

Sub Afficher_Toutes_Lignes_Colonnes()
    Columns.EntireColumn.Hidden = False
    Rows.EntireRow.Hidden = False
End Sub

Bonjour,

Je ne comprends pas car la macro fonctionne quand je l'exécute:

Une macro qui fonctionne dans un fichier sous une application qui a été mis en route depuis quelques temps ne fonctionne pas obligatoirement lorsque celle-ci est ouverte subitement. Il peut y avoir besoin de compléments qui ne se chargent pas à la même vitesse.

Apparemment dans cette macro tu fais appel à plusieurs traitements. Il faut donc repérer celui qui bloque le déroulement de la procédure.

D'abord pourquoi ouvre tu l'instance d'Outlook avant le filtrage sur le fichier cible? Ce qui oblige à utiliser un bloc With Workbooks("VAX Follow-Up") ...... End With.

Sans doute pour conserver la plage et la reprendre dans ton message.

Ne serait t'il pas mieux d'assurer en premier le travail sur le fichier puis une fois terminé d'ouvrir l'instance Outllook?

De plus cela permettrait de placer plusieurs stop afin de voir ou le blocage arrive. Donc 1) le Workbook_Open sans les stop

Private Sub Workbook_Open()
'Pour appeler toute macro du fichier cible
Call SendToProduit
End Sub

2) Suite sur la macro SendToProduit. (Faire exécuter pour passer le stop)

Sub SendToProduit()
'Premier Stop pour vérifier que l'on rentre dans la macro
Stop
  Application.ScreenUpdating = False

Call EffacerTousLesFiltres
Call Afficher_Toutes_Lignes_Colonnes
'Deuxième Stop pour contrôler que les appels aux sous-routines sont passées

3) Lancement du filtrage sur le fichier cible, pas besoin de bloc With Workbooks...End With puisqu'on est sur ce seul fichier Excel ouvert. Mettre un Stop avant le Exit sub. Ne pas oublier de copier la Plage (elle sera disponible dans le presse-papier)

4) Ouverture de l'instance Outlook et envoi du message.

Ainsi tu verras à l'intérieur de la macro SendToProduit ou cela arrête la procédure et non plus avant son lancement.

Rechercher des sujets similaires à "execution macro heure precise"