Fichier ne ferme pas selon la demande [Résolu]

mikmak78 59 Messages postés vendredi 5 octobre 2012Date d'inscription 6 mars 2017 Dernière intervention - 7 janv. 2016 à 13:14 - Dernière réponse : mikmak78 59 Messages postés vendredi 5 octobre 2012Date d'inscription 6 mars 2017 Dernière intervention
- 19 févr. 2016 à 16:53
Bonjour,

je voulais proteger un fichier partagé de toutes nouvelles completions non autorisées
soit dans le thisWorbook
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If VBA.Environ("username") = Worksheets("maintenance & securité").Range("A12").Value Then 'celui qui a tout les droits
ElseIf Intersect(Target, Range("AE1")) Is Nothing Then

Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True

End If

End Sub


Pour la gestion de mes evenements de completion
je fais
Sub xxx
Application.EnableEvents = False
' mon code qui execute la completion
Application.EnableEvents = True
End Sub

afin de modifier les données

je souhaitais que les utilisateurs utilisent un bouton fermer pour sortir


sub fermer
Application.EnableEvents = False
ActiveWorkbook.Save
ThisWorkbook.Close
end sub


Je suis le username qui a tous les droits et pour moi quand j utilise le bouton fermer le fichier se ferme, pour les autres utilisateurs la fonction ne marche pas. Je ne comprends pas.


merci pour votre aide
Afficher la suite 

13 réponses

Répondre au sujet
ucfoutu 18035 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 17 février 2018 Dernière intervention - Modifié par ucfoutu le 29/01/2016 à 20:49
+1
Utile
2
Hé bien ...
L'âne, ce soir, c'est ton serviteur (moi-même) qui a lu tes messages mais n'a pas su lire tout ton code (et voir que tu avais bel et bien mis en place la procédure que j'avais moi-même préconisée). Je me donne dans la foulée deux paires de baffes et t'autorise à en faire au moins autant (je les mérite, ces baffes).
Le problème semble en effet être qu'il est impossible de sauvegarder en même temps que l'on "modifie" (conflit), même si la "modification n'en est pas une réelle.
On va essayer de se rattraper aux branches ...
1) Déclare une variable publique "ignore" en booléenne
Public ignore as boolean
2) passe cette booléenne à True dans la procédure évènementielle de sauvegarde :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
ignore = true
End Sub

3) transforme la procéure antimode ainsi
Public Sub antimode()
if not ignore then
If Application.VBE.ActiveVBProject.Mode > 0 Then Range("A1") = Range("A1")
Application.OnTime Now + TimeValue("00:00:01"), "antimode"
end if
End Sub

Cela devrait suffire.
Il se peut que tu aies également (à voir) à passer ignore à True dans la procédure évènementielle Workbook_BeforeClose
Essaye.
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Cette réponse vous a-t-elle aidé ?  
alors j'avais testé cette approche mais j'avais pas codé comme toi.
Je vais tester et je te redis

merci de ton aide
mikmak78 59 Messages postés vendredi 5 octobre 2012Date d'inscription 6 mars 2017 Dernière intervention - 19 févr. 2016 à 16:53
ca fonctionne!!!!
merci
Commenter la réponse de ucfoutu
ucfoutu 18035 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 17 février 2018 Dernière intervention - Modifié par ucfoutu le 7/01/2016 à 16:24
0
Utile
Bonjour,
quel serait selon toi le sens de ce qui serait écrit ainsi :
Si expression1 alors
sinon expression2 alors
....
fin si

qui n'est rien d'autre que :
si non expression1 et que expression2 alors
...
fin si

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu
ucfoutu 18035 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 17 février 2018 Dernière intervention - 7 janv. 2016 à 16:48
0
Utile
1
Et je ne comprends pas pourquoi ce micmac au lieu d'utiliser tout simplement la protection des cellules que tu veux protéger :
ton :
ElseIf Intersect(Target, Range("AE1")) Is Nothing Then
Application.Undo

montre que tu veux en fait tout permettre à un utilisateur et tout protéger, sauf la cellule AE1, pour les autres utilisateurs.
protège donc ces cellules selon l'utilisateur ...
En faite le but de cela est de ne pas permettre aucune modification a l'utilisateur lambda grace a cette double condition il ne peut rien modifier sans passer les boutons
Commenter la réponse de ucfoutu
ucfoutu 18035 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 17 février 2018 Dernière intervention - Modifié par ucfoutu le 7/01/2016 à 18:22
0
Utile
si ce qui t'arrête est la détermination de la plage de cellules à protéger (tout sauf une cellule), regarde ce petit exemple de détermination de la plage :
Dans cet exemple , nous retenaons tout sauf la cellule B8 ===>>
Dim plage As Range, cellibre As Range, c As Long, r As Long
Set cellibre = Range("B8")
c = cellibre.Column
r = cellibre.Row
Set plage = Union(Range(Cells(1, c), Cells(r - 1, c)), Range(Cells(r + 1, c), Cells(UsedRange.Rows.Count, c)))
For Each colonne In UsedRange.Columns
If colonne.Column <> c Then
Set plage = Union(plage, colonne)
End If
Next
MsgBox "ta plage à protéger selon l'utilisateur est donc la plage " & plage.Address & vbCrLf & _
"regarde ... je vais la sélectionner. Elle comprend toutes les cellules, sauf la B8"
plage.Select

Yapluka

EDIT : tu peux également faire ceci, qui protège toute la feuille Feui2 (exemple) , sauf la cesllule B8
 
Worksheets("Feuil2").Unprotect
Sheets("Feuil2").Cells.Locked = True
Range("B8").Locked = False
Worksheets("Feuil2").Protect , DrawingObjects:=True, Contents:=True, Scenarios:=True, UserInterfaceOnly:=True


Et plus besoin de ton scénario à coups de Undo ...
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu
0
Utile
je ne peux pas mettre tous simplement de protection car le fichier est partagée, d'ou ce simulacre de protection que j'essaye de faire fonctionner
Commenter la réponse de mikmak78
0
Utile
mon problème sur la partie de boucle de protection qui fonctionne mais sur le fait que l'utilisateur lambda n'arrive pas a fermer le fichier une fois modifé via les boutons/macro
Commenter la réponse de mikmak78
ucfoutu 18035 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 17 février 2018 Dernière intervention - Modifié par ucfoutu le 8/01/2016 à 17:53
0
Utile
je ne peux pas mettre tous simplement de protection car le fichier est partagée

Je ne te comprends pas.
Mets donc ou enlève donc la protection par code VBA, en fonction de l'utilisateur. Cela est à faire dans l'évènement Workbook_Open du classeur.


________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu
mikmak78 59 Messages postés vendredi 5 octobre 2012Date d'inscription 6 mars 2017 Dernière intervention - 29 janv. 2016 à 12:40
0
Utile
re Bonjour
Apres avoir testé avec d'autre login,
J'ai trouver la root cause du probleme, c'est lié a cette macro

Private Sub Workbook_Open()
Flaggreen = True
Select Case VBA.Environ("username")
Case "superuser"
Case Flaggreen = True
Application.OnTime Now + TimeValue("00:00:00"), "antimode"
Case Flaggreen = False
End Select
End Sub


+

Public Sub antimode()
If Application.VBE.ActiveVBProject.Mode > 0 Then Range("A1") = Range("A1")
Application.OnTime Now + TimeValue("00:00:01"), "antimode"

End Sub


qui me permettait de bloquer le bouton "mode creation"
En enlevant cette partie , l'utilisateur peut fermer et sauver par contre maintenant les utilisateurs peuvent se mettre en mode creation et donc by passer les securités....
Commenter la réponse de mikmak78
ucfoutu 18035 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 17 février 2018 Dernière intervention - Modifié par ucfoutu le 29/01/2016 à 13:25
0
Utile
Ta "soluce" est tirée par les cheveux et peu orthodoxe.
Mais si tu y tiens et que ton souci est maintenant d'empêcher que l'on se mette en mode création, cherche donc parmi mes interventions d'il y a peu de temps. Si ma "vieille" mémoire n'est pas complètement devenue pourrie, tu devrais y trouver cela (empêcher le mode création) !
Cherche d'abord cette intervention (fais cet effort). Si tu n'y parviens pas, je la retrouverai moi-même en faisant les gestes de recherche que tu n'auras pas su faire.
J'attends ...

EDIT : Ah ! pour être fort du café, cela l'est ...
Je viens de la trouver, cette discussion (en quelques secondes ...)
C'est en plus A TOI, que j'avais montré comment empêcher le mode création !!!!!

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu
mikmak78 59 Messages postés vendredi 5 octobre 2012Date d'inscription 6 mars 2017 Dernière intervention - 29 janv. 2016 à 16:09
0
Utile
c est sur que c est peu orthodoxe je le concede...
je ne comprends pas ce que tu veux dire puisque j ai ajouté justement la modif que tu m'avais dite cf disussion du 18.06.15.
et pour ne pas avoir une boucle infini j'ai rajouté des "portes sortis"...(voir ci dessus)
Commenter la réponse de mikmak78

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.