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 :

Erreur Workbooks.close, indice en dehors de la plage


Sujet :

Macros et VBA Excel

  1. #1
    Invité
    Invité(e)
    Par défaut Erreur Workbooks.close, indice en dehors de la plage
    Bonjour,

    Aujourd'hui, je me confronte à un problème à première vue assez basique mais dont je ne trouve pas la solution, le voici :

    J'ai pour objectif de créer une fonction permettant de récupérer un nombre important d'informations sur l'une des machines de mon entreprise et de les inscrire dans un fichier excel.
    Le cheminement que j'effectue est le suivant :

    -Je récupère les informations de la machine dans des variables
    -Je lance la création du fichier excel
    -Je remplis ce fichier avec les informations récupérées dans mes variables
    -Je l'affiche à l'utilisateur puis le sauvegarde automatiquement à un emplacement fixe et avec un nom fixe.

    Cependant, j'aimerai vérifier que le fichier créé plus tôt ne soit pas encore ouvert si l'on ré exécute la fonction, chose logiquement assez simple :

    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
    Private Sub donnee()
     
     If EstClasseurOuvert(App.Path & "\XXX\XXX.xlsx") Then
                Workbooks(App.Path & "\XXX\XXX.xlsx").Close
     End If
     
    end Sub
     
    Public Function EstClasseurOuvert(MonClasseur As String)
     
        Dim NumeroFichier As Long
        Dim NumeroErreur As Long
     
        On Error Resume Next
            NumeroFichier = FreeFile()
            Open MonClasseur For Input Lock Read As #NumeroFichier
            Close NumeroFichier
            NumeroErreur = Err
        On Error GoTo 0
     
        Select Case NumeroErreur
            Case 0:    EstClasseurOuvert = False
            Case 70:   EstClasseurOuvert = True
            Case Else: Error NumeroErreur
        End Select
     
    End Function
    Mais je tombe sur une erreur qui me dit que l'indice est en dehors de la plage lors du workbooks.close alors que je suis sûr que le chemin indiqué est correct !

    Si quelqu'un a une idée d'où peut venir le problème, merci d'avance .

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Bonjour,

    Essaye avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks("XXX.xlsx").Close
    Il me semble que n'as besoin que du nom du fichier, et pas de tout le chemin pour le fermer

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Bonjour,

    Essaye avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks("XXX.xlsx").Close
    Il me semble que n'as besoin que du nom du fichier, et pas de tout le chemin pour le fermer
    Merci de ton aide, malheureusement j'avais déjà essayé de cette façon, l'erreur est toujours présente.

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    un classeur ouvert alors que l'on est dans une instance de l'application Excel devient l'un des éléments de la collection WorkBooks de l'instance en cours.
    La gestion d'erreur faite ici est maladroite.
    Il est bien plus adroit d'affecter le classeur que l'on ouvre à une variable déclarée comme workbook et initialisée par une instruction Set. Il est ensuite facile :
    - tant de fermer le classeur (en appliquant l'instruction close à cette variable)
    - que de détruire totalement cette variable (en lui affectant l'objet Nothing) lorsque souhaité (après fermeture du dernier classeur ouvert et avant fermeture du classeur "principal".

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Si le fichier à tester est un classeur Excel, je ne comprends pas pourquoi tu utilises le Open des fichiers ouverts séquentiellement.
    Il serait plus simple d'utiliser Workbooks.Open.

    Mais il y a une méthode plus simple et plus efficace pour savoir si un fichier Excel est ouvert sur le poste de la macro : scruter la collection Workbooks.
    Ca t'éviterait de mettre des actions dans une fonction (ce qui n'est jamais bon) et l'utilisation de On Error (ce qui n'est pas très bon non plus).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub donnee()
     If EstClasseurOuvert("XXX.xlsx") Then Workbooks("XXX.xlsx").Close
    End Sub
     
    Public Function EstClasseurOuvert(MonClasseur As String) As Boolean
        Dim WB_I As Workbook
        EstClasseurOuvert = False
        For Each WB_I In Workbooks
            If WB_I.Name = MonClasseur Then EstClasseurOuvert = True
        Next WB_I 
        Set WB_I = Nothing
    End Function

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour
    un classeur ouvert alors que l'on est dans une instance de l'application Excel devient l'un des éléments de la collection WorkBooks de l'instance en cours.
    La gestion d'erreur faite ici est maladroite.
    Il est bien plus adroit d'affecter le classeur que l'on ouvre à une variable déclarée comme workbook et initialisée par une instruction Set. Il est ensuite facile :
    - tant de fermer le classeur (en appliquant l'instruction close à cette variable)
    - que de détruire totalement cette variable (en lui affectant l'objet Nothing) lorsque souhaité (après fermeture du dernier classeur ouvert et avant fermeture du classeur "principal".
    Bonjour unparia,
    J'ai suivi tes conseils et voici ce que je j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub donnee()
     
    Dim xlBook As Excel.Workbook 
     
    If EstClasseurOuvert(App.Path & "\XXX\XXX.xlsx") Then
                Set xlBook = Workbooks("XXX.xlsx")
                xlBook.Close
                Set xlBook = Nothing
    End If
     
    End Sub
    Cependant l'erreur persiste même de cette façon.

    EDIT : Merci de ton conseil Menhir, je vais de suite l'appliquer .

  7. #7
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Vérification de niveau grand débutant ‼

    Activer le classeur puis côté VBE dans la fenêtre Exécution entrer ?activeworkbook.name et valider …

    ___________________________________________________________________________________________________________
    Je suis Paris, New-York, Mogadicio, Barcelone, London, Manchester, Egypte, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

Discussions similaires

  1. [ VBS + Excel ] Erreur " Indice en dehors de la plage "
    Par adaoudi dans le forum VBScript
    Réponses: 2
    Dernier message: 02/07/2014, 10h35
  2. Erreur (Indice en dehors de la plage) Fonction SPLIT [VBS]
    Par Cristalinz dans le forum VBScript
    Réponses: 8
    Dernier message: 18/11/2013, 16h45
  3. Indice en dehors de la plage (erreur 9)
    Par Polotaz dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/01/2012, 12h43
  4. "Erreur d'exécution '9'. Indice en dehors de la plage"
    Par bassiste dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 08/12/2008, 13h40
  5. [VB6] Pb tableau 2D : indice en dehor de la plage
    Par belfaigore dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 03/10/2006, 17h15

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