Microsoft 365 Ouverture d'un onglet par un seul utilisateur

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

denistoulon

XLDnaute Junior
Bonjour,

J'ai vraiment besoin de votre aide mais c'est trop complexe pour moi.

J'ai un fichier Excel sous teams ou plusieurs personnes interviennent dessus. Chacun a son onglet.
Est-il possible que chacun accède à son onglet SANS ACCEDER aux autres.
Paul ne peut ouvrir que l'onglet Paul et récap
Denis ne peut ouvrir que l'onglet Denis et récap
Vincent ne peut ouvrir que l'onglet Vincent et récap
Jean ne peut ouvrir que l'onglet Jean et récap

MOI je peux tout ouvrir

Je sais c'est complexe

Merci pour vos réponses
 

Pièces jointes

Bonjour Denistoulon

Pour un fichier Excel ouvert sur Teams la VBA ne fonctionne pas il faut utiliser les Office Script.

Il est possible de récupérer le nom d'utilisateur ou l'adresse mail de la personne qui ouvre le fichier. Problème il n'est pas possible contrarement aux Vba de lancer le script directement à l'ouverture. Deux solutions s'offrent à vous :
  1. la première c'est de faire une page d'accueil avec un bouton qui permet de lancer le script. Les feuilles sont par défaut masqués et ceci ouvre la feuille de l'utilisateur.
  2. Passer par un flux PowerAutomate qui va récupérer le nom d'utilisateur et éxécuter automatiquement le script.
Je peux vous écrire rapidement le script nécessaire mais si je dois l'adapter à votre environnement office365, pouvez vous me préciser la structure de vos comptes office365 (adresse mail : prénom.nom@societe.com ou autres) ?
 
Bonjour Denistoulon

Pour un fichier Excel ouvert sur Teams la VBA ne fonctionne pas il faut utiliser les Office Script.

Il est possible de récupérer le nom d'utilisateur ou l'adresse mail de la personne qui ouvre le fichier. Problème il n'est pas possible contrarement aux Vba de lancer le script directement à l'ouverture. Deux solutions s'offrent à vous :
  1. la première c'est de faire une page d'accueil avec un bouton qui permet de lancer le script. Les feuilles sont par défaut masqués et ceci ouvre la feuille de l'utilisateur.
  2. Passer par un flux PowerAutomate qui va récupérer le nom d'utilisateur et éxécuter automatiquement le script.
Je peux vous écrire rapidement le script nécessaire mais si je dois l'adapter à votre environnement office365, pouvez vous me préciser la structure de vos comptes office365 (adresse mail : prénom.nom@societe.com ou autres) ?
Merci Turbule,

Quand il ouvre le fichier leur nom apparait. On le voit. Ils ont un identifiant par exemple Denis (moi) je suis répertorier à l'identifiant tzrt124
Est ce que cet élément te convient?
 
Voici le fichier. Il faut que tu mappes dans la feuille Param le nom d'utilisateur et le nom de la feuille. Tu peux ajouter 100 utilisateurs.

J'ai fait un bouton sur la page accueil qui lance le script, il est nécessaire de cliquer sur le bouton. Si tu souhaites que le scipt se lance automatiquement il faut passer par PowerAutomate.

Pour le moment les feuilles sont maqués mais il est possible en modifiant le code visibilité de hidden à VeryHidden c'est à dire non affichables par les utilisateurs en réalisant un clic droit sur les feuilles. 95 % des utilisateurs ne savent pas les afficher dans ce cas là ce qui évite de mettre un mot de passe.


JavaScript:
function main(workbook: ExcelScript.Workbook): string {

    // Log pour debug
    console.log(`Démarrage du script de navigation`);

    // Récupérer les propriétés du classeur pour identifier l'utilisateur
    const props = workbook.getProperties();
    const dernierAuteur = props.getLastAuthor();

    console.log(`Dernier auteur détecté : ${dernierAuteur}`);

    // Si on ne peut pas récupérer l'auteur
    if (!dernierAuteur) {
        console.log(`ERREUR: Impossible de récupérer l'identité de l'utilisateur`);
        return `ERROR: Impossible d'identifier l'utilisateur courant`;
    }

    // Nettoyer l'email
    const emailUtilisateur = dernierAuteur.trim().toLowerCase();
    console.log(`Email formaté : ${emailUtilisateur}`);

    // Récupérer la feuille de paramètres
    const feuilleParam = workbook.getWorksheet("Param");

    if (!feuilleParam) {
        console.log(`ERREUR CRITIQUE: La feuille "Param" n'existe pas`);
        
        // Afficher l'erreur dans la feuille Accueil
        const feuilleAccueil = workbook.getWorksheet("Accueil");
        if (feuilleAccueil) {
            const celluleErreur = feuilleAccueil.getRange("B5");
            celluleErreur.setValue(`⚠️ ERREUR: La feuille "Param" est introuvable`);
            const format = celluleErreur.getFormat();
            format.getFont().setColor("#FF0000");
            format.getFont().setBold(true);
            format.getFont().setSize(12);
        }
        
        return `ERROR: La feuille "Param" est introuvable dans le classeur`;
    }

    // Lire la plage de correspondance A2:B1000
    const plageCorrespondance = feuilleParam.getRange("A2:B1000");
    const valeurs = plageCorrespondance.getValues();

    // Chercher la correspondance email → feuille
    let nomFeuilleAfficher: string | null = null;

    for (let i = 0; i < valeurs.length; i++) {
        const emailLigne = valeurs[i][0];
        const feuilleLigne = valeurs[i][1];

        // Vérifier si la ligne contient des données
        if (emailLigne && feuilleLigne) {
            const emailLigneFormate = emailLigne.toString().trim().toLowerCase();

            if (emailLigneFormate === emailUtilisateur) {
                nomFeuilleAfficher = feuilleLigne.toString().trim();
                console.log(`Correspondance trouvée : ${emailUtilisateur} → ${nomFeuilleAfficher}`);
                break;
            }
        }
    }

    // Récupérer la feuille Accueil pour les messages
    const feuilleAccueil = workbook.getWorksheet("Accueil");

    // Si aucune correspondance trouvée
    if (!nomFeuilleAfficher) {
        console.log(`ERREUR: Aucune correspondance trouvée pour ${emailUtilisateur}`);
        
        if (feuilleAccueil) {
            const celluleErreur = feuilleAccueil.getRange("B5");
            celluleErreur.setValue(`⚠️ Aucun accès configuré pour : ${emailUtilisateur}`);
            
            const format = celluleErreur.getFormat();
            format.getFont().setColor("#FF0000");
            format.getFont().setBold(true);
            format.getFont().setSize(12);
            
            const celluleInfo = feuilleAccueil.getRange("B6");
            celluleInfo.setValue(`Contactez l'administrateur pour obtenir l'accès.`);
            celluleInfo.getFormat().getFont().setItalic(true);
        }
        
        return `ERROR: Aucune correspondance trouvée dans Param pour l'email "${emailUtilisateur}"`;
    }

    // Vérifier si la feuille cible existe
    const feuilleUtilisateur = workbook.getWorksheet(nomFeuilleAfficher);

    if (!feuilleUtilisateur) {
        console.log(`ERREUR: La feuille "${nomFeuilleAfficher}" n'existe pas`);
        
        // Lister les feuilles disponibles pour debug
        const toutesLesFeuilles = workbook.getWorksheets();
        const nomsFeuillesDisponibles = toutesLesFeuilles
            .map(f => f.getName())
            .filter(nom => nom !== "Param" && nom !== "Accueil")
            .join(", ");
        
        console.log(`Feuilles disponibles : ${nomsFeuillesDisponibles}`);
        
        if (feuilleAccueil) {
            const celluleErreur = feuilleAccueil.getRange("B5");
            celluleErreur.setValue(`⚠️ Erreur de configuration : La feuille "${nomFeuilleAfficher}" n'existe pas`);
            
            const format = celluleErreur.getFormat();
            format.getFont().setColor("#FF0000");
            format.getFont().setBold(true);
            format.getFont().setSize(12);
            
            const celluleInfo = feuilleAccueil.getRange("B6");
            celluleInfo.setValue(`Feuilles disponibles : ${nomsFeuillesDisponibles}`);
        }
        
        return `ERROR: La feuille "${nomFeuilleAfficher}" spécifiée dans Param n'existe pas. Feuilles disponibles: ${nomsFeuillesDisponibles}`;
    }

    // Récupérer toutes les feuilles
    const toutesLesFeuilles = workbook.getWorksheets();

    // Parcourir toutes les feuilles pour gérer la visibilité
    for (let feuille of toutesLesFeuilles) {
        const nomFeuille = feuille.getName();

        if (nomFeuille === nomFeuilleAfficher) {
            // Rendre visible et activer la feuille de l'utilisateur
            feuille.setVisibility(ExcelScript.SheetVisibility.visible);
            feuille.activate();
            console.log(`Feuille ${nomFeuille} activée`);

        } else if (nomFeuille === "Accueil") {
            // Garder Accueil visible
            feuille.setVisibility(ExcelScript.SheetVisibility.visible);

        } else if (nomFeuille === "Param") {
            // Masquer complètement Param
            feuille.setVisibility(ExcelScript.SheetVisibility.hidden);
            console.log(`Feuille Param masquée`);

        } else {
            // Masquer toutes les autres feuilles
            feuille.setVisibility(ExcelScript.SheetVisibility.hidden);
            console.log(`Feuille ${nomFeuille} masquée`);
        }
    }
}
 

Pièces jointes

Voici le fichier. Il faut que tu mappes dans la feuille Param le nom d'utilisateur et le nom de la feuille. Tu peux ajouter 100 utilisateurs.

J'ai fait un bouton sur la page accueil qui lance le script, il est nécessaire de cliquer sur le bouton. Si tu souhaites que le scipt se lance automatiquement il faut passer par PowerAutomate.

Pour le moment les feuilles sont maqués mais il est possible en modifiant le code visibilité de hidden à VeryHidden c'est à dire non affichables par les utilisateurs en réalisant un clic droit sur les feuilles. 95 % des utilisateurs ne savent pas les afficher dans ce cas là ce qui évite de mettre un mot de passe.


JavaScript:
function main(workbook: ExcelScript.Workbook): string {

    // Log pour debug
    console.log(`Démarrage du script de navigation`);

    // Récupérer les propriétés du classeur pour identifier l'utilisateur
    const props = workbook.getProperties();
    const dernierAuteur = props.getLastAuthor();

    console.log(`Dernier auteur détecté : ${dernierAuteur}`);

    // Si on ne peut pas récupérer l'auteur
    if (!dernierAuteur) {
        console.log(`ERREUR: Impossible de récupérer l'identité de l'utilisateur`);
        return `ERROR: Impossible d'identifier l'utilisateur courant`;
    }

    // Nettoyer l'email
    const emailUtilisateur = dernierAuteur.trim().toLowerCase();
    console.log(`Email formaté : ${emailUtilisateur}`);

    // Récupérer la feuille de paramètres
    const feuilleParam = workbook.getWorksheet("Param");

    if (!feuilleParam) {
        console.log(`ERREUR CRITIQUE: La feuille "Param" n'existe pas`);
       
        // Afficher l'erreur dans la feuille Accueil
        const feuilleAccueil = workbook.getWorksheet("Accueil");
        if (feuilleAccueil) {
            const celluleErreur = feuilleAccueil.getRange("B5");
            celluleErreur.setValue(`⚠️ ERREUR: La feuille "Param" est introuvable`);
            const format = celluleErreur.getFormat();
            format.getFont().setColor("#FF0000");
            format.getFont().setBold(true);
            format.getFont().setSize(12);
        }
       
        return `ERROR: La feuille "Param" est introuvable dans le classeur`;
    }

    // Lire la plage de correspondance A2:B1000
    const plageCorrespondance = feuilleParam.getRange("A2:B1000");
    const valeurs = plageCorrespondance.getValues();

    // Chercher la correspondance email → feuille
    let nomFeuilleAfficher: string | null = null;

    for (let i = 0; i < valeurs.length; i++) {
        const emailLigne = valeurs[i][0];
        const feuilleLigne = valeurs[i][1];

        // Vérifier si la ligne contient des données
        if (emailLigne && feuilleLigne) {
            const emailLigneFormate = emailLigne.toString().trim().toLowerCase();

            if (emailLigneFormate === emailUtilisateur) {
                nomFeuilleAfficher = feuilleLigne.toString().trim();
                console.log(`Correspondance trouvée : ${emailUtilisateur} → ${nomFeuilleAfficher}`);
                break;
            }
        }
    }

    // Récupérer la feuille Accueil pour les messages
    const feuilleAccueil = workbook.getWorksheet("Accueil");

    // Si aucune correspondance trouvée
    if (!nomFeuilleAfficher) {
        console.log(`ERREUR: Aucune correspondance trouvée pour ${emailUtilisateur}`);
       
        if (feuilleAccueil) {
            const celluleErreur = feuilleAccueil.getRange("B5");
            celluleErreur.setValue(`⚠️ Aucun accès configuré pour : ${emailUtilisateur}`);
           
            const format = celluleErreur.getFormat();
            format.getFont().setColor("#FF0000");
            format.getFont().setBold(true);
            format.getFont().setSize(12);
           
            const celluleInfo = feuilleAccueil.getRange("B6");
            celluleInfo.setValue(`Contactez l'administrateur pour obtenir l'accès.`);
            celluleInfo.getFormat().getFont().setItalic(true);
        }
       
        return `ERROR: Aucune correspondance trouvée dans Param pour l'email "${emailUtilisateur}"`;
    }

    // Vérifier si la feuille cible existe
    const feuilleUtilisateur = workbook.getWorksheet(nomFeuilleAfficher);

    if (!feuilleUtilisateur) {
        console.log(`ERREUR: La feuille "${nomFeuilleAfficher}" n'existe pas`);
       
        // Lister les feuilles disponibles pour debug
        const toutesLesFeuilles = workbook.getWorksheets();
        const nomsFeuillesDisponibles = toutesLesFeuilles
            .map(f => f.getName())
            .filter(nom => nom !== "Param" && nom !== "Accueil")
            .join(", ");
       
        console.log(`Feuilles disponibles : ${nomsFeuillesDisponibles}`);
       
        if (feuilleAccueil) {
            const celluleErreur = feuilleAccueil.getRange("B5");
            celluleErreur.setValue(`⚠️ Erreur de configuration : La feuille "${nomFeuilleAfficher}" n'existe pas`);
           
            const format = celluleErreur.getFormat();
            format.getFont().setColor("#FF0000");
            format.getFont().setBold(true);
            format.getFont().setSize(12);
           
            const celluleInfo = feuilleAccueil.getRange("B6");
            celluleInfo.setValue(`Feuilles disponibles : ${nomsFeuillesDisponibles}`);
        }
       
        return `ERROR: La feuille "${nomFeuilleAfficher}" spécifiée dans Param n'existe pas. Feuilles disponibles: ${nomsFeuillesDisponibles}`;
    }

    // Récupérer toutes les feuilles
    const toutesLesFeuilles = workbook.getWorksheets();

    // Parcourir toutes les feuilles pour gérer la visibilité
    for (let feuille of toutesLesFeuilles) {
        const nomFeuille = feuille.getName();

        if (nomFeuille === nomFeuilleAfficher) {
            // Rendre visible et activer la feuille de l'utilisateur
            feuille.setVisibility(ExcelScript.SheetVisibility.visible);
            feuille.activate();
            console.log(`Feuille ${nomFeuille} activée`);

        } else if (nomFeuille === "Accueil") {
            // Garder Accueil visible
            feuille.setVisibility(ExcelScript.SheetVisibility.visible);

        } else if (nomFeuille === "Param") {
            // Masquer complètement Param
            feuille.setVisibility(ExcelScript.SheetVisibility.hidden);
            console.log(`Feuille Param masquée`);

        } else {
            // Masquer toutes les autres feuilles
            feuille.setVisibility(ExcelScript.SheetVisibility.hidden);
            console.log(`Feuille ${nomFeuille} masquée`);
        }
    }
}
Merci beau je regarde
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour