XL 2013 Passage deparamètres entre 2 tableaux

escouger

XLDnaute Occasionnel
Bonjour,
J'ai crée un tableau excel simplissime (lanceur) qui permet d'ouvrir un autre tableau (choisi l'utilisateur dans une série de tableaux tous identiques mais avec des contenus différents) .
Comme le tableau appelé peut aussi parfois être lu directement, je voudrais pouvoir identifier -dans le fichier appelé-, s'il a été ouvert via le lanceur ou non.
Je pensais que des variables de type "Public" feraient l'affaire, mais il semble que çà ne fonctionne pas.
Merci de me donner une piste afin que je dépasse cette difficulté ?

Ci joint le "lanceur"
Merci
 

Pièces jointes

  • 2021_Lanceur_formulaire_rando.xlsm
    59.9 KB · Affichages: 20

Dudu2

XLDnaute Barbatruc
Bonjour,
C'est difficile de comprendre ton problème sans autres précisions.
Dans quel module et quelle fonction et à quel niveau le problème se pose-t-il ?
Quel test est supposé dans ton code déterminé si le fichier (un autre classeur ?) est déjà ouvert ?
Est-ce que l'ouverture de ce fichier doit être unique pour 1 utilisateur ou pour plusieurs utilisateurs ?
Si c'est juste 1 utilisateur et que le fichier est un classeur (?) parcours les classeurs ouverts pour le savoir.
D.
 

escouger

XLDnaute Occasionnel
Bonjour sylvanu et Dudu,
La réponse de sylvanu me permet effectivement de savoir dans le lanceur que j'ai ouvert tel fichier.
Mais ce que je voudrais, serait de pouvoir tester dans le fichier ouvert s'il l'a été par le lanceur ou non.
Pour être plus clair avec Dudu, je voudrais pouvoir tester dans la macro Auto_open du fichier qui est ouvert s'il l'a été depuis le lanceur ou non.
Si le fichier appelé par le lanceur est déjà ouvert, le terminaliste=l'utilisateur doit en être avisé et le lanceur stoppé.
Le fichier appelé par le lanceur ne doit être ouvert que pour cet utilisateur exclusivement.
Faudrait-il que je stocke dans le lanceur le nom du fichier appelé, puis lorsque ce fichier est ouvert, programmer un accès au lanceur depuis la macro auo_open par exemple et tester si le nom du fichier en cours est = au nom stocké dans le lanceur ?
Mais je ne vois pas comment faire cela.....
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Une autre solution c'est que le lanceur après avoir ouvert le fichier écrive dans le fichier cible une cellule avec une valeur donnée. ( comme fichier ouvert par le lanceur )
Et dans le fichier cible mettre une macro Sub Workbook_BeforeSave qui efface cette valeur avant d'être enregistrée.
 

Dudu2

XLDnaute Barbatruc
Je pense que tu sais que la fonction Auto_ Open() n'est pas appelée quand le fichier est ouvert par une Macro. Donc entre le Workbook_Open() qui est appelé tout le temps et le Auto_ Open() y a peut-être moyen de s'arranger. Mais comme je n'ai pas bien compris le truc je ne sais pas quoi te recommander.

je voudrais pouvoir tester dans la macro Auto_open du fichier qui est ouvert s'il l'a été depuis le lanceur ou non.
Dans Workbook:
VB:
Private Sub Workbook_Open()
    FichierOuvertParMacro = True
End Sub
Dans un module:
Code:
Public FichierOuvertParMacro As Boolean

Sub  Auto_Open ()
    FichierOuvertParMacro = False
End Sub

Sub FichierOuvertParLanceur()
    MsgBox "Le fichier a été ouvert par le lanceur ? " & IIf(FichierOuvertParMacro, "Oui", "Non")
End Sub
 
Dernière édition:

escouger

XLDnaute Occasionnel
Merci dudu2,
Je savais effectivement que auto_open n'est pas activé en cas d'appel via Macro.
Mais je peux , sans souci, tester dans Workbook_Open() à la place, ainsi c'est toujours bon quelque soit la manière de lancer.
Je n'ai pas encore la solution "ficelée" mais j'avance... pas à pas.
Merci de ton aide
 

Dudu2

XLDnaute Barbatruc
Et tu peux appeler une Macro du lanceur:
VB:
Sub a()
    Dim WB As Workbook
    Const WBName = "H:\Téléchargements\Classeur1.xlsm"
    Const MacroName = "FichierOuvertParLanceur"
    
    Set WB = Workbooks.Open(Filename:=WBName)
    Application.Run ("'" & WBName & "'!" & MacroName)
End Sub
 

Dudu2

XLDnaute Barbatruc
Le fichier appelé par le lanceur ne doit être ouvert que pour cet utilisateur exclusivement.
Si il s'agit d'un accès multi-utilisateurs (de la partie lanceur) avec accès exclusif à un fichier (lancé), tu ne pourras pas régler le problème comme ça; Il faut gérer le partage.
Si c'est la cas je peux te donner un exemple.

Si le fichier appelé par le lanceur est déjà ouvert, le terminaliste=l'utilisateur doit en être avisé et le lanceur stoppé.
déjà ouvert... par qui ? lui-même, un autre utilisateur ?

Faudrait-il que je stocke dans le lanceur le nom du fichier appelé,
Je dirais plutôt stocker dans l'appelé une information de l'appelant. Ça c'est coton !
Si l'appel du classeur appelé est déclenché par un bouton ou une autre Shape des Contrôles de formulaire dans le classeur appelant, le classeur appelé peut connaître le nom de la Shape qui a déclenché la macro qui l'a appelé avec Application.Caller. Si c'est un Contrôle Active X, non !
Donc il faudrait renommer une Shape pour identifier un utilisateur et appeler le classeur appelé via cette Shape. Possible mais lourd. Et puis l'information pour un autre utilisateur n'arrive qu'après l'ouverture de l'appelé.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Si c'est un problème de partage multi-utilisateurs, voici en exemple de mise en oeuvre d'accès exclusif que j'ai fait il y a peu sur la base d'une séquence trouvée sur Internet.
 

Pièces jointes

  • Ouvrir classeur en exclusivité.xlsm
    23.3 KB · Affichages: 1

escouger

XLDnaute Occasionnel
Merci messieurs,
En mixant vos différentes informations, j'ai résolu mon problème d'une façon à la fois simple et suffisante dans ce cas de figure.
En fait dans le lanceur, après avoir ouvert le fichier appelé, je met une valeur "X" dans une cellule inutilisée de mon tableau appelé et en profite pour protéger 3 cellules qui ne doivent pas être modifiée lorsque le tableau est appelé par le lanceur, mais qui peuvent l'être si le tableau est ouvert via excel.
Dans le tableau appelé, lorsque je quitte, (dans le "before_close") je supprime la protection de ces 3 cellules.
Si le fichier appelé est déjà ouvert, lorsque je l'appelle depuis le lanceur, le message standard indiquant que le fichier est déjà ouvert me suffit.
Ce traitement étant effectué en local, il ne peut pas y avoir plusieurs users simultanés.

Merci encore
Problème résolu
 

Statistiques des forums

Discussions
312 080
Messages
2 085 144
Membres
102 793
dernier inscrit
volfy