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 sheets.select


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut Problème avec sheets.select
    Bonjour tout le monde,

    Alors voilà, j'ai une application vba qui me retourne l'erreur "La méthode select de l'objet _Worksheet a échoué".
    Problème, je ne sais pas pourquoi.

    J'explique clairement la situation :
    Je sais exactement que le problème vient de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PLSWorkbook.Sheets("ResultatRecherche").Select
    Je le sais car j'ai un debug.print("ok1") la ligne précédente qui fonctionne et un debug.Print("ok2") la ligne suivante qui n'affiche pas

    De plus, le nom est correctement orthographié (pas de caractère invisible, pas d'espace en trop, ...) bref aucune erreur.
    Je le sais également car, ce problème ne survient QUE quand j'ouvre cette application depuis un lien hypertext. Si j'ouvre l'application par un double-clic sur son emplacement, tout fonctionne correctement, idem depuis un raccourci sur le bureau.

    Je précise aussi que mon classeur est en invisible, mais que là encore ça ne cause aucun problème avec une ouverture directe.

    Est-ce que le problème pourrait venir du fait que le lien hypertext soit un lien relatif, ou encore parce que j'ai une application en plein écran (mais même avec une application en plein écran, cela fonctionne depuis un raccourci).

    Bref, qu'est-ce qui peut causer cette erreur? (Et j'obtiens la même avec sheets.activate)

  2. #2
    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
    Citation Envoyé par jeanmidudu Voir le message
    Je sais exactement que le problème vient de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PLSWorkbook.Sheets("ResultatRecherche").Select
    Tu sais que c'est là que le problème génère une erreur mais il n'est pas sûr que l'erreur qui le cause soit là.

    Par exemple, si le problème vient du contenu de la variable PLSWorkbook, c'est certainement la ligne où cette variable est renseignée qu'il faudra corriger.

    Je le sais car j'ai un debug.print("ok1") la ligne précédente qui fonctionne et un debug.Print("ok2") la ligne suivante qui n'affiche pas
    Pour savoir où une exécution plante, normalement, il suffit de cliquer sur le bouton Debug dans le message d'erreur s'affiche.

    Au lieu de demander à tes debug.Print d'afficher ok, demande-leur plutôt d'afficher des renseignements utile du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print PLSWorkbook.Name, PLSWorkbook.Count, PLSWorkbook.Worksheets(X).Name
    En remplaçant le X de la fin par le numéro de ton onglet.

    De plus, le nom est correctement orthographié (pas de caractère invisible, pas d'espace en trop, ...) bref aucune erreur.
    Tu l'as fait avec un Ctrl+C / Ctrl+V ?
    Ca ne serait pas un "é" transformé en "e" ?

    Je le sais également car, ce problème ne survient QUE quand j'ouvre cette application depuis un lien hypertext.
    Si j'ouvre l'application par un double-clic sur son emplacement, tout fonctionne correctement, idem depuis un raccourci sur le bureau.
    Tu pourrais en dire plus sur l'environnement de ton code ?
    De quel type de macro s'agit-il (Sub, Function, macro évênementielle) ?
    Comment est-elle lancée ?

  3. #3
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Merci de ta réponse.

    1) Alors oui c'est là que l'exécution, et comme tu le dis, l'erreur qui le cause n'est peut-être (même très probablement) pas là. Je pense qu'elle est causée par autre chose.

    2) Ensuite, le problème ne vient pas de PLSWorkbook. PLSWorkbook étant mon classeur (son nom et non pas une variable) :
    Nom : Capture.JPG
Affichages : 3380
Taille : 116,7 Ko

    3) Les renseignements utiles comme tu dis sont :
    PLSWorkbook.Name = PLSWorkbook
    PLSWorkbook.Count ne fonctionne pas : "Membre de méthode ou de données introuvable"
    Si tu voualis dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print (Application.Workbooks.Count)
    alors le résultat est, et sera toujours : 1

    Le nom de toutes mes feuilles en bouclant :
    PLSWorkbook.Worksheets(X).Name :
    Plans de Surveillance
    Versions
    Bancs
    Equipements
    Criteres
    Zones
    Utilisateurs
    historiqueConnexions
    ResultatRecherche
    4) Oui, il s'agit d'un copié-collé, non, il n'y a aucun caractère spécial dans mes variables, nom de fichiers et autres.
    (Voir également la capture d'écran au-dessus)

    5) Mon projet fait un peu plus de 4000 lignes de code. Je dirais environ 3800 sans les commentaires. Il s'agit d'une sub publique, appelée par une fonction publique, elle-même appelée par un UserForm_initialize
    Si tu veux le code complet de cette sub, le voici :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    Public sub triage() 'Permet le regroupement des extractions filerweb après la copie des données
        Dim feui As Worksheet
        Dim nbLignes As Long, i As Long, f As Long, j As Long
        Dim lastColEntree As Long, lastColSortie As Long, fin As Long, der As Long
        Dim ColSortie As String, colEntree As String
        Dim present As Boolean
     
        Application.Visible = False
     
        With PLSWorkbook.Sheets("ResultatRecherche")
            der = Module1.tailleLigne(.Index)
            For f = .Index + 1 To PLSWorkbook.Sheets.Count 'Pour chacune des feuilles contenant une extraction
                Set feui = PLSWorkbook.Sheets(f) 'On récupère la feuille
                fin = Module1.tailleLigne(feui.Index)
                For i = 1 To fin 'Pour chaque ligne de la feuille
                    If feui.Range("A" & i).Value = "" Then Exit For
                    present = True 'On estime que la ligne est déjà présenté dans la feuille de résultat
                    For j = 1 To der 'Pour chaque ligne de la feuille de résultat
                        If feui.Range("A" & i).Value = .Range("A" & i).Value Then 'Si les lignes de chaque feuilles sont identiques
                            Exit For 'Alors on passe à la ligne suivante
                        Else
                            present = False 'Sinon on indique qu'il y a des différences entre les deux extractions
                        End If
                    Next j
                    If Not present Then
                        feui.Rows(i).Delete shift:=xlUp 'et on supprime les lignes qui diffèrent
                        fin = fin - 1
                    End If
                Next i
                ''''''''''''''''''''''''
                lastColEntree = Module1.tailleColonne(f) 'Récupère la valeur de la dernière colonne de la feuille d'extraction en cours d'étude
     
     
                'lettreColEntree = Module1.ColonneLetter(lastColEntree) 'Permet d'obtenir le code (lettres) correspondant
     
                lastColSortie = Module1.tailleColonne(.Index) + 1 'Idem pour la feuille de résultat
                'feui.Columns("J:" & lettreColEntree).Copy 'On copie l'ensemble des informations
                feui.Range(feui.Cells(1, 10), feui.Cells(10000, lastColEntree)).Copy
     
                'lettreColSortie = Module1.ColonneLetter(lastColSortie) '''
     
    '''''''''''''''''''''''
    'L'exécution plante ici
                PLSWorkbook.Sheets("ResultatRecherche").Select 'Il faut activer la feuille de résultat
    '''''''''''''''''''''''
    '''''''''''''''''''''''
                Debug.Print ("ok")
                '.Range(lettreColSortie & "1").Select 'On colle à la suite des précédentes informations
                .Cells(1, lastColSortie).Select
                ActiveSheet.Paste
            Next f
     
            .Activate 'On réactive la feuille de résultat
            Columns("B:M").Delete shift:=xlUp 'On supprime les colonnes inutiles
            Columns("C:I").Delete shift:=xlUp
     
            nbLignes = Module1.tailleLigne(.Index)
     
            Columns("A:A").NumberFormat = "@" 'On assure le bon format (de garder les zéros) pour les PJI
            For i = 1 To nbLignes 'Pour chaque ligne
                .Range("A" & i).Value = Right(.Range("A" & i).Value, 7) 'Le PJI est raccourci pour ne garder que les 7 derniers chiffres
                For j = 1 To Module1.tailleColonne(.Index) 'Pour chaque colonne
                    .Cells(i, j).Value = Trim(.Cells(i, j).Value) 'On supprime les espaces inutiles
                Next j
            Next i
     
        Application.DisplayAlerts = False
     
            'Suppression des feuilles une fois l'arrangement effectué
            f = PLSWorkbook.Sheets.Count
            While f <> .Index
                Set feui = PLSWorkbook.Sheets(f)
                feui.Delete
                f = f - 1
            Wend
        End With
        Application.DisplayAlerts = True
    End Sub
    Cette sub est placée dans un module, j'en ai 5 en tout. Il n'est pas possible d'avoir d'autres classeurs excel ouverts en même temps. Il s'agit d'une application VBA utilisée avec un classeur invisible. Le classeur est ouvert à la modification, n'est pas partagé, il contient 9 sheets. Je travaille sous Windows 7 64 bits version pro.

    Je ne suis plus novice en VBA, donc toutes ce qui est en rapport avec le nom des varaibles, des feuilles et des objets, l'orthographe, la syntaxe, l'accessibilité, tout a été vérifié.
    Et même si ça n'avait pas été le cas, comme je l'expliquais dans mon premier message, l'application plante UNIQUEMENT lorsqu'elle est ouverte depuis un lien hypertext. Si je l'ouvre depuis un raccourci ou depuis son emplacement ou même en ligne de commande, il fonctionne parfaitement. Ce qui selon moi (je peux me tromper quand même) implique que l'ensemble des noms et accessibilités sont corrects.

    En fait, je me suis rendu compte du problème en faisant un diapo dans lequel j'y ai mis un lien hypertext, et en l'essayant, l'application démarre et tout et tout, mais il arrive ce moment là (et ce moment là uniquement) où l'application plante. Alors que cela fait plusieurs mois qu'elle est utilisée par plusieurs personnes sans jamais planter.

  4. #4
    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
    Citation Envoyé par jeanmidudu Voir le message
    2) Ensuite, le problème ne vient pas de PLSWorkbook. PLSWorkbook étant mon classeur (son nom et non pas une variable) :
    Si PSLWorkbook était bon, je ne vois pas trop pourquoi le Worksheet ne marcherait pas.
    Perso, je fouillerai donc plutôt de ce côté.

    PLSWorkbook.Count ne fonctionne pas : "Membre de méthode ou de données introuvable"
    Si tu voualis dire
    Debug.Print (Application.Workbooks.Count)
    alors le résultat est, et sera toujours : 1
    Non, en fait je voulais dire :
    PLSWorkbook.Woksheets.Count
    C'était surtout pour vérifier si PLSWorkbook était bien un classeur et qu'il contenait des onglets.
    Mais le bouclage sur les feuilles répond à cette question.

    Peut-être peux-tu essayer d'appliquer à Sheets("ResultatRecherche") autre chose qu'un Select, juste pour vérifier qu'on peut le toucher.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print PLSWorkbook.Worksheets("ResultatRecherche").Name
    En fait, je me suis rendu compte du problème en faisant un diapo dans lequel j'y ai mis un lien hypertext
    Je suppose que le diapo se fait dans Powerpoint.
    Ca ne pourrait d'un conflit, un objet PowerPoint qui aurait le même nom ?
    Ca pourrait se vérifier avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print PLSWorkbook.Application
    Je ne suis plus novice en VBA,
    Sur ce forum passent tous les niveaux de développeurs.
    On est donc enclin à commencer par poser des questions de base.

  5. #5
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour,

    L'idée est peut-être bête mais comme tu dis qu'il y a et aura toujours un seul classeur, pourquoi ne pas mettre Thisworkbook.Sheets("***").Select ?

  6. #6
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Citation Envoyé par antonysansh Voir le message
    Bonjour,

    L'idée est peut-être bête mais comme tu dis qu'il y a et aura toujours un seul classeur, pourquoi ne pas mettre Thisworkbook.Sheets("***").Select ?
    Déjà essayé, le résultat est toujours le même.

  7. #7
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Si PSLWorkbook était bon, je ne vois pas trop pourquoi le Worksheet ne marcherait pas.
    C'est bien ça mon problème justement!

    Pour être plus précis, et pour répondre à
    Peut-être peux-tu essayer d'appliquer à Sheets("ResultatRecherche") autre chose qu'un Select, juste pour vérifier qu'on peut le toucher.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print PLSWorkbook.Worksheets("ResultatRecherche").Name
    Eh bien 2 choses ne fonctionnent pas, qui sont
    PLSWorkbook.Worksheets("ResultatRecherche").Activate
    et
    PLSWorkbook.Worksheets("ResultatRecherche").Select
    Tout ce qui n'est pas activate ou select fonctionne. Sheets("ResultatRecherche").Parent , visible, fin bref, seuls les activate et select (y compris en passant par les range et cells) ne fonctionnent pas

    Ca ne pourrait d'un conflit, un objet PowerPoint qui aurait le même nom ?
    Je m'étais posé la question du coup, mais non le problème n'est pas dans une similitude de nom. J'ai essayé ensuite avec un lien hypertext depuis word, mais le résultat est le même. Pas de problème de nom, mais le problème de select et activate est toujours présent.

    Et pour mon niveau de développeur, je dois avouer qu'il m'est arrivé (sur des projets d'une journée) de faire des erreurs bêtes de ce type

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Deux pistes, sans certitude aucune:
    1. Dans les options d'Excel, vérifie l'option Options avancées/Général/Ignorer les autres application qui utilisent l'échange dynamique de donnés.
    2. Essaye d'activer le classeur AVANT d'activer la feuille (deux lignes au lieu d'une)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

Discussions similaires

  1. problème avec un select max
    Par bobic dans le forum Oracle
    Réponses: 7
    Dernier message: 14/11/2005, 11h22
  2. [MySQL] Problème avec un SELECT
    Par glloq8 dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 19/10/2005, 15h10
  3. []Problème avec un "Select Case" : Instructions et..
    Par Olun dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/09/2005, 13h32
  4. Problème avec un SELECT
    Par birkoss dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/08/2005, 19h04
  5. [struts][JSP][select] problème avec le select
    Par redge_touch dans le forum Struts 1
    Réponses: 4
    Dernier message: 14/01/2004, 10h05

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