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 :

Classeurs et Macro Graphique


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 18
    Par défaut Classeurs et Macro Graphique
    Bonjour, voilà le problème :

    J'ai créé une macro créant un graphique. Je l'ai enregistrée dans un classeur personnel "perso.xls". (accessible depuis n'importe quel classeur)

    A partir d'un autre classeur, je lance la macro, et obtiens l'erreur "l'indice n'appartient pas à la sélection". Et dans le code ça bloque là :

    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
    Sub TestGraphique2()
    '
    ' TestGraphique2 Macro
    ' Macro enregistrée le 24/06/2009 par Tomtom
    '
    
    '
        ActiveWindow.ScrollRow = 31
        ActiveWindow.ScrollRow = 92
        (...) (il y en a beaucoup)
        ActiveWindow.ScrollRow = 17174
        ActiveWindow.ScrollRow = 17205
        ActiveWindow.ScrollRow = 17235
        Range("W3:W17268").Select
        Range("W17268").Activate
        Charts.Add
        ActiveChart.ChartType = xlLine
        ActiveChart.SetSourceData Source:=Sheets("voie_0_").Range( _
            "W3:W17268"), PlotBy:=xlColumns
    Sachant que le classeur initial où j'ai créé la macro s'appelle "voie_0_" et que je lance cette macro depuis un autre classeur.

    Pour exécuter la macro dans un classeur "B", il faut que les données soient prises dans ce même classeur "B" et non pas dans le classeur initial "A" où a été définie la macro.

    Comment faut-il modifier ça ?
    Je vous remercie.
    Tom

  2. #2
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Bonjour à tous,

    Essai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Workbooks("nomduclasseur").worksheets("voie_0_").Range( _
            "W3:W17268"), PlotBy:=xlColumns

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 18
    Par défaut
    Dans mon code initial, si je remplace à la main "voie_0_" par le nom du classeur dans lequel je souhaite utiliser ma macro, ça marche. Mais je souhaite utiliser cette macro pour d'autres classeurs (beaucoup).

    Je viens d'essayer ton code aalex_38 et ça ne marche pas : même indication d'erreur au même endroit.



    D'autres idées ?
    Tom

  4. #4
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Je viens d'essayer ton code aalex_38 et ça ne marche pas : même indication d'erreur au même endroit.
    J'ai pourtant un code similaire qui fonctionne (je met que le code utile):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    With Workbooks("Classeur2").Worksheets(1)
        Dim MyCell As Range
        Set MyCell = .Cells(.Range("A65536").End(xlUp).Row, 1)
    '...
    end with
     
    Set MyG = Charts.Add(After:=ThisWorkbook.Sheets(Sheets.Count))
     
    With MyG
        .Name = MyChartName
        .ChartType = xl3DColumnClustered
        .SetSourceData Source:=MyCell, PlotBy:=xlColumns
    '...
    end with

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 18
    Par défaut
    Aalex_38, je vais essayer de préciser.
    Dans mon classeur A, je crée une macro générant un graphique utilisant les données de la seule feuille du classeur A. Le code créé est :

    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
    Sub TestGraphique3()
    '
    ' TestGraphique3 Macro
    ' Macro enregistrée le 25/06/2009 par Tomtom
    '
    
    '
        ActiveWindow.ScrollRow = 3969
        ActiveWindow.ScrollRow = 4211
        ActiveWindow.ScrollRow = 4453
        ActiveWindow.ScrollRow = 4847
        ActiveWindow.ScrollRow = 5362
        ActiveWindow.ScrollRow = 6119
        ActiveWindow.ScrollRow = 7058
        ActiveWindow.ScrollRow = 8088
        ActiveWindow.ScrollRow = 9330
        ActiveWindow.ScrollRow = 10450
        ActiveWindow.ScrollRow = 11571
        ActiveWindow.ScrollRow = 12631
        ActiveWindow.ScrollRow = 13540
        ActiveWindow.ScrollRow = 14479
        ActiveWindow.ScrollRow = 15115
        ActiveWindow.ScrollRow = 15660
        ActiveWindow.ScrollRow = 16145
        ActiveWindow.ScrollRow = 16599
        ActiveWindow.ScrollRow = 16962
        ActiveWindow.ScrollRow = 17235
        ActiveWindow.ScrollRow = 3938
        ActiveWindow.ScrollRow = 17235
        ActiveWindow.ScrollColumn = 20
        ActiveWindow.ScrollColumn = 19
        ActiveWindow.ScrollColumn = 18
        ActiveWindow.ScrollColumn = 17
        ActiveWindow.ScrollColumn = 18
        Range("W3:W17268").Select
        Range("W17268").Activate
        Charts.Add
        ActiveChart.ChartType = xlXYScatterLinesNoMarkers
        ActiveChart.SetSourceData Source:=Sheets("A").Range( _
            "W3:W17268"), PlotBy:=xlColumns
        ActiveChart.SeriesCollection(1).XValues = "=A"
        ActiveChart.SeriesCollection(1).Name = "=""Youpi"""
        ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="genial"
        With ActiveChart
            .HasTitle = True
            .ChartTitle.Characters.Text = "Youpi"
            .Axes(xlCategory, xlPrimary).HasTitle = True
            .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "yeah"
            .Axes(xlValue, xlPrimary).HasTitle = False
        End With
    End Sub
    Le code est donc relatif à la feuille de mon classeur appelé A.

    Je souhaite ensuite appliquer cette macro dans un autre classeur B. Ca ne marche pas, et ça bloque à l'endroit où la macro essaie d'atteindre les données du classeur A (normal), ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ActiveChart.SetSourceData Source:=Sheets("A").Range( _
            "W3:W17268"), PlotBy:=xlColumns
    Le principe d'une macro c'est que ça soit réutilisable dans d'autres classeurs : le code ne doit pas dépendre du classeur où la macro a été créée, non ?

    Pour répondre à ton dernier message, oui, si je change à la main le "A" en "B" et que je lance la macro dans le classeur B çà fonctionne, il n'y a pas besoin de préciser le workbook (classeur ?).

    Pour indication, d'autres macros classiques fonctionnent (où je fais juste des calculs).

    Ou bien serait-ce un problème de rangement de classeurs et de feuilles ?

    Cela éclaire-t-il ?
    Tom

  6. #6
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Bonjour,


    Dans l'exemple que je t'ai donné, le graphique n'est pas créer dans le classeur 2 mais depuis un autre classeur.

    Ca ne marche pas, et ça bloque à l'endroit où la macro essaie d'atteindre les données du classeur A
    Ton classeur A est-il ouvert au moment ou te lance la macro, sinon ça ne fonctionne pas, il faut l'ouvrir avant de l'utiliser.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 317
    Par défaut
    Bonjour,

    Si tu veux pouvoir utiliser ce code pour n'importe quel classeur, remplace tout ce qui ressemble à un nom d'onglet par ActiveSheet...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 18
    Par défaut
    Dans l'exemple que je t'ai donné, le graphique n'est pas créer dans le classeur 2 mais depuis un autre classeur.
    Ah, j'avais pas saisi. Cependant, ça ne marche pas, (en laissant le classeur A ouvert), j'ai le même message d'erreur au même endroit.

    Avec ACtiveSheet, ça ne marche pas non plus avec l'erreur "Propriété ou méthode non gérée par l'objet" :
    (je mets le code intégral, c'est quasiment le même, y'a plus les activewindow du début)
    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
    Sub Maquereau()
    '
    ' Maquereau Macro
    ' Macro enregistrée le 25/06/2009 par Tomtom
    '
    
    '
        Range("B:B,H:H").Select
        Range("H1").Activate
        Charts.Add
        ActiveChart.ChartType = xlLine
        ActiveChart.SetSourceData Source:=ActiveSheet.Range( _
            "B1:B17269,H1:H17269"), PlotBy:=xlColumns
        ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="bap"
        With ActiveChart
            .HasTitle = True
            .ChartTitle.Characters.Text = "µYEAH"
            .Axes(xlCategory, xlPrimary).HasTitle = False
            .Axes(xlValue, xlPrimary).HasTitle = False
        End With
    End Sub
    Enfin, pour tes quelques lignes de code Aalex_38, je sais pas où les insérer, je maîtrise pas vraiment le langage.(et tes 3 petits points je sais pas si ça fait partie du code ou pas.)

    Des suggestions ?
    Merci
    Tom

  9. #9
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    ton problème est bien de récuperer la source dans le bon document ? Alors au lieu de la mettre directement comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Source:=ActiveSheet.Range( "B1:B17269,H1:H17269")
    Dans le code que je t'ai montré, je la récupère comme ça dans le claseur2 ( depuis le classeur1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Workbooks("Classeur2").Worksheets(1)
        Dim MyCell As Range
        Set MyCell = .Range("B1:B17269,H1:H17269")
    end with
    Ensuite pendant la création du graphique, je renseigne la source avec la plage récupérée :


  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 18
    Par défaut
    Arf. Je crois qu'on s'est mal compris.
    ton problème est bien de récuperer la source dans le bon document ?
    Oui.

    Dans le code que je t'ai montré, je la récupère comme ça dans le claseur2 ( depuis le classeur1)
    Non, je crois que c'est pas ça.

    Je crée la macro depuis le classeur A, générant un graphique dans le classeur A à partir de données présentes dans le classeur A.
    Ensuite, je veux utiliser cette macro dans le classeur B, pour créer un graphique dans le classeur B, en utilisant les données de ce même classeur B.

    Il me semble qu'il faudrait utiliser une sorte de ActiveSheet pour ne pas faire de référence exacte au classeur A dans le code généré. La référence doit être une sorte de feuille courante.

    Me fais-je bien comprendre ?
    Tom

  11. #11
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Me fais-je bien comprendre ?
    Beaucoup mieux et c'est bien plus clair maintenant et la solution sans doute plus simple

    Juste une précision ta macro sera présente dans le classeur A et b ou seulement dans A ?

    Veux-tu que la macro s'exécute automatiquement sur tous les classeurs ouverts, ou seulement celui que tu indiques.

    Si c'est seulement celui que tu indiques, veux tu l'indiquer dans la macro ou dans une cellule ou dans une boite de dialogue ?

    En attendant ta réponse regarde ce que fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Lister_Les_Classeurs_ouverts()
    Dim wb As Workbook
     
    Dim MaCell As Range
    For Each wb In Workbooks
    With wb
        Set MaCell = .Worksheets(1).Range("A1")
        MsgBox "Nom du classeur " & .Name & vbCrLf & "Contenu cellule " & MaCell.Address & " :" & MaCell.Value
    End With
    Next wb
     
    End Sub

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 18
    Par défaut
    Ah ! On avance.
    J'enregistre ma macro dans un classeur personnel "PERSO.XLS" qui est accessible depuis tous les classeurs. Je crois que l'accessibilité n'est pas un problème ici, c'est bon.
    Je n'aurai donc pas besoin du code de ton dernier post je pense.

    La solution simple se dessine-t-elle ?
    Tom

  13. #13
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Ok, donc ta macro est dans le classeur personnel des macros complémentaires, comment veux tu que t'a macro s'execute :
    - chaque fois que tu ouvres un classeur.
    - Tu lanceras toi même la macro

    Si tu lances toi même la macro veux-tu qu'elle s'execute sur tous les classeurs ouverts ou seulement sur le classeur actif ou bien qu'une boite de dialogue s'affiche te demandans sur quel classeur lancer la macro (il faut alors créer un userform) ?

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 18
    Par défaut
    Je souhaite lancer ma macro moi-même pour qu'elle s'exécute sur le classeur actif.

    Je sens qu'on y est, et, comme à Pyramide, je dirais : "en un".

    Merci
    Tom

  15. #15
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Ca ne marche pas, et ça bloque à l'endroit où la macro essaie d'atteindre les données du classeur A
    Attention de ne pas confondre workbook (classeur) et worksheet (feuille) dans l'exemple cité ci-dessus tu fais la confusion.

    Je souhaite lancer ma macro moi-même pour qu'elle s'exécute sur le classeur actif.
    Si on ne précise pas le classeur alors la macro s'execute sur le classeur actif.

    Le code que je t'ai donné hier à 12 h23 fonctionne, dans ton cas il suffit de l'adapter, d'abord tu définni ta plage :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With ActiveWorkbook.Worksheets(1) ' premiere feuille du classeur actif
        Dim MyCell As Range
        Set MyCell = .Range("B1:B17269,H1:H17269")
    end with
    Ensuite tu utilises cette plage pour la source comme je t'ai montré.

    Nb: tu peux ajouter un espion sur la variable Mycell en mode pas à pas ce qui te donneras tout un tas d'informations sur la valeur du range.

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 18
    Par défaut
    OUI ! C'est bon, ça fonctionne grâce à ton dernier post. J'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With ActiveWorkbook.Worksheets(1) ' premiere feuille du classeur actif
        Dim MyCell As Range
        Set MyCell = .Range("B1:B17269,H1:H17269")
    End With
    puis dans la commande pour le graphique Merci Aalex_38 d'avoir pris le temps de résoudre mon problème.

    Tom

  17. #17
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Oui le tout était de bien se comprendre, en plus j'ai pu réviser la création de graphiques.

    Cet exemple montre que lorsque on prend l'habitude d'instancier les feuilles ou les range... on évite certaines erreurs et parfois on gagne du temps.

    Personnellement je rajouterai qu'il faut se méfier de tout ce qui commence par ACTIV dans le code car alors il faut vraiment maitriser quel élement est actif.
    Il m'arrive de lancer des macro par exemples depuis excel alors que je suis sur une autre feuille que celle sur laquelle la macro va agir. Si on utilise par exemple ActiveSheet, le résultat n'est pas celui attendu.

    Même le code que je t'ai donné n'est pas le meilleur car ici la feuille n'est pas nommé et en cas de déplacement aie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkbook.Worksheets(1)

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

Discussions similaires

  1. [XL-2003] Copie de classeur sans macro
    Par Enthau dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 03/07/2009, 10h41
  2. Macro Graphique Dynamique
    Par FreddyNB dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/11/2007, 21h49
  3. Masquer le classeur des macros personnelles
    Par mattjol dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/04/2007, 09h26
  4. [VBA-E] Empécher l'ouverture ou fermer les classeur de macros personnalisé
    Par LitteulKevin dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/03/2007, 20h37
  5. Excel, macro, graphique
    Par djibril dans le forum Modules
    Réponses: 8
    Dernier message: 05/05/2006, 21h18

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