fichier partagée et userform

Y compris Power BI, Power Query et toute autre question en lien avec Excel
r
reglaet
Membre fidèle
Membre fidèle
Messages : 176
Appréciation reçue : 1
Inscrit le : 14 mars 2017
Version d'Excel : 2013

Message par reglaet » 5 décembre 2017, 10:32

Bonjour,

J'ai un fichier partagé et quand j'ouvre mon userform dans initialise j'incrémente un textbox avec ce code
Me.TxtN°ordredemission.Value = Sheets("Synthèse Ordre de mission").Range("A" & Rows.Count).End(xlUp).Value + 1
et en fait je voudrait une condition que si l'userform est déjà ouvert sur un poste un autre poste ne puisse l'ouvrir pour éviter d'incrémenter deux fois le même numéro et que ça pose problème lors de l'enregistrement.

Merci.
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'579
Appréciations reçues : 215
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 5 décembre 2017, 11:19

Bonjour,

Pour réaliser cela, je ne vois que cette solution :
1- utiliser une ressource partagée sur le réseau, par exemple un fichier texte
2- tenter d'ouvrir ce fichier au chargement du formulaire
3- mettre en attente l'exécution du code si le fichier est déjà ouvert, jusqu'à ce que le fichier soit fermé .
r
reglaet
Membre fidèle
Membre fidèle
Messages : 176
Appréciation reçue : 1
Inscrit le : 14 mars 2017
Version d'Excel : 2013

Message par reglaet » 5 décembre 2017, 11:39

bonjour Thev,

j'ai pas tout compris, je créer un fichier texte que je place sur le réseau ensuite je tente de l'ouvrir
Application.Workbooks.Open ("\\Q:\Commun\partage plan de maintenance\reservation de vehicule.txt")
et c'est apres je fait comment pour ne pas le voir apparaitre? je ne comprend pas la suite...

Si tu peut me faire un petit bout de code merci.
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'579
Appréciations reçues : 215
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 5 décembre 2017, 12:51

Un exemple de code en utilisant un fichier Excel .xlsx

1- une boucle toutes les 5 secondes vérifiant que le fichier n'est pas ouvert en écriture
2- ouverture du classeur avec masquage de sa fenêtre avant chargement du formulaire
3- fermeture du classeur après déchargement du formulaire
4- fonction disant si le fichier est ouvert en écriture ou non

NB: il ne serait pas inutile de programmer un déchargement automatique du formulaire (avec fermeture du classeur de verrouillage) après un certain laps de temps afin que les autres postes ne soient pas bloqués en cas d'inactivité prolongée du poste ayant chargé le formulaire.
     '...variable à insérer au niveau du module ...............................
    Dim wb_lock As Workbook
    '.........................................................................
    
    '...code à insérer avant chargement du formulaire ........................
    nom_fic = "\\Q:\Commun\partage plan de maintenance\reservation de vehicule.xlsx"
    Do While IsFileOpenForWrite(nom_fic)
        date_fin = DateAdd("s", 5, Now)
        Application.Wait date_fin
    Loop
    Set wb_lock = Workbooks.Open(nom_fic)
    ActiveWindow.Visible = False
    '....fin code à insérer avant chargement du formulaire ...................
        
    '...code à insérer après déchargement du formulaire ........................
    Application.DisplayAlerts = False
    wb_lock.Close
    '....fin code à insérer après déchargement du formulaire ...................

Function IsFileOpenForWrite(ByVal nom_fichier As String) As Boolean
    Dim no_fichier As Long

    On Error Resume Next
    no_fichier = FreeFile()
    Open nom_fichier For Binary Access Read Lock Read Write As #no_fichier
    If Err.Number = 0 Then IsFileOpenForWrite = False _
    Else IsFileOpenForWrite = True
    Close no_fichier

End Function
r
reglaet
Membre fidèle
Membre fidèle
Messages : 176
Appréciation reçue : 1
Inscrit le : 14 mars 2017
Version d'Excel : 2013

Message par reglaet » 5 décembre 2017, 13:23

Merci Thev tu à bien detaillé mais ca ne fonctionne pas j'ai une erreur sur la boucle.

je ne peut pas dire simplement à l'enregistrement de l'userform si numero existe dans feuille synthèse ordre de mission en colonne A prendre le suivant?
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'579
Appréciations reçues : 215
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 5 décembre 2017, 13:49

Au niveau d'un classeur partagé, tu auras un conflit dès lors que 2 postes tentent de mettre à jour une même cellule.
Pour éviter cela, il faut créer une boucle d'attente sur la libération d'une ressource. Cette ressource pourrait au final être une cellule fixe du classeur plutôt qu'un autre classeur du réseau.
Si cette cellule est remplie --> boucle d'attente de 5 secondes par exemple,
Sinon remplissage de la cellule et vidage de la cellule au déchargement du formulaire.
r
reglaet
Membre fidèle
Membre fidèle
Messages : 176
Appréciation reçue : 1
Inscrit le : 14 mars 2017
Version d'Excel : 2013

Message par reglaet » 5 décembre 2017, 13:57

oui peut etre plus simple et plus rapide sur une cellule.

donc quand je click sur mon bouton pour ouvrir mon userform il faudrait que je remplisse une cellule et si cette cellule est deja rempli et qu'un autre poste clique sur l'ouverture de l'userform il renvoi un textbox attente et quand le premier a terminer et qu'on enregistre les données dans la feuille synthèse on supprime le remplissage de la cellule pour permettre à l'autre utilisateur d'ouvrir l'userform.

par contre je suis incapable de concevoir ce code si tu as un peu de temps à me consacrer se serait cool merci pour ton aide tu est vraiment tres calé.
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'579
Appréciations reçues : 215
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 5 décembre 2017, 14:46

Exemple de code avec utilisation d'un nom "verrou" plutôt que d'une cellule fixe.
1- création du nom (1 seule fois)
2- une boucle toutes les 5 secondes vérifiant que le nom n'est pas rempli
3- remplissage du nom
4- lancement d'un déchargement automatique du formulaire et d'une réinitialisation du nom au bout de 5 minutes pour ne pas bloquer les autres postes
5- réinitialisation possible du nom en cas de problème via le menu formules --> Gestionnaire de noms
    '...à exécuter une seule fois ...............................
    Names.Add Name:="verrou", RefersTo:="="""""
    '.........................................................................
    
    '...code à insérer avant chargement du formulaire ........................
    Do While Names("verrou").RefersTo = "=""mis"""
        date_fin = DateAdd("s", 5, Now)
        Application.Wait date_fin
    Loop
    Names("verrou").RefersTo =  "=""mis"""
    Application.OnTime Now + TimeValue("00:05:00"), "libération_formulaire"
    '....fin code à insérer avant chargement du formulaire ...................
        
    '...code à insérer après déchargement du formulaire ........................
    Names("verrou").RefersTo = "="""""
    '....fin code à insérer après déchargement du formulaire ...................


Sub libération_formulaire()

    On Error Resume Next
    Unload UserForm1
    Names("verrou").RefersTo = "="""""

End Sub
r
reglaet
Membre fidèle
Membre fidèle
Messages : 176
Appréciation reçue : 1
Inscrit le : 14 mars 2017
Version d'Excel : 2013

Message par reglaet » 5 décembre 2017, 16:33

merci thev mais la ligne à exécuter une seule fois je la mets ou s'il te plait je n'arrive pas à faire fonctionner le code :oops: je comprend pas comment on met verrou et dans quelle cellule?

desolé...
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'579
Appréciations reçues : 215
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 5 décembre 2017, 17:03

"verrou" n'est pas une cellule mais un nom qui est stocké dans le classeur avec une valeur à blanc.

On laisse tomber la ligne à exécuter une fois. Le plus simple est de créer le nom "verrou" via le menu "Formules"
1) Formules --> Gestionnaire de noms --> cliquer sur nouveau
2) remplir la fenêtre comme l'image ci-dessous
171205050150369198.png
171205050150369198.png (5.17 Kio) Vu 11 fois
3) cliquer sur OK

Le fait d'utiliser un nom plutôt qu'une cellule me parait assurer plus de compatibilité.
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message