Microsoft 365 enregistrement copie du classeur ouvert avec mot de passe et incrémentation

meyscal

XLDnaute Occasionnel
Bonsoir le forum,

je trouve régulièrement les réponses à mes questions ici mais là mon besoin est si spécifique que je fais appel à vous.

Enregistrement donc d'une copie du classeur ouvert mais avec :

- code si possible sans option explicit si possible car la plus grosse partie du code est déjà écrite sans (à moins que ça ne pose pas problème)
- nom du fichier reprendra les valeurs de 2 cellules (1 nom-prénom + 1 date) séparées par " - " et précédées par "NDF - ". Exemple : NDF - valeur A1 - valeur B1.xlsm = NDF - Jean Dupont - 31-03-2023.xlsm
- protection par mot de passe pour ne pas être ouvert par n'importe qui (pas de lecture seule)
- enregistré sur le bureau (Special Folders) donc enregistrable sur n'importe quel PC toujours au même endroit)
- l'enregistrement se fait en arrière plan sans ouverture de la copie ensuite

Pour information, je vous ai dit que j'avais déjà écrit le plus gros du code donc voici ce qu'il comprend. Pour commencer, déclenchement de l'enregistrement par 1 bouton dans un userform puis :

- enregistrement d'une feuille du classeur en PDF (celle-ci est pour l'utilisateur mais pas la copie que je veux créer). Voici ce que j'ai pour la création du PDF :
Dim sNomFic As String, sRep As String, WshShell As Object
- remplissage automatique du formulaire en PDF avec les données réparties dans 4 tableaux (1 feuille par tableau) différents puis remise à 0 (effacement complet des 4 tableaux). ATTENTION : ma copie enregistrée doit être faite avant l'effacement des tableaux
- 2 ou 3 autres bricoles


Voilà, je n'ai pas encore une grande expérience mais j'ai déjà réussi à faire tout ça en récupérant des bouts de code sur ce forum et plus rarement avec l'enregistreur de macro.
J'ai essayé aussi pour ça et je trouve des réponses mais il faut déjà que ça colle avec ce que j'ai.

Je suis débrouillard et je saurai adapter , j'ai juste besoin d'un exemple par forcément qu'on fasse le job à ma place :rolleyes:

Merci à vous.
Me dire si besoin que je fasse parvenir un fichier exemple ou le code déjà écrit. C'est juste que je veux éviter de partager des données potentiellement sensibles et que j'ai déjà tellement de données que ça va être très long de tout anonymiser ...
 
Solution
Bonsoir @meyscal , le fil

@meyscal
Tu parles d'une copie au format Excel ou une copie au format PDF ?

Ce code fonctionne chez moi
(O365)
La copie est bien sur le bureau et demande un mot de passe à l'ouverture

VB:
Sub Copie_Avec_MDP()
Dim sNomFic$
sNomFic = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" & "copyPW.xlsx"
Application.DisplayAlerts = False
Application.ScreenUpdating = False
ActiveSheet.Copy
ActiveWorkbook.SaveAs sNomFic, FileFormat:=xlOpenXMLWorkbook, Password:="St@pLe$", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False
ActiveWorkbook.Close
End Sub
NB: Mais comme indiqué précédemment le mot de passe est en clair dans le code VBA.
Ce n'est donc pas sécure.

meyscal

XLDnaute Occasionnel
Mais ouiii complément en phase ! Effectivement tant que ça fonctionne c'est l'essentiel.

Mais je remarque souvent en parcourant les forums que c'est un peu la course à celui qui fera le code le plus court ...
Ce qui rappelle le principe de la factorisation en maths ... Back in the 90's pour moi 😅

Tu as mon fichier dans sa totalité et lorsque je compile je n'ai pas d'erreur et en testant non plus mais si tu vois des choses qui te semblent inexactes n'hésite pas à me le dire.

Déjà pour apprendre mais aussi pour les utilisateurs : qu'ils aient le moins de bugs possibles.

Merci encore à toi !
 

Staple1600

XLDnaute Barbatruc
Re

Tu as mon fichier dans sa totalité et lorsque je compile je n'ai pas d'erreur et en testant non plus mais si tu vois des choses qui te semblent inexactes n'hésite pas à me le dire.
Chat échaudé craint l'eau froide ;)

Concernant ce point
- protection par mot de passe pour ne pas être ouvert par n'importe qui (pas de lecture seule)
(A mon sens, c'est risqué car en cas d'oubli de mot de passe ou bug, il sera difficile d'ouvrir le classeur)

Concernant ce point
- enregistré sur le bureau (Special Folders) donc enregistrable sur n'importe quel PC toujours au même endroit)
(réponse donnée ici
https://excel-downloads.com/threads...asse-et-incrementation.20075413/post-20576951 )

Donc ici aussi, quels sont les points qui restent à traiter ?
 

Staple1600

XLDnaute Barbatruc
Bonsoir @meyscal , le fil

@meyscal
Tu parles d'une copie au format Excel ou une copie au format PDF ?

Ce code fonctionne chez moi
(O365)
La copie est bien sur le bureau et demande un mot de passe à l'ouverture

VB:
Sub Copie_Avec_MDP()
Dim sNomFic$
sNomFic = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" & "copyPW.xlsx"
Application.DisplayAlerts = False
Application.ScreenUpdating = False
ActiveSheet.Copy
ActiveWorkbook.SaveAs sNomFic, FileFormat:=xlOpenXMLWorkbook, Password:="St@pLe$", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False
ActiveWorkbook.Close
End Sub
NB: Mais comme indiqué précédemment le mot de passe est en clair dans le code VBA.
Ce n'est donc pas sécure.
 

meyscal

XLDnaute Occasionnel
Bonsoir @meyscal , le fil

@meyscal
Tu parles d'une copie au format Excel ou une copie au format PDF ?

Ce code fonctionne chez moi
(O365)
La copie est bien sur le bureau et demande un mot de passe à l'ouverture

VB:
Sub Copie_Avec_MDP()
Dim sNomFic$
sNomFic = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" & "copyPW.xlsx"
Application.DisplayAlerts = False
Application.ScreenUpdating = False
ActiveSheet.Copy
ActiveWorkbook.SaveAs sNomFic, FileFormat:=xlOpenXMLWorkbook, Password:="St@pLe$", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False
ActiveWorkbook.Close
End Sub
NB: Mais comme indiqué précédemment le mot de passe est en clair dans le code VBA.
Ce n'est donc pas sécure.
Bonsoir @Staple1600

2 remarques + 1 question :

1. saveas et pas savecopyas :

bon si on veut faire savecopyas il faut enregistrer puis ouvrir pour mettre le mdp.
Problème, boite de dialogue sécurité macros : on les active et on reprend le Workbook open et ça interrompt la suite. Si on les refuse ça interrompt tout. D'où ma 2eme question :

2. xlsx et pas xlsm :

Savecopyas ne peut fonctionner avec une extension différente, j'avais également testé cette solution mais je n'arrivais pas à ouvrir le fichier ensuite.
Avec ton code c'est ok !
Après j'aurais préféré l'avoir en xlsm pour extraire les données dans le fichier de la compta mais au pire c'est dans celui-ci qu'il y aura la macro.

3. à quoi sert "Activesheet.copy" ?

Merci
 

Staple1600

XLDnaute Barbatruc
Re

@meyscal
Ceci semble fonctionner
VB:
Sub Copie_Twice()
Dim wbk As Workbook
Dim sNomFic$, Stamp$
Stamp = Format(Now, "yyyymd_hhmmss_")
sNomFic = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" & Stamp & "copyPW.xlsx"
Application.DisplayAlerts = 0: Application.ScreenUpdating = 0
Set wbk = ThisWorkbook
ActiveSheet.Copy
ActiveWorkbook.SaveAs sNomFic, FileFormat:=51, Password:="B@Z1nG8!+", WriteResPassword:="", ReadOnlyRecommended:=0, CreateBackup:=0
ActiveWorkbook.Close
wbk.SaveCopyAs wbk.Path & "\Copie_" & Stamp & wbk.Name
End Sub
PS: La encore, le mot de passe est en clair dans le code VBA
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

@meyscal
Tu peux poster ton code final
Cela pourrait intéresser d'autres membres du forum avec une problématique similaire à la tienne
En tous cas , c'est l'usage ici: le partage des connaissances

Sinon pour ma gouverne: le code du message#24 fait bien ce que tu demandes non ?
Une copie avec mot de passe sur le bureau et une copie sans dans le répertoire courant.
 

meyscal

XLDnaute Occasionnel
Bonsoir à tous

@Staple1600 : bien-sûr pas de problème je fais cela demain !
Là le PC est éteint.
Oui c'est exact, ça fonctionne comme tu le dis mais ce n'est pas exactement ce que je recherchais.

Si tu relis mon 1er message je ne voulais pas juste avoir la feuille "Document" mais le classeur entier avant l'effacement des données et en conservant le format .xlsm.

nom du fichier reprendra les valeurs de 2 cellules (1 nom-prénom + 1 date) séparées par " - " et précédées par "NDF - ". Exemple : NDF - valeur A1 - valeur B1.xlsm = NDF - Jean Dupont - 31-03-2023.xlsm

Dans le détail, c'est pour permettre aux administrateurs de clôturer les notes de frais et d'exporter les données dans un fichier central également en construction.

Pour y parvenir, j'ai modifié le code dans ThisWorkbook et selon la valeur d'une cellule, c'est un autre Userform qui s'ouvre ... Bref tu verras ça.
C'est du bricolage mais c'est fonctionnel.

Enfin j'ai opté pour l'enregistrement dans le répertoire du classeur source au final ... plus simple.

Quoiqu'il en soit l'aide que tu m'as apportée + pas mal de recherches m'ont permis d'y arriver !
Merci encore.

Bonne soirée ou nuit selon
 

meyscal

XLDnaute Occasionnel
Bonsoir à tous

Voici donc la partie du code concerné.
Là j'enregistre une copie avec un mot de passe (que j'ai renommé ici en "motdepasse") et qui est demandé à l'ouverture de la copie créée).
La copie est enregistrée avec les valeurs de 2 cellules = Nom et Prénom + Date de la dernière saisie.
La date de la dernière saisie est recopiée dans une cellule (instruction dans ce même code), ce qui me permet de savoir si la personne a déjà déclaré des frais avant cette date puis mise en forme conditionnelle en rouge de la saisie avec information par msgbox au demandeur et aux administrateurs à la réouverture, etc ...

La valeur de la cellule O7 permet donc selon sa valeur de lancer 1 des 3 Userform (Code dans This Workbook, Déclaration Workbook Open) :
en gros à la première connexion elle est vide puis lorsqu'on a créé son compte elle passe à "OK" pour ne pas se retaper le Userform de création de compte à la prochaine réouverture. Juste avant cet enregistrement je la fais passer à "NOK" ce qui permet de ne rien lancer et donc de pouvoir ouvrir la copie du fichier en arrière plan, mettre le mdp et mettre la valeur de O7 à "OK" pour tomber directement sur le bon Userform à la réouverture par les administrateurs.

Voilà tout est fonctionnel 😁

Bonne soirée à tous et merci encore à @Staple1600 pour son support.

VB:
Dim sNomFichier As String
Dim wb As Workbook
sNomFichier = ThisWorkbook.Path & "\" & "NDF_" & Range("C7") & "_" & Range("O5").Text & ".xlsm"
Application.DisplayAlerts = False
Application.ScreenUpdating = False
ActiveWorkbook.SaveCopyAs Filename:=sNomFichier
Set wb = Workbooks.Open(sNomFichier)
ActiveWorkbook.Sheets("Document").Activate
Range("O7") = "OK"
wb.SaveAs Filename:=sNomFichier, Password:="motdepasse", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False
ActiveWorkbook.Close
 

Discussions similaires

Réponses
2
Affichages
154