Enregistrement automatique d'un fichier

Bonjour à tous

Je cale sur l'enregistrement automatique d'un fichier dénommé ("Enrauto") autre que le fichier actif dénommé ("actif") sous Excel2010

La cellule A3 du fichier "actif" en utilisation d'urgence reçoit une information de remise à zéro transmise à la même cellule A3 du fichier "Enrauto"; celle-ci provque 2 conséquences: information la macro de la demande et effacement volontaire de données mémorisées dans diverses cellules du fichier "Enrauto".

L'objectif est que cet effacement volontaire provoque aussi automatiquement l'enregistrement du fichier "Enrauto" (c'est voulu)

Je n'ai pas placé la macro dans ce dernier fichier après avoir lu qu'il semblait impossible d'enregistrer un fichier commandé par sa propre macro

la macro du fichier "actif" est:

Private Sub Workbook_Open()

Dim wb As Workbook
On Error Resume Next
Set wb = Workbooks("Enrauto.xlsx") 'nom du fichier à sauvegarder dans une variable
Dim chemin As String, alerte As Byte

With Application
On Error Resume Next 'règle le problème d'ouverture inversée des 2 fichiers
alerte = Workbooks("Enrauto.xlsx").Worksheets("essai").Range("A3").Value 'Détection de l'ordre de sauvegarde (A3=1)
If alerte = 1 Then
Application.DisplayAlerts = False 'pas de confirmation visible de la sauvegarde
chemin = Workbooks("Enrauto.xlsx").Path & "/" 'chemin du fichier à sauvegarder (variable suivant les clients) dans une variable
wb.SaveAs Filename:=chemin & "Enrauto.xlsx" 'sauvegarde effectuée
Application.DisplayAlerts = True 'rétablissement des affichages
End If
End With
End Sub

Le problème constaté est que la macro ne s'exécute pas automatiquement lorsque l'ordre de sauvegarde arrive mais seulement manuellement par le triangle vert d'exécution (et dans ce cas la sauvegarde du fichier "Enrauto" s'effectue bien.

Merci ceux qui accepteront gentiment de m'aider à resoudre ce problème

Si c'est clair pour toi... ça ne semble pas l'être par beaucoup ici

Bonjour et merci du commentaire tout d'abord. Je vais essayer d'expliquer plus simplement ce que j'ai écrit précédemment de ce dispositif:

Les 2 fichiers présentés sont les fichiers d'essai de cette commande d'enregistrement automatique (pour la tester) mais qui seront appliqués à un projet en cours au niveau d'un dispositif de sécurité. Le principe est le suivant: En utilisation normale, des données sensibles sont mémorisées dans un fichier Excel (Il y en a 4 différents au total); dans le cas de tentative de fraude pour rechercher ces données, une commande d'instructions Excel provoque l'effacement des données (cela fonctionne très bien). Parallèlement le fichier en question (vide de données) est enregistré automatiquement (pour éviter une réutilisation immédiate); l'administrateur du réseau sera le seul à même de réintroduire les données effacées.

Concernant maintenant le code présenté mon attente est la suivante:

Qu'est ce qui, dans ce code, empèche l'enregistrement automatique du fichier lorsque la condition est voulue (Cellule A3=1)?

Cet enregistrement ne s'effectue (correctement d'ailleurs) que si la commande manuelle de la macro par le triangle vert est effectuée mais jamais automatiquement.

J'espère avoir donné des éclaicissements nécessaires

Bonsoir,

je n'ai pas tout compris, mais voici ce que je remarque dans votre code :

- 1 - il y a une erreur de syntaxe dans chemin = Workbooks("Enrauto.xlsx").Path & "/" , mettre "\" à la lace de "/".

Comment le path fonctionne sur une sauvegarde "inexistante" ? (si je comprends le fichier actif et inactif)

- 2 - alerte = Workbooks("Enrauto.xlsx").Worksheets("essai").Range("A3").Value 'Détection de l'ordre de sauvegarde (A3=1)

Vous lisez la cellule A3 de votre sauvegarde ("Enrauto.xlsx") qui n'est "pas encore faite" ?

Bonsoir et merci pour votre aide.

Concernant l'erreur de syntaxe "\", j'ai rectifié mais aucun changement.

Concernant le path: La variable "chemin" contient le chemin complet d'accès au fichier "Enrauto" qui est ouvert bien sûr (comme le fichier "actif" d'ailleurs)

Concernant la valeur de la cellule A3: C'est le fichier"actif" (ou se trouve la macro)dans son Workbook) qui donne l'ordre de sauvegarde; La cellule A3 du fichier "actif" est relayée par Excel à la cellule A3 du fichier "Enrauto" qui est lue par la macro avec l'instruction présentée alerte=.

Pour répondre par avance à la question pourquoi ne pas avoir édité directement la macro dans le fichier "Enrauto", c'est pour éviter que la macro n'agisse sur son propre fichier (j'ai lu que ce lien de cause a effet était à proscrire)

La chronologie de fonctionnement de la sauvegarde est exactement la suivante:

Etape de départ: Le fichier "Enrauto" contient des données sensibles; la variable "wb" contient le nom du fichier "Enrauto.xlsx"

Etape 1: Le fichier "actif" déclenche l'ordre d'effacement (A3=1)

Etape 2: Le fichier "Enrauto" reçoit cet ordre relayé par Excel dans sa cellule (A3=1)

Etape 3.1: Effacement immédiat des données mémorisées par Excel (arrêt d'une fonction mémoire)

Etape 3.2: La variable "alerte" de la macro du fichier "actif" reçoit l'information d'alerte alerte=A3=1

Etape 4: Récupération du chemin complet où se trouve le fichier "Enrauto" par la variable chemin

Etape 5: La sauvegarde du fichier "Enrauto" est effectuée automatiquement sans confirmation de l'utilisateur

C'est ainsi que cet automatisme est conçu; malheureusement, il ne fonctionne pas seul. Il faut actuellement impérativement commander la macro (triangle vert) pour que cet enregistrement s'effectue.

J'espère que cette clarté aidera...

Bonsoir,

ma première question :

Qu'est ce qui déclenche l'alerte ?

Si c'est un évènement, alors dans cet évènement, effacer les données sensibles, et utiliser la commande ci-dessous :

Application.Run "NomClasseur.xls!ModuleX.NomMacro"

NomClasseur : nom du fichier sauvegarde.

ModuleX : nom du module où ce trouve la macro cité ci-dessous.

NomMacro : nom de la la macro dans le fichier sauvegarde qui effectuera son propre enregistrement et sa propre fermeture.

exemple :

ActiveWorkbook.Save
ActiveWorkbook.Close False ' sans invité visible pour l'utilisateur

Deux fichiers pour un test, à enregistrer dans le même répertoire.

Pour visualiser le fonctionnement, procédez comme suit :

  • 1 - Ouvrir le fichier Sauvegarde pour visualiser son contenue (1 seul onglet), puis le refermer.
  • 2 - ouvrir le fichier Actif, ne vous souciez pas du fichier Sauvegarde .
  • 3 - cliquer sur le bouton Déclencher l'alerte
  • 4 - Visualiser la modification à l'écran (fichier Actif)
  • 5 - fermer le fichier Actif.
  • 6 - ouvrir le fichier Sauvegarde, visualisez le résultat.
25actif.xlsm (20.60 Ko)
36sauvegarde.xlsm (15.60 Ko)

Bonsoir et merci de cette aide précieuse que je vais étudier de très prêt ces prochains jours

Pour répondre à votre question sur Qu'est ce qui provoque l'alerte?: La réponse est le changement du contenu d'une cellule qui passe de 0 à 1. dans le programme réel c'est l'utilisation de l'instruction =cellule dont la valeur numérique de la largeur de colonne doit impérativement être à 0 (colonne réduite à 1 trait et toute tentative pour élargir la colonne dans d'autres fichiers provoque l'alerte.

Pour info voilà mes 2 fichiers en simulation en téléchargement dont je parle depuis le début

Ouvrir les 2 fichiers

Les données simulées en mémoire sont en A6 de Enrauto

Dans le fichier "actif" en cochant puis décochant la cellule jaune A3, l'alerte est donnée

L'alerte est transmise à l'autre fichier "Enrauto" en A3 qui passe de 0 à 1

1ère conséquence, les "Données mémorisées s'effacent dans "Enrauto"

En principe, la sauvegarde de ce fichier doit s'effectuer mais ce n'est pas le cas

On le constate en fermant manuellement ce fichier sans sauvegarde et en le rouvrant; c'est le fichier non sauvegardé qui s'ouvre

En refaisant la même chose mais en exécutant manuellement la macro du fichier "actif" la sauvegarde est bien effectuée

Toujouts en fermant manuellement ce fichier sans sauvegarde et en le rouvrant; c'est le fichier sauvegardé qui s'ouvre sans les données mémorisées.

En enlevant l'alerte, les sonnées mémorisées sont réintroduites en cochant puis décochant la case bleue

retour au point de départ.

Après étude de ce que tu as fait pour moi, je te recontacte dans quelques jours pour t'informer de ce que j'ai compris (suis occupé par ailleurs en ce moment).

Si tu as des observations sur mes 2 propres fichiers n'hésite pas

Cordialement

11actif.xlsm (21.36 Ko)
15enrauto.xlsx (12.60 Ko)

Bonsoir,

voici le code et vos fichiers modifiés, certainement à adapter.

Il est contrôlé que votre fichier Copie de Enrauto soit bien ouvert (sinon message d'avertissement).

Ouvrez Copie de Enrauto, puis Actif Second.

"Cochez" votre cellule d'alarme, et voyez le résultat.

Private Sub Workbook_Open()
    NomFichier = "Copie de Enrauto.xlsx" ' nom fichier à modifier au besoin
    test
    If Cells(3, 1) = "" Then Exit Sub
    alerte
End Sub

Public NomFichier As String

Sub alerte()
    Dim chemin As String
    Dim i As Long
    If NomFichier = "" Then Exit Sub

    Application.DisplayAlerts = False
        With Workbooks(NomFichier)
            chemin = .Path & "\"
            li = .Sheets(1).Cells(1, 14) + 1
            .Sheets(1).Cells(1, 14) = li
            .Sheets(1).Cells(li, 15) = "Une alerte est survenue le : " & Now
            .Sheets(1).Cells(3, 1) = 1
            .SaveAs Filename:=chemin & NomFichier
            .Close
        End With
    Application.DisplayAlerts = True

    NomFichier = "" 'la RaZ du NomFichier bloque une seconde alerte. Il faut fermer puis ré-ouvrir ce fichier.
End Sub

Sub test()
    For Each w In Workbooks
        If w.Name = NomFichier Then Exit Sub
    Next w
    MsgBox "Le fichier " & NomFichier & " est manquant, le test ne peut pas être fait.", vbCritical
    NomFichier = ""
End Sub

'  ci-dessous, l'évènement qui provoque l'alerte dès la modification de la cellule concernée.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Cells(3, 1) = "" Then Exit Sub
    alerte
End Sub
14actif-second.xlsm (21.52 Ko)

Bonjour et merci pour ce code en test

Il semble que cette ligne

Public NomFichier As String

ne puisse se placer après le

End sub

qui se trouve juste au dessus

ce qui arrête le débogueur bien sûr

Bonsoir tout le monde,

matysek a écrit :

Bonjour et merci pour ce code en test

Il semble que cette ligne

Public NomFichier As String

ne puisse se placer après le

End sub

qui se trouve juste au dessus

ce qui arrête le débogueur bien sûr

Il semblerait que des fondamentaux soit à connaitre... L'éditeur VB est structuré, voir l'image dans le fichier joint ci-dessous...

Si vous avez 'copier/coller' le code au même endroit, c'est certain que cela ne fonctionnera pas...

Extrait de l'aide VB :

Public, instruction, exemple

Public MyVar, YourVar, ThisVar As Integer

Le code posté est celui qui se trouve dans le fichier Actif Second.xlsm de mon dernier poste. ALT+F11 pour visualiser où sont les parties du code...

20classeur21.xlsx (479.00 Ko)

Bonjour et merci encore

Effectivement je me suis aperçu bien vite de l'erreur de mon post précédent. Cependant il m'a permis d'avoir une réponse très pédagogique sur les fonctions d'utilisationdes codes placés sue les feuilles, le Worbook et les modules.

je n'ai pu répondre plus tôt car coupure internet majeure dans ma ville (et pas que -box, téléphone fixe - TV par ou sans box) il ne restait que le portable pour communiquer durant 3 jours!!!

Après moult essais des fichiers envoyés et quelques débogage constaté, je vais transposer tout cela tranquillement à mes fichiers définitifs et vous tenir au courant.

Merci de l'aide en tous cas

Bonjour

J'ai appliqué le principe de ta macro proposée à mon projet définitif et je t'en livre les conclusions avec un problème que j'avais déjà constaté par ailleurs:

Le classeur Enrauto s'appelle en fait "CM.xlxm"; dans l'une de ses feuilles que j'appelle "x" se trouve la cellule AH38 qui par une formule, reçoit l'alerte d'effacement venant d'un autre classeur "actif.xlsx" (1= pas d'alerte et 0 alerte).

Pour simuler une alerte, une cellule voisine par la rentrée quelconque d'un caractère place un 0 dans la cellule AH38.

La cellule AH39 reçoit un 1 de la macro pour indiquer que la macro a bien reçue le message (juste une indication).

Voilà le programme écrit dans le classeur CM comme tu l'avais suggéré

Macro feuille "x":

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Worksheets(5).Range("BU58").Value = 1 Then Exit Sub
    alerte
End Sub

Macro module 1:

Public NomFichier As String
Sub alerte1()
    Dim chemin1 As String, NomFichier1 As String
    NomFichier1 = "CPmx.xlsm"
    If NomFichier1 = "" Then Exit Sub
    Application.DisplayAlerts = False
        With Workbooks(NomFichier1)
            chemin1 = .Path & "\"
            .Sheets(2).Range("AH39") = 1
            .SaveAs Filename:=chemin1 & NomFichier1
         End With
    Application.DisplayAlerts = True
        NomFichier1 = "" 
End Sub

A noter que la macro du workbook de CM qui contenait dans ta proposition la gestion des tests de fichier a été enlevée ne servant pas dans mon cas.

Le constat de fonctionnement:

En provoquant la simulation d'alerte (Feuille "X" active et cellule voisine cochée), AH38 passe bien à 0 et toute la suite se déroule très bien (sauvegarde automatique du fichier CM).

Par contre, si, comme c'est prévu, la simulation provient d'un autre classeur ("actif.xlsx" est actif; l'une de ses cellule est complétée d'un caractère quelconque et est transmise via les instructions Excel à AH38 du classur CM), la cellule AH38 passe bien à 0 comme prévu... mais la macro ne prend pas en compte son état.

Il me semble avoir lu que l'instruction Worksheet_SelectionChange ne fait réagir la macro que si obligatoirement une action manuelle dans une cellule de la feuille concernée (ici la feuille "X" de CM) était actée et que si la cellule lue par la macro était modifiée à partir d'un autre classeur, la macro ne la lisait pas.

Dans ces conditions, comment faire en sorte que le changement de valeur d'une cellule à partir d'un autre classeur puisse être pris en compte par la macro.

Excuse pour la longueur mais je voulais être très précis dans mes explications.

A titre d'information, comme c'est le dernier problème à résoudre de mon projet, lorsqu'il sera réglé et en remerciements, si tu es intéressé par ce projet décrit en pièce jointe, je te le transmettrais.

Bonjour,

Il me semble avoir lu que l'instruction Worksheet_SelectionChange ne fait réagir la macro que si obligatoirement une action manuelle

Non, mais pas facile de te répondre, vu ta demande quelque peu difficile à comprendre...

A noter que la macro du workbook de CM qui contenait dans ta proposition la gestion des tests de fichier a été enlevée ne servant pas dans mon cas.

Libre à toi, tu en reviendras peut être...

La gestion est parfois, voir souvent, primordiale à la bonne exécution de macros...

Même si je comprends qu'un troisième fichier est maintenant concerné, ma première question reste sans réponse...

Qu'est ce qui déclenche l'alerte ?

ou quel fichier la déclenche ?

Bref, pour le FUN, une troisième proposition qui démontre l'exécution d'une alarme à partir d'un fichier, qui agit sur deux autres... Ce qui veut dire que cela peut fonctionner pour trois, quatre... voir cinquante fichiers, si les ressources le permettent. Il est possible que le deuxième fichier agisse sur le premier et le troisième, ou le troisième sur les deux premiers, mais il faudra adapter... Et dans un tel "meli-melo", il serait préférable qu'un seul fichier soit le MAITRE, sinon le casse tête ne fait que commencer...

Trois fichiers pour tester, suivre les instructions si un message vous y invite, voyez les résultats, étudiez, adaptez...

Celui qui déclenche votre alarme est "Actif .xlsm", à ouvrir en dernier.

Bonne continuation,

9enrauto.xlsm (29.98 Ko)
12second-enrauto.xlsm (29.50 Ko)
16actif.xlsm (19.98 Ko)

Bonjour et encore merci de la patience

Bravo pour les fichiers avec macros transmis, cela fonctionne très bien; j'ai même crée un 2ème fichier actif possible (en changeant les coordonnées des cellules concernées et tout va bien. je crois avoir compris comment cela va se passer.

Pour clore ce topic avant que je transpose tout cela à mon projet, il me reste quelques questions simples à te demander:

Pour illustrer ce questionnement, le fichier joint résume l'ensemble des macros de mon projet.

Si j'ai bien compris, l'ordre d'alerte part toujours d'un fichier actif; cet ordre donné par une cellule à cocher dans l'exemple transmis ne sera du même ordre dans le projet mais un changement d'état automatique d'une cellule défini par les instructions d'Excel; effectivement la macro concernée est capable de lire puis traiter ce changement d'état (dans l'exemple transmis j'ai vérifié).

Comme dans mon projet de nombreuses feuilles (sensibles) peuvent être activées par un utilisateur indélicat (une seule à la fois bien sûr), cela suppose de transposer dans toutes ces feuilles le code concerné dans son Workbook et toutes les feuilles détectant l'alerte.

2 cellules actuellement dans chacun des fichiers à sauvegarder concernés sont le résultat du retour d'alerte de toutes les feuilles sensibles de tous les classeurs (par Excel)

Dans mon projet et tu le verras dans le fichier, là ou tu places un code... j'en ai déjà un autre qui a une autre fonction indépendante et spécifique (qui fonctionne bien d'ailleurs); d'où conflit que je ne sais pas comment gérer.

Autre question concernant les codes concernant les boites de message (qui ne servent pas dans mon cas) et d'effacement des données (réalisé par Excel dans mon projet): Ces parties là peuvent être supprimées?

Dans ton programme je peux je suppose supprimer la fermeture des fichiers et ne que de les sauvegarder?

NomFichier(0) = "mémoire ?"

: A quoi se rapporte "mémoire?", un autre fichier à sauvegarder?

J'ai vu que tu utilisais toujours l'instruction Cell; utiliser le Nom de colonne et le N° de ligne pose-t-il un problème particulier?

Faut-il obligatoirement déprotéger une cellule lue dans Excel par une macro?

L'effacement de données sensibles est-il préférable par Excel pour par la macro comme tu l'as prévu?

Allez! merci beaucoup encore de tes conseilset si le projet(fini) t'intéresse contacte-moi.

Bonsoir,

matysek a écrit :

Bonjour et encore merci de la patience

Bravo pour les fichiers avec macros transmis, cela fonctionne très bien; j'ai même crée un 2ème fichier actif possible (en changeant les coordonnées des cellules concernées et tout va bien. je crois avoir compris comment cela va se passer.

Pour clore ce topic avant que je transpose tout cela à mon projet, il me reste quelques questions simples à te demander:

Pour illustrer ce questionnement, le fichier joint résume l'ensemble des macros de mon projet.

Si j'ai bien compris, l'ordre d'alerte part toujours d'un fichier actif; cet ordre donné par une cellule à cocher dans l'exemple transmis ne sera du même ordre dans le projet mais un changement d'état automatique d'une cellule défini par les instructions d'Excel; effectivement la macro concernée est capable de lire puis traiter ce changement d'état (dans l'exemple transmis j'ai vérifié).

Comme dans mon projet de nombreuses feuilles (sensibles) peuvent être activées par un utilisateur indélicat (une seule à la fois bien sûr), cela suppose de transposer dans toutes ces feuilles le code concerné dans son Workbook et toutes les feuilles détectant l'alerte.

2 cellules actuellement dans chacun des fichiers à sauvegarder concernés sont le résultat du retour d'alerte de toutes les feuilles sensibles de tous les classeurs (par Excel)

Dans mon projet et tu le verras dans le fichier, là ou tu places un code... j'en ai déjà un autre qui a une autre fonction indépendante et spécifique (qui fonctionne bien d'ailleurs); d'où conflit que je ne sais pas comment gérer.

Autre question concernant les codes concernant les boites de message (qui ne servent pas dans mon cas) et d'effacement des données (réalisé par Excel dans mon projet): Ces parties là peuvent être supprimées?

Dans ton programme je peux je suppose supprimer la fermeture des fichiers et ne que de les sauvegarder?

NomFichier(0) = "mémoire ?"

: A quoi se rapporte "mémoire?", un autre fichier à sauvegarder?

J'ai vu que tu utilisais toujours l'instruction Cell; utiliser le Nom de colonne et le N° de ligne pose-t-il un problème particulier?

Faut-il obligatoirement déprotéger une cellule lue dans Excel par une macro?

L'effacement de données sensibles est-il préférable par Excel pour par la macro comme tu l'as prévu?

Allez! merci beaucoup encore de tes conseilset si le projet(fini) t'intéresse contacte-moi.

Heureux que cela te convienne, mais cependant, je ne conserverais pas la façon de "transmettre" l'alerte par une modification de valeur de cellule... je trouve cela risqué... par contre, lancer l'exécution d'une macro (première idée postée) me parait plus convenable et 'plus fiable'...

les boites de messages : peuvent-être supprimées, ce n'est qu'un visuel pour le test, sans ces messages, c'est immédiat et transparent.

Pour la fermeture automatique des fichiers, elles peuvent être supprimé. Remarque que la fermeture des fichiers ESCLAVES est codée dans le fichier Maitre. Si ce code était coté fichiers esclaves, un bog est possible, arrêt du débogeur. La suite du code ne s'exécute plus coté fichier maitre.

NomFichier(0) = "mémoire ?" : La variable tableau NomFichier (x) contient tous les fichiers concernés, à l'indice zéro ( NomFichier(0) ) contient une chaine quelquonque, qui est effacée une fois l'alerte lancée et exécutée. Cette variable vide empêche l'exécution de l'alerte :

If NomFichier(0) = "" Then Exit Sub

Si les fichiers sont fermés et que le code est à nouveau exécuté, une erreur apparaitra.

C'est un "traitement d'erreur" que je connais et que j'anticipe, mais sans utiliser un "On error".

Sinon, j'ai une question,

Les fichiers de ton projet, sont-ils ouvert sur le même poste ou sur plusieurs postes différents lors de la 'communication' de l'alerte ?

Rechercher des sujets similaires à "enregistrement automatique fichier"