IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème avec la commande Workbooks


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Par défaut Problème avec la commande Workbooks
    Bonjour à tous,

    Tout d'abord bonne année et meilleurs voeux pour 2008. Santé, bonheur, prospérité...

    Voici mon problème.
    A mon boulot, je travaille sur un fichier Excel qui est stocké sur un serveur. J'ai mis en place une macro pour faire de la récupération d'informations à partir d'autres fichiers Excel qui se trouvent également sur le même serveur. Sur mon poste (je ne sais pas si c'est important mais c'est un PC fixe), tout fonctionne.

    Là où est le problème, c'est que pour 2 de mes collègues la macro ne fonctionne pas (ils ont tous les 2 un PC portable). Nous avons tous les 3 la même version d'Excel (c'est la politique de l'entreprise).

    Après quelques recherches, la commande Workbooks("Documents").Activate (ou .Close) serait en cause. C'est à dire qu'elle n'est pas reconnue par les PC de mes collègues. Pourtant la commande Workbook.Open "Document" fonctionne très bien.
    En d'autres termes, le document dans lequel la macro récupère les informations s'ouvre sans souci mais après plus rien ne marche.


    Est-ce que quelqu'un aurait une idée de la cause de ce problème ? Car je cale sévère.

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    salut,
    bienvenue sur DVP, meilleurs voeux à toi aussi
    déjà petite question : est-ce une erreur de saisie ou tu as mis un coup "Documents" et un coup "Document" dans ton post ?
    - les références du projet sont peut-être aussi à vérifier (même librairies cochées)
    quelle erreur est pondu chez tes collègues ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Par défaut
    Voici mes réponses dans l'ordre :
    . Pour le "Documents", c'est une erreur de saisie de ma part.
    . Qu'entends-tu par même librairies cochés ?
    . Erreur de Type 9 => "Indice en dehors de la plage"

    Le type d'erreur me dirige vers la fonction "Workbooks" car le changement de document n'est pas effectué.
    Là où je ne comprends vraiment pas mon problème, c'est que sur mon poste, tout fonctionne mais pas sur celui de mes collègues.

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    d'accord,
    pour les documents, sont-ils partagés sur un réseau ? les collègues ont-ils aussi accès au fichiers que tu manipules ? L'activation du workbook ne peux marcher que si celui-ci est bien ouvert.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Par défaut
    Le document en question se trouve sur un serveur partagé. Mes collègues y ont accès et tous les pouvoirs.
    Pour mes tests, j'ai bien fait attention de fermer le document sur mon poste avant de le tester sur ceux de mes collègues.

    Connais-tu une autre commande que Workbooks("Mon Document").Activate pour passer d'un fichier à un autre ?

  6. #6
    Membre expérimenté Avatar de Drost
    Profil pro
    Inscrit en
    Août 2007
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2007
    Messages : 192
    Par défaut
    Hello,

    Il me semble que si tes fichiers excels sont ouverts tu peux faire un Activewindow.next ( ou .previous) - peut etre faut il un "s" a windows me souviens plus^^

  7. #7
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Bonsoir,

    J’ai 2 pistes, dont l’une au moins, je l’espère, devrait résoudre ton problème

    La première est spécifique à Windows, et devrait probablement suffire.

    En fonction des préférences système (dans l’explorateur de fichiers, menu Outils/Options des fichiers), on peut choisir de masquer ou non les extensions :



    Lorsque l’on a choisi de masquer les extensions, le fichier "MonClasseur.xls" est affiché comme "MonClasseur" dans l’explorateur de fichier, mais aussi dans la barre de titre de sa fenêtre quand il est ouvert.

    Dans ce cas,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Workbooks("MonClasseur").Activate
    est accepté.

    Si l’on a pas choisi de masquer les extensions, cette syntaxe entraîne une erreur d’exécution 9 ("L’indice n’appartient pas à la sélection”), et on doit utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Workbooks("MonClasseur.xls").Activate
    Ce qui est aberrant est que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Workbooks.Open "MonClasseur"
    est accepté quel que soit l’option choisie.

    Je suppose, étant donné que tu cites Workbooks("Document").Activate et Workbook.Open "Document" , les 2 fois sans l’extension ".xls", que le problème vient de là.

    Les extensions seraient alors masquées sur ton poste et pas sur ceux de tes collègues, ce qui expliquerait que Workbooks("Document").Activate fonctionne sur ton poste et pas sur les leurs.

    C’est pour pallier ce genre de problème que j’utilise systématiquement cette routine dans mes développements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Sub AppelAutoDocument(ByVal Doc As String, Optional MAJLiaisons, Optional ByVal Chemin, Optional Dep As Boolean)
        On Error Resume Next
        Workbooks(Doc).Activate
            If Err.Number = 0 Then
                ' Deprotection éventuelle
                    If Not IsMissing(Dep) Then
                        If Dep Then Deprotege
                    End If
                Exit Sub
            End If
        On Error GoTo Ouvre
        Workbooks(Doc & ".xls").Activate
            If Err.Number = 0 Then
                ' Deprotection éventuelle
                    If Not IsMissing(Dep) Then
                        If Dep Then Deprotege
                    End If
                Exit Sub
            End If
        On Error GoTo 0
        Exit Sub
    Ouvre:
        ChDir ThisWorkbook.Path
        ' MAJ Doc si un nom de chemin a été fourni
            If Not IsMissing(Chemin) Then
                Doc = Chemin & Application.PathSeparator & Doc
            End If
        ' Prise en compte liaisons si info fournie
            If Not IsMissing(MAJLiaisons) Then
                Workbooks.Open Doc, MAJLiaisons
            Else
                Workbooks.Open Doc
            End If
        ' Deprotection éventuelle
            If Not IsMissing(Dep) Then
                If Dep Then Deprotege
            End If
        On Error GoTo 0
    End Sub
    Cette Sub permet d’activer un classeur s’il est déjà ouvert, ou de l’ouvrir sinon. En outre, elle gère le cas échéant (grâce à des arguments optionnels), la mise à jour des liaisons, le chemin d’accès et la déprotection des feuilles du classeur.

    Dans le cadre qui nous intéresse ici, la partie importante est celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        On Error Resume Next
        Workbooks(Doc).Activate
            If Err.Number = 0 Then
                ' Deprotection éventuelle
                ' Cf la procédure complète ci-dessus
                Exit Sub
            End If
        On Error GoTo Ouvre
        Workbooks(Doc & ".xls").Activate
            If Err.Number = 0 Then
                ' Deprotection éventuelle
                ' Cf la procédure complète ci-dessus
                Exit Sub
            End If
    Un gestionnaire d’erreur permet d’éviter un message intempestif.

    Doc étant le nom de fichier fourni comme argument, on tente d’abord d’activer un classeur portant ce nom :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Workbooks(Doc).Activate
    Si cela fonctionne, la propriété Number de l’objet Err reste à 0, et après une éventuelle déprotection des feuilles du classeur, on sort de la procédure avec un Exit Sub.

    Si cela ne fonctionne pas, on complète Doc en ajoutant ".xls", et on recommence. Cela permet d’activer le fichier, s’il est ouvert, que son extension ait été indiquée ou non, et qu’on ait opté ou non pour masquer les extensions (cf. illustration plus haut).

    Ce n’est que si les 2 tentatives précédentes ont échoué, qu’on en déduit que le classeur n’est pas encore ouvert, et qu’on l’ouvre.

    NB - Je n’ai pas fait d’adaptation pour le moment pour prendre en compte l’extension des fichiers au format X-07, "xlsx" et "xlsm".

    La seconde piste consiste simplement à affecter le classeur à une variable objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim wb as Workbook
        Workbooks("Document")
        Set wb = ActiveWorkbook
        ' ...
    Par la suite, on peut utiliser

    ou

    et cela devrait fonctionner indépendamment des infos fournies ou non pour l’extension.

    Cordialement,

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 88
    Par défaut proposition aux modérateurs
    bonjour et meilleurs voeux à tous

    bravo à Bigalo pour sa très belle réponse. Pour ma part, je lui vote des lauriers. je propose aux modérateurs que cette réponse soit accessible quelque part dans la FAQ, ou contribuez, ou à tout autre endroit qui va bien.

    merci encore.

  9. #9
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Merci pour tes lauriers

    Espérons que stitch5969 sera également satisfait !

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Par défaut
    Bonsoir Michel,

    Dans ta procedure, je ne comprend pas ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub AppelAutoDocument(ByVal Doc As String, Optional MAJLiaisons,
     Optional ByVal Chemin, Optional Dep As Boolean)
    ...
            If Not IsMissing(Dep) Then
                If Dep Then Deprotege
            End If
    Dep étant déclaré comme Boolean et non comme Variant, IsMissing(Dep) renvoie systematiquement False, que l'argument soit précisé ou non lors de l'appel. Not False renvoyant True, le second test est donc forcement executé, quel est donc l'intéret du premier?

    Merci de tes eclaircissements si j'ai raté quelque chose.

    Bonne soirée,

    Tirex28/

  11. #11
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Bonsoir,

    Tu m’as posé une colle : AppelAutoDocument est une procédure écrite à l’origine avec l’ancien langage macro d’Excel, il y a une vingtaine d’années.

    Je l’ai transposée en VBA, probablement en 97, quand j’ai commencé à découvrir ce "nouveau" langage. Depuis je n’y ai pratiquement pas touché.

    Ou plus exactement, j’ai rajouté l'argument Dep après quelques années, en oubliant que IsMissing implique l’usage d’un Variant. NB - Bien évidemment, en pratique, je ne fournis l’argument Dep, que si j’ai besoin de déprotéger les feuilles du classeur concerné.

    Tu as tout à fait raison, on peut supprimer le test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            If Not IsMissing(Dep) Then
    utilisé 3 fois qui plus est, ce qui aboutit à cette version simplifiée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Sub AppelAutoDocument(ByVal Doc As String, Optional MAJLiaisons, Optional ByVal Chemin, Optional Dep As Boolean)
        On Error Resume Next
        Workbooks(Doc).Activate
            If Err.Number = 0 Then
                ' Deprotection éventuelle
                If Dep Then Deprotege
                Exit Sub
            End If
        On Error GoTo Ouvre
        Workbooks(Doc & ".xls").Activate
            If Err.Number = 0 Then
                ' Deprotection éventuelle
                If Dep Then Deprotege
                Exit Sub
            End If
        On Error GoTo 0
        Exit Sub
    Ouvre:
        ChDir ThisWorkbook.Path
        ' MAJ Doc si un nom de chemin a été fourni
            If Not IsMissing(Chemin) Then
                Doc = Chemin & Application.PathSeparator & Doc
            End If
        ' Prise en compte liaisons si info fournie
            If Not IsMissing(MAJLiaisons) Then
                Workbooks.Open Doc, MAJLiaisons
            Else
                Workbooks.Open Doc
            End If
        ' Deprotection éventuelle
        If Dep Then Deprotege
    End Sub
    Cordialement,

  12. #12
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Par défaut
    Citation Envoyé par Bigalo Voir le message
    Merci pour tes lauriers

    Espérons que stitch5969 sera également satisfait !
    Merci Bigalo, ta remarque a solutionné mon problème.
    Etant en formation toute la semaine, je n'aurai pas le temps d'intégrer tes remarques dans ma macro mais je n'y manquerai pas par la suite.

    Comme le petit nicolas, je vote des lauriers pour ta réponse claire.

    Encore merci pour cette énorme épine retiré.

  13. #13
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Bonjour,

    Merci de ton appréciation. . Je pensais bien avoir trouvé la cause du problème, et je suis heureux d’en avoir confirmation.

    Bonne formation.

    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probléme avec la commande SendKeys
    Par ProgElecT dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 09/12/2006, 22h24
  2. Problème avec la commande sed
    Par JUSTIN Loïc dans le forum Linux
    Réponses: 2
    Dernier message: 05/09/2006, 10h17
  3. Problème avec la commande nice
    Par ShadoX dans le forum Administration système
    Réponses: 2
    Dernier message: 08/08/2006, 18h59
  4. Problème avec la commande revoke sous oracle
    Par merlubreizh dans le forum Oracle
    Réponses: 19
    Dernier message: 28/04/2006, 15h02
  5. [C++] Problème avec la commande "make"
    Par quantik-revolution dans le forum Systèmes de compilation
    Réponses: 6
    Dernier message: 02/04/2006, 18h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo