Création d'un fichier Excel partagé multi utilisateurs

Bonjour,

j'ai besoin d'un coup de pouce concernant un fichier Excel dont j'expliquerai le fonctionnement par la suite.

Donc ce fichier est composé de 6 Feuilles de calcul :

  • 3 feuilles comportant un tableau dans chaque feuille.
  • 3 feuilles masquées étant des tableaux croisés dynamiques des 3 tableaux listés ci-dessus.

Mon problème est le suivant :

Ce fichier étant sur le réseau de mon entreprise, plusieurs personnes doivent y avoir accès en même temps. Cependant lorsque je souhaite partager le fichier "multi-utilisateurs", un message d'erreur s'affiche "Impossible de partager ce classeur, car il contient des tableaux Excel ou des mappages XML. Pour le partager, convertissez les tableaux en plages et supprimez les mappages XML."

Malheureusement, les tableaux croisés dynamiques utilisent les données des tableaux pour réaliser des statistiques par la suite.

Est ce donc possible de garder les tableaux/tableaux croisés dynamiques sans les convertir en plage tout en ayant la possibilité de partager le fichier en mode "multi-utilisateurs" ?

En espérant avoir été assez clair concernant mes explications.

Cordialement,

Bonsoir,

Si c'est pour le partager en consultation, la méthode simple est de l'enregistrer en lecture seule recommandée.

Le partage en mise à jour sous Office Excel de toute façon se gère mal avec la fonctionnalité de classeur partagé. La bonne solution est d'avoir 2 classeurs, l'un pour le code et l'autre pour les données. Seul le classeur contenant le code est partagé .Ce dernier gère les accès au classeur de données et résout les conflits de mise à jour.

Bonsoir,

@Thev, aurais-tu un exemple qui traîne ? Ça peut être intéressant.

Bonsoir JoyeuxNoël,

Je n"ai pas d"exemple simple mais uniquement des applications que j'ai développées pour des associations.

Mais le principe est pour le classeur contenant le code,

1- d'accéder au classeur de données en lecture pour effectuer la saisie et ses contrôles via un formulaire

2- à la validation de la saisie, de fermer le classeur de données et de l'ouvrir en mise à jour s'il est disponible (sinon boucle d'attente de plusieurs secondes). L'intérêt est qu'il ne s'agit que de temps d'attente CPU et non d'un temps de saisie utilisateur.

NB: Ce qui reste éventuellement simple à fournir, c'est un exemple de boucle d'attente pour l'ouverture du classeur en mise à jour.

Bonjour,

Donc si j'ai bien compris thev, il faudrait avoir 1 classeur comportant les 3 feuilles de données ainsi qu'un second classeur avec 3 feuilles comportant la conversion de mes plages de données en tableau et 3 feuilles permettant d'obtenir les tableaux croisés dynamiques voulut.

Comment se passe l'actualisation du second fichier, faut-il passer par vba ou seulement quelques formules suffisent ?

Cordialement,

Bonjour,

Il ne vous faut que 2 classeurs :

- 1 premier classeur pour les données et leur restitution via PowerQuery ou TCD's

- 1 deuxième classeur partagé pour modifier les données via un stockage dynamique des modifications représenté par un plusieurs formulaires (UserForm). Pour ce classeur, VBA est évidemment nécessaire pour les formulaires et la gestion de l'accès en mise à jour.

Sinon, une autre solution est de travailler avec Excel OnLine qui gère nativement les accès concurrents en mise à jour. Pour cela, il faut placer votre fichier non plus sur un serveur d'entreprise mais sur un OneDrive ou un SharePoint.

Bonjour à tous,

Je reviens sur ce sujet car j'ai un autre petit soucis.

en effet après avec plusieurs petites macros j'ai donc bien mes deux classeurs. il fonctionne niquel sauf qu'une fois que je partage le premier classeur en multi utilisateurs et que j'ouvre le second classeur, j'ai un message d'erreur dans la macro suivante :

Dim i As Integer
 Dim nom As String
    Workbooks.Open ThisWorkbook.Path & "\" & "Suivi prépa devis et reviens V2.xls" 'classeur à copier a adapter le nom
 'on parcourt toutes les feuilles
 For i = 1 To Worksheets.Count
 Workbooks("Suivi prépa devis et reviens V2.xls").Activate 'classeur à copier a adapter le nom
nom = Worksheets(i).Name
Sheets(nom).Select 'ligne posant problème
 Sheets(nom).Copy After:=Workbooks("exportdata.xls").Sheets(1) 'classeur à coller a adapter le nom
Sheets(nom).Move After:=Sheets(Sheets.Count) 'on met les onglets dans l'ordre
Next

les feuilles copiées sont des plages de cellules et non des tableau, maintenant dans la feuille me posant problème j'ai des listes déroulantes, est-ce donc la raison de cette erreur ?

Cordialement,

Bonjour,

les feuilles copiées sont des plages de cellules et non des tableau, maintenant dans la feuille me posant problème j'ai des listes déroulantes, est-ce donc la raison de cette erreur ?

Absolument pas. Votre erreur provient d'une mauvaise appartenance de votre feuille au bon classeur. Utiliser plutôt ce code :

    Dim wb_devis As Workbook, wb_export As Workbook, sh As Worksheet

    Set wb_devis = Workbooks.Open(ThisWorkbook.Path & "\" & "Suivi prépa devis et reviens V2.xls")  'classeur à copier a adapter le nom
    Set wb_export = Workbooks("exportdata.xls")

    'on parcourt toutes les feuilles
    For Each sh In wb_devis.Worksheets
        With wb_export
            sh.Copy After:=.Sheets(.Sheets.Count) 'copie dans classeur export après la dernière feuille
        End With
    Next sh

Par ailleurs, pour gérer correctement l'accès en mise à jour de votre classeur de données, vous pourriez utiliser ce code :

Public Sub trait_classeur_données()

    Dim nom_fichier As String
    Dim attente_max As Date, date_fin As Date
    Dim wb_devis As Workbook, wb_export As Workbook, sh As Worksheet

    '// Contrôle accès en maj du classeur sinon attente 5 secondes ...........................................
    nom_fichier = ThisWorkbook.Path & "\" & "Suivi prépa devis et reviens V2.xls"
    erreur_accès = False
    attente_max = Timer + 60                                'attente maximum = 60 secondes
    While IsFileOpenForWrite(nom_fichier)
        If Timer > attente_max Then MsgBox "fichier BDD verrouillé par un autre utilisateur ": Exit Sub
        date_fin = DateAdd("s", 5, Now)
        Application.Wait date_fin
    Wend

    '// Ouverture accès en maj du classeur .................................
    Set wb_devis = Workbooks.Open(nom_fichier)  'classeur à copier a adapter le nom
    Set wb_export = Workbooks("exportdata.xls")

    'on parcourt toutes les feuilles
    For Each sh In wb_devis.Worksheets
        With wb_export
            sh.Copy After:=.Sheets(.Sheets.Count) 'collage dans classeur export après la dernière feuille
        End With
    Next sh

End Sub

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
Rechercher des sujets similaires à "creation fichier partage multi utilisateurs"