Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

vba : faire une feuille de saisie "collaborative" qui n'écrase pas la saisie du copain précédent ...

5 réponses
Avatar
Alfred WALLACE
Bonsoir les gurus,
j'ai une feuille de saisie (excel 2007) qui doit =EAtre remplie
par plusieurs personnes. le fichier est enregistr=E9 dans un r=E9pertoire
d'un r=E9seau local.

heu ... "normalement" (quoique) c'est la derni=E8re personne
qui enregistre le fichier qui "=E0 raison", en =E9crasant =E9ventuellement
la saisie d'autre personnes ...
Je crois savoir qu'une gestion d'acc=E8s concurrents existe, mais ...
de m=E9moire, cela g=E9n=E8re des fichiers excel tr=E8s gros (ce qui est pe=
ut
=EAtre
normal).

j'aimerai exp=E9rimenter (gr=E2ce =E0 votre aide) une autre m=E9thode.

supposons :
PIERRE doit remplir les cellules de G10 =E0 G15
ISABELLE " " " " G16 =E0 G17
LUCIEN ------------------------------------- G18 =E0 G20.

j'imagine que, lorsque Pierre saisi quelque chose en G10, puis G11,
etc .... une macro
irait =E9crire un fichier excel nomm=E9 (par exemple pierrejanvier.xls)

De la m=EAme fa=E7on, Isabelle aurait son fichier isabellejanvier.xls, et
lucienjanvier.xls.

la feuille principale feuille.xls, ne serait =E0 aucun moment
enregistr=E9e ! et, par contre
=E0 l'ouverture de cette feuille, les valeurs des cellules
correspondantes seraient affich=E9es
purement et simplement dans feuille.xls (et on n'affiche rien si les
feuilles secondaires n'existent pas).

Est-ce que, avec un petit exemple, un guru pourrait me montrer comment
lorsque dans la feuille.xls on saisie une valeur dans G10, la plage
[G10:G15] est
enregistr=E9e dans le fichier secondaire ?

Au del=E0 de la "pratique", je suis preneur des suggestions =E9clair=E9es
de tous !

Merci
Jos=E9

5 réponses

Avatar
MichD
Bonjour,

Supposons que les 3 personnes ouvrent le fichier en même temps,
chacun remplit la section des données comme il se doit...
le hic, seules les données de celui qui fermera le fichier en dernier seront enregistrées.

Tu pourrais créer 3 fichiers (1 pour chacun) et un fichier de consolidation ayant une petite macro
qui se chargerait de mettre tout à jour à chaque ouverture.

Une autre alternative est une macro qui indique aux personnes subséquentes que le fichier est déjà
ouvert par quelqu'un d'autre et qu'il est par conséquent non disponible pour le moment.

Voici un bout de code à partir duquel tu pourrais travailler. Perso, je ne l'ai jamais testé.



Écris par Michel Rameaux la proposition originale de Sigonneau et Cie

'---------------------------------------------------------------
Sub DémoOuvrirFichier()

Dim Chemin As String, Chemin2 As String
Dim Fichier As String

' Classeur nécessaire :
Chemin = _
Workbooks("Gestion.xls").Worksheets("Données").Range("A1").Value
Chemin2 = "Suivi"
Fichier = "Données.xls"

'Test de l'existence du fichier et son chemin
Call ExisteFichier(Chemin, Chemin2, Fichier)
If Trouvé = False Then
Call FichierAbsent
'Le Fichier n'existe pas :
'traitement de l 'erreur
GoTo FichierAbsent
Exit Sub
End If

'Test d'Ouverture du classeur
Call OuvrirFichier(Chemin, Chemin2, Fichier)
'Traitement
If Occupé = True Then
GoTo FichierUtilisé ' Traitement de l'erreur
Exit Sub
Else
If OuvertLocal = True Then
MsgBox "Tout va bien, mais le fichier " & _
"est ouvert localement"
Exit Sub
Else
MsgBox "Tout va bien. On ouvre le fichier"
End If
End If
Exit Sub
FichierAbsent:
' Placer ici le code
MsgBox "Le fichier n'existe pas"
Exit Sub
FichierUtilisé:
' Placer ici le code
MsgBox "Le fichier n'est pas disponible"
End Sub
'---------------------------------------------------------------
Private Function ExisteFichier(Chemin, Chemin2, Fichier) As Boolean

If Dir(Chemin & "" & Chemin2 & "" & Fichier) = "" Then
' Le Fichier n'existe pas
Trouvé = False
Mess = MsgBox("Le dossier - " & UCase(Fichier) & _
" n'existe pas ou a été déplacé." & vbCrLf & vbCrLf & _
"Impossible de continuer.", vbOKOnly, _
"Ouverture des dossiers")
Else
'Le Fichier existe
Trouvé = True
End If
End Function
'---------------------------------------------------------------

Private Function OuvrirFichier(Chemin, Chemin2, Fichier) As Boolean

Dim FileNum As Integer, ErrNum As Integer

' Le Fichier est-il déja disponible s
' sur le PC (en local)?
On Error Resume Next
Set W = Workbooks(Fichier)
If Err = 0 Then
Debug.Print Err
'Fichier Ouvert en local
OuvertLocal = True
Exit Function
Else
'Err=9
Debug.Print Err
'Fichier non ouvert en local
OuvertLocal = False
End If

If OuvertLocal = False Then
'Le Fichier n'est pas ouvert localement,
'est-il disponible sur le réseau?
On Error Resume Next
FileNum = FreeFile()
Open (Chemin & "" & Chemin2 & "" & Fichier) _
For Input Lock Read As #FileNum
Close FileNum
ErrNum = Err
On Error GoTo 0
Select Case ErrNum
Case 0
'Fichier non utilisé
Occupé = False
Case 70
'Fichier utilisé
Occupé = True
Mess = MsgBox("Le dossier - " & UCase(Fichier) & _
"n'est pas disponible. Merci de renouveler " & _
"votre demande ultérieurement.", _
vbOKOnly, "Ouverture des dossiers")
Case Else
Error ErrNum
End Select
End If
End Function
'---------------------------------------------------------------


MichD
------------------------------------------
"Alfred WALLACE" a écrit dans le message de groupe de discussion :


Bonsoir les gurus,
j'ai une feuille de saisie (excel 2007) qui doit être remplie
par plusieurs personnes. le fichier est enregistré dans un répertoire
d'un réseau local.

heu ... "normalement" (quoique) c'est la dernière personne
qui enregistre le fichier qui "à raison", en écrasant éventuellement
la saisie d'autre personnes ...
Je crois savoir qu'une gestion d'accès concurrents existe, mais ...
de mémoire, cela génère des fichiers excel très gros (ce qui est peut
être
normal).

j'aimerai expérimenter (grâce à votre aide) une autre méthode.

supposons :
PIERRE doit remplir les cellules de G10 à G15
ISABELLE " " " " G16 à G17
LUCIEN ------------------------------------- G18 à G20.

j'imagine que, lorsque Pierre saisi quelque chose en G10, puis G11,
etc .... une macro
irait écrire un fichier excel nommé (par exemple pierrejanvier.xls)

De la même façon, Isabelle aurait son fichier isabellejanvier.xls, et
lucienjanvier.xls.

la feuille principale feuille.xls, ne serait à aucun moment
enregistrée ! et, par contre
à l'ouverture de cette feuille, les valeurs des cellules
correspondantes seraient affichées
purement et simplement dans feuille.xls (et on n'affiche rien si les
feuilles secondaires n'existent pas).

Est-ce que, avec un petit exemple, un guru pourrait me montrer comment
lorsque dans la feuille.xls on saisie une valeur dans G10, la plage
[G10:G15] est
enregistrée dans le fichier secondaire ?

Au delà de la "pratique", je suis preneur des suggestions éclairées
de tous !

Merci
José
Avatar
Alfred WALLACE
Bonjour MichD, et merci pour ce code !

je recherche plutôt la solution évoquée dans mon message
et dont tu reparles avec le "fichier de consolidation".

L'idée est d'ouvrir ce fichier de consolidation.
lorsque une personne saisie une valeur dans une cellule, la macro
va écrire dans la même cellule d'un AUTRE fichier particulier.

Chaque personne ayant une zone bien déterminée à remplir, rien
n'est écrasé puisque le fichier de consolidation **n'est pas**
enregistré.

c'est pas de la tarte ...
Merci !
José


On 8 fév, 19:06, "MichD" wrote:
Bonjour,

Supposons que les 3 personnes ouvrent le fichier en même temps,
chacun remplit la section des données comme il se doit...
le hic, seules les données de celui qui fermera le fichier en dernier s eront enregistrées.

Tu pourrais créer 3 fichiers (1 pour chacun) et un fichier de consolida tion ayant une petite macro
qui se chargerait de mettre tout à jour à chaque ouverture.

Une autre alternative est une macro qui indique aux personnes subséquen tes que le fichier est déjà
ouvert par quelqu'un d'autre et qu'il est par conséquent non disponible pour le moment.

Voici un bout de code à partir duquel tu pourrais travailler. Perso, je ne l'ai jamais testé.

Écris par Michel Rameaux la proposition originale de Sigonneau et Cie

'---------------------------------------------------------------
Sub DémoOuvrirFichier()

Dim Chemin As String, Chemin2 As String
Dim Fichier As String

' Classeur nécessaire :
Chemin = _
Workbooks("Gestion.xls").Worksheets("Données").Range("A1").Value
    Chemin2 = "Suivi"
    Fichier = "Données.xls"

    'Test de l'existence du fichier et son chemin
    Call ExisteFichier(Chemin, Chemin2, Fichier)
    If Trouvé = False Then
        Call FichierAbsent
        'Le Fichier n'existe pas :
        'traitement de l 'erreur
        GoTo FichierAbsent
        Exit Sub
    End If

    'Test d'Ouverture du classeur
    Call OuvrirFichier(Chemin, Chemin2, Fichier)
    'Traitement
    If Occupé = True Then
        GoTo FichierUtilisé  ' Traitement de l'erreur
        Exit Sub
    Else
        If OuvertLocal = True Then
            MsgBox "Tout va bien, mais le fichier " & _
            "est ouvert localement"
            Exit Sub
        Else
            MsgBox "Tout va bien. On ouvre le fichier"
        End If
    End If
    Exit Sub
FichierAbsent:
    ' Placer ici le code
    MsgBox "Le fichier n'existe pas"
    Exit Sub
FichierUtilisé:
    ' Placer ici le code
    MsgBox "Le fichier n'est pas disponible"
End Sub
'---------------------------------------------------------------
Private Function ExisteFichier(Chemin, Chemin2, Fichier) As Boolean

If Dir(Chemin & "" & Chemin2 & "" & Fichier) = "" Then
    ' Le Fichier n'existe pas
    Trouvé = False
    Mess = MsgBox("Le dossier - " & UCase(Fichier) & _
    " n'existe pas ou a été déplacé." & vbCrLf & vbCrLf & _
        "Impossible de continuer.", vbOKOnly, _
            "Ouverture des dossiers")
Else
    'Le Fichier existe
    Trouvé = True
End If
End Function
'---------------------------------------------------------------

Private Function OuvrirFichier(Chemin, Chemin2, Fichier) As Boolean

Dim FileNum As Integer, ErrNum As Integer

' Le Fichier est-il déja disponible s
' sur le PC (en local)?
    On Error Resume Next
    Set W = Workbooks(Fichier)
    If Err = 0 Then
        Debug.Print Err
        'Fichier Ouvert en local
        OuvertLocal = True
        Exit Function
    Else
        'Err=9
        Debug.Print Err
        'Fichier non ouvert en local
        OuvertLocal = False
    End If

    If OuvertLocal = False Then
        'Le Fichier n'est pas ouvert localement,
        'est-il disponible sur le réseau?
        On Error Resume Next
        FileNum = FreeFile()
        Open (Chemin & "" & Chemin2 & "" & Fichier) _
        For Input Lock Read As #FileNum
        Close FileNum
        ErrNum = Err
        On Error GoTo 0
        Select Case ErrNum
            Case 0
                'Fichier non utilisé
                Occupé = False
            Case 70
                'Fichier utilisé
                Occupé = True
                Mess = MsgBox("Le dossier - " & UCase(F ichier) & _
                "n'est pas disponible. Merci de renouvele r " & _
                "votre demande ultérieurement.", _
                    vbOKOnly, "Ouverture des dossiers ")
            Case Else
                Error ErrNum
        End Select
    End If
End Function
'---------------------------------------------------------------

MichD
------------------------------------------
"Alfred WALLACE"  a écrit dans le message de groupe de discussion :


Bonsoir les gurus,
j'ai une feuille de saisie (excel 2007) qui doit être remplie
par plusieurs personnes. le fichier est enregistré dans un répertoire
d'un réseau local.

heu ... "normalement" (quoique) c'est la dernière personne
qui enregistre le fichier qui "à raison", en écrasant éventuellemen t
la saisie d'autre personnes ...
Je crois savoir qu'une gestion d'accès concurrents existe, mais ...
de mémoire, cela génère des fichiers excel très gros (ce qui est peut
être
normal).

j'aimerai expérimenter (grâce à votre aide) une autre méthode.

supposons :
PIERRE doit remplir les cellules de G10 à G15
ISABELLE  "    "                  "      " G16 à G17
LUCIEN -------------------------------------  G18 à G20.

j'imagine que, lorsque Pierre saisi quelque chose en G10, puis G11,
etc .... une macro
irait écrire un fichier excel nommé (par exemple pierrejanvier.xls)

De la même façon, Isabelle aurait son fichier isabellejanvier.xls, et
lucienjanvier.xls.

la feuille principale feuille.xls, ne serait à aucun moment
enregistrée ! et, par contre
à l'ouverture de cette feuille, les valeurs des cellules
correspondantes seraient affichées
purement et simplement dans feuille.xls (et on n'affiche rien si les
feuilles secondaires n'existent pas).

Est-ce que, avec un petit exemple, un guru pourrait me montrer comment
lorsque dans la feuille.xls on saisie une valeur dans G10, la plage
[G10:G15] est
enregistrée dans le fichier secondaire ?

Au delà de la "pratique", je suis preneur des suggestions éclairées
de tous !

Merci
José
Avatar
MichD
Imagine que les 3 usagers travaillent en même temps dans le fichier.
Seules les données du dernier usager à la fermeture du fichier seront présentes
dans le classeur. Les données des deux autres auront été écrasées. En conséquence,
le fichier ne recevra que les données du dernier fichier! Non ?

Le principe, chaque usager à une copie différente du même fichier. Chacun remplit la section qui lui est assignée.

Dans le fichier de consolidation, tu crées une macro qui s'exécute au moment de l'ouverture du fichier (ou autre moment)
et qui est appelée par le Workbook_Open du ThisWorkbook. Cette macro a pour objet de ressembler les données des
3 autres fichiers...



MichD
------------------------------------------
"Alfred WALLACE" a écrit dans le message de groupe de discussion :


Bonjour MichD, et merci pour ce code !

je recherche plutôt la solution évoquée dans mon message
et dont tu reparles avec le "fichier de consolidation".

L'idée est d'ouvrir ce fichier de consolidation.
lorsque une personne saisie une valeur dans une cellule, la macro
va écrire dans la même cellule d'un AUTRE fichier particulier.

Chaque personne ayant une zone bien déterminée à remplir, rien
n'est écrasé puisque le fichier de consolidation **n'est pas**
enregistré.

c'est pas de la tarte ...
Merci !
José


On 8 fév, 19:06, "MichD" wrote:
Bonjour,

Supposons que les 3 personnes ouvrent le fichier en même temps,
chacun remplit la section des données comme il se doit...
le hic, seules les données de celui qui fermera le fichier en dernier seront enregistrées.

Tu pourrais créer 3 fichiers (1 pour chacun) et un fichier de consolidation ayant une petite macro
qui se chargerait de mettre tout à jour à chaque ouverture.

Une autre alternative est une macro qui indique aux personnes subséquentes que le fichier est déjà
ouvert par quelqu'un d'autre et qu'il est par conséquent non disponible pour le moment.

Voici un bout de code à partir duquel tu pourrais travailler. Perso, je ne l'ai jamais testé.

Écris par Michel Rameaux la proposition originale de Sigonneau et Cie

'---------------------------------------------------------------
Sub DémoOuvrirFichier()

Dim Chemin As String, Chemin2 As String
Dim Fichier As String

' Classeur nécessaire :
Chemin = _
Workbooks("Gestion.xls").Worksheets("Données").Range("A1").Value
Chemin2 = "Suivi"
Fichier = "Données.xls"

'Test de l'existence du fichier et son chemin
Call ExisteFichier(Chemin, Chemin2, Fichier)
If Trouvé = False Then
Call FichierAbsent
'Le Fichier n'existe pas :
'traitement de l 'erreur
GoTo FichierAbsent
Exit Sub
End If

'Test d'Ouverture du classeur
Call OuvrirFichier(Chemin, Chemin2, Fichier)
'Traitement
If Occupé = True Then
GoTo FichierUtilisé ' Traitement de l'erreur
Exit Sub
Else
If OuvertLocal = True Then
MsgBox "Tout va bien, mais le fichier " & _
"est ouvert localement"
Exit Sub
Else
MsgBox "Tout va bien. On ouvre le fichier"
End If
End If
Exit Sub
FichierAbsent:
' Placer ici le code
MsgBox "Le fichier n'existe pas"
Exit Sub
FichierUtilisé:
' Placer ici le code
MsgBox "Le fichier n'est pas disponible"
End Sub
'---------------------------------------------------------------
Private Function ExisteFichier(Chemin, Chemin2, Fichier) As Boolean

If Dir(Chemin & "" & Chemin2 & "" & Fichier) = "" Then
' Le Fichier n'existe pas
Trouvé = False
Mess = MsgBox("Le dossier - " & UCase(Fichier) & _
" n'existe pas ou a été déplacé." & vbCrLf & vbCrLf & _
"Impossible de continuer.", vbOKOnly, _
"Ouverture des dossiers")
Else
'Le Fichier existe
Trouvé = True
End If
End Function
'---------------------------------------------------------------

Private Function OuvrirFichier(Chemin, Chemin2, Fichier) As Boolean

Dim FileNum As Integer, ErrNum As Integer

' Le Fichier est-il déja disponible s
' sur le PC (en local)?
On Error Resume Next
Set W = Workbooks(Fichier)
If Err = 0 Then
Debug.Print Err
'Fichier Ouvert en local
OuvertLocal = True
Exit Function
Else
'Err=9
Debug.Print Err
'Fichier non ouvert en local
OuvertLocal = False
End If

If OuvertLocal = False Then
'Le Fichier n'est pas ouvert localement,
'est-il disponible sur le réseau?
On Error Resume Next
FileNum = FreeFile()
Open (Chemin & "" & Chemin2 & "" & Fichier) _
For Input Lock Read As #FileNum
Close FileNum
ErrNum = Err
On Error GoTo 0
Select Case ErrNum
Case 0
'Fichier non utilisé
Occupé = False
Case 70
'Fichier utilisé
Occupé = True
Mess = MsgBox("Le dossier - " & UCase(Fichier) & _
"n'est pas disponible. Merci de renouveler " & _
"votre demande ultérieurement.", _
vbOKOnly, "Ouverture des dossiers")
Case Else
Error ErrNum
End Select
End If
End Function
'---------------------------------------------------------------

MichD
------------------------------------------
"Alfred WALLACE" a écrit dans le message de groupe de discussion :


Bonsoir les gurus,
j'ai une feuille de saisie (excel 2007) qui doit être remplie
par plusieurs personnes. le fichier est enregistré dans un répertoire
d'un réseau local.

heu ... "normalement" (quoique) c'est la dernière personne
qui enregistre le fichier qui "à raison", en écrasant éventuellement
la saisie d'autre personnes ...
Je crois savoir qu'une gestion d'accès concurrents existe, mais ...
de mémoire, cela génère des fichiers excel très gros (ce qui est peut
être
normal).

j'aimerai expérimenter (grâce à votre aide) une autre méthode.

supposons :
PIERRE doit remplir les cellules de G10 à G15
ISABELLE " " " " G16 à G17
LUCIEN ------------------------------------- G18 à G20.

j'imagine que, lorsque Pierre saisi quelque chose en G10, puis G11,
etc .... une macro
irait écrire un fichier excel nommé (par exemple pierrejanvier.xls)

De la même façon, Isabelle aurait son fichier isabellejanvier.xls, et
lucienjanvier.xls.

la feuille principale feuille.xls, ne serait à aucun moment
enregistrée ! et, par contre
à l'ouverture de cette feuille, les valeurs des cellules
correspondantes seraient affichées
purement et simplement dans feuille.xls (et on n'affiche rien si les
feuilles secondaires n'existent pas).

Est-ce que, avec un petit exemple, un guru pourrait me montrer comment
lorsque dans la feuille.xls on saisie une valeur dans G10, la plage
[G10:G15] est
enregistrée dans le fichier secondaire ?

Au delà de la "pratique", je suis preneur des suggestions éclairées
de tous !

Merci
José
Avatar
Alfred WALLACE
Hello !
ben, les 3 usagers ouvrent le fichier de consolidation.

l'usagé A n'a en charge que les cellules C20 à C25
l'usagé B n'a en charge que les cellules C26 à C28
l'usagé C n'a en charge que les cellules C29 à C30

imaginons que les 3 aient ouvert le fichier de consolidation.

A saisie les valeurs respectives, ainsi que B et que C.

aucun des usagés d'enregistre la feuille de consolidation.

la macro que j'essaye de faire, va "capter" la donnée saisie en C20,
puis
l'enregistrer dans le fichier excel POUR-A.XLS.
et idem pour les 2 autres.

De la sorte que, aucun ne va écraser la saisie du voisin puisque
les données respectives se trouvent dans des fichiers différents. Sauf
biensur si l'un d'eux s'amuse à aller "bidouiller" dans les cellules
qui ne le regardent pas.

voilà j'espère que c'est un peu plus "lisible" ...
merci encore
José




On 9 fév, 14:14, "MichD" wrote:
Imagine que les 3 usagers travaillent en même temps dans le fichier.
Seules les données du dernier usager à la fermeture du fichier seront présentes
dans le classeur. Les données des deux autres auront été écrasé es. En conséquence,
le fichier ne recevra que les données du dernier fichier! Non ?

Le principe, chaque usager à une copie différente du même fichier. Chacun remplit la section qui lui est assignée.

Dans le fichier de consolidation, tu crées une macro qui s'exécute au moment de l'ouverture du fichier (ou autre moment)
et qui est appelée par le Workbook_Open du ThisWorkbook. Cette macro a pour objet de ressembler les données des
3 autres fichiers...

MichD
Avatar
MichD
Dans le fichier de destination OÙ dans la feuille, les usagers doivent-ils enregistrer les données?
Quelle colonne pour chacun? À la suite des données déjà présentes ou toujours dans la même plage de cellules ?
Donne quelques indications...


MichD
------------------------------------------
"Alfred WALLACE" a écrit dans le message de groupe de discussion :


Hello !
ben, les 3 usagers ouvrent le fichier de consolidation.

l'usagé A n'a en charge que les cellules C20 à C25
l'usagé B n'a en charge que les cellules C26 à C28
l'usagé C n'a en charge que les cellules C29 à C30

imaginons que les 3 aient ouvert le fichier de consolidation.

A saisie les valeurs respectives, ainsi que B et que C.

aucun des usagés d'enregistre la feuille de consolidation.

la macro que j'essaye de faire, va "capter" la donnée saisie en C20,
puis
l'enregistrer dans le fichier excel POUR-A.XLS.
et idem pour les 2 autres.

De la sorte que, aucun ne va écraser la saisie du voisin puisque
les données respectives se trouvent dans des fichiers différents. Sauf
biensur si l'un d'eux s'amuse à aller "bidouiller" dans les cellules
qui ne le regardent pas.

voilà j'espère que c'est un peu plus "lisible" ...
merci encore
José




On 9 fév, 14:14, "MichD" wrote:
Imagine que les 3 usagers travaillent en même temps dans le fichier.
Seules les données du dernier usager à la fermeture du fichier seront présentes
dans le classeur. Les données des deux autres auront été écrasées. En conséquence,
le fichier ne recevra que les données du dernier fichier! Non ?

Le principe, chaque usager à une copie différente du même fichier. Chacun remplit la section qui lui est assignée.

Dans le fichier de consolidation, tu crées une macro qui s'exécute au moment de l'ouverture du fichier (ou autre moment)
et qui est appelée par le Workbook_Open du ThisWorkbook. Cette macro a pour objet de ressembler les données des
3 autres fichiers...

MichD