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 :

Copie Shape sans Select [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Par défaut Copie Shape sans Select
    Bonjour tout le monde.

    je disposais de ce code (généré et retouché légèrement par l'enregistreur de macro ), permetant d'aller dans un onglet, selectionner une shape portant un nom défini dans une variable, la copier, aller dans un second onglet, coller la shape dans une cellule, puis la deplacer et lui appliquer une echelle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sheets(WorksheetConsigne).Select
                ActiveSheet.Shapes.Range(Array(CelluleConsigne.Value)).Select
                Selection.Copy
                Sheets(WorksheetCible).Select
                CelluleCible.Select
                ActiveSheet.Paste
     
                Selection.ShapeRange.IncrementLeft 4
                Selection.ShapeRange.IncrementTop 4
     
                Selection.ShapeRange.ScaleHeight 0.640625, msoFalse, msoScaleFromTopLeft
    ce code fonctionnait parfaitement, sauf si je faisait du debug (F8) où, la fenetre VB reprenant le focus, les select (pas bien !!!) perdaient la boule.
    ce point, connu, ne posait pas de difficulté, je le contournais quand necessaire.

    depuis, j'ai ajouté malheureusement une userform qui interomp le déroulement du programme (bien avant ce bout de code), en necessitant une manipulation utilisateur.
    évidement, cet ajout, indispensable, fait perdre, comme VB pour le mode debug, le focus.

    j'ai beau essayer de le redonner a grand coup de select, j'ai tout essayé, cela ne marche tout simplement plus.

    et de toute facon, travailler avec du select, cay le mal.

    sauf que là, ce type de "chose" (copier un shape d'un onglet a l'autre dans une cellule donné, puis la deplacer + echelle) je ne sais pas faire autrement (loose)

    je suis donc completement coincé.


    info sur les variables :
    WorksheetConsigne : string contenant le nom de l'onglet ou se trouve le shape d'origine.
    CelluleConsigne.Value : une cellule bien particulière, situé sur le meme onglet, donnant le nom du shape, un string, quoi (par exemple : "Picture 7")
    WorksheetCible : string contenant le nom de l'onglet où l'on veu coller l'image dupliqué.
    CelluleCible : un range contenant l'adresse row,collumns, de la cellule sur l'onglet "cible" où l'on veu coller l'image précisement.



    comment remplaceriez vous ligne a ligne cette fonction, avec les varriables listé, pour se passer de select (et re-rendre donc viable cette indispensable fonction de ma macro)



    en vous remerciant d'avance.


    cordialement.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Essayez ces deux codes en adaptant les zones nommées et le nom des onglets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub TestDupliquerShape()
     
    Dim CelluleConsigne As Range
    Dim CellCible As Range
     
     
        Set CelluleConsigne = Sheets("Source").Range("NomDeLaForme")
        Set CellCible = Sheets("Cible").Range("DestinationForme")
        DupliquerShape Sheets("Source"), Sheets("Cible"), CellCible, CelluleConsigne
     
        Set CellCible = Nothing
        Set CelluleConsigne = Nothing
     
    End Sub

    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
     
     
    Sub DupliquerShape(ByVal FeuilleSource As Worksheet, ByVal FeuilleCible As Worksheet, ByVal CelluleCible As Range, ByVal NomShapeRecherche As String)
     
    Dim ShapeRecherche As Shape
     
        For Each ShapeRecherche In FeuilleSource.Shapes
            If ShapeRecherche.Name = NomShapeRecherche Then
               With FeuilleSource.Shapes(NomShapeRecherche)
                    .Select
                    .Copy
                    FeuilleCible.Paste Destination:=CelluleCible
                    With Selection
                         .ShapeRange.IncrementLeft 4
                         .ShapeRange.IncrementTop 4
                         .ShapeRange.ScaleHeight 0.640625, msoFalse, msoScaleFromTopLeft
                    End With
               End With
            End If
        Next ShapeRecherche
     
    End Sub
    Cordialement.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Par défaut
    Bonjour

    il y a du mieux : si je lance le code en mode "debug", a grand renfort de F8, tout se passe au poil
    mais si je lance au milieux de mon debug un F5 ou que je lance le code directement sans debug, il plante.

    Erreur D'execution '1004':
    La methode 'paste' de l'objet '_worksheet' a écouché.

    la ligne désigné par l'erreur est :
    FeuilleCible.Paste Destination:=CelluleCible
    mais si je fais du F8 (après l'erreur), en réalité, le code parvient à l'etape suivante, et plante sur :
    .ShapeRange.IncrementLeft 4

    cette fois ci
    Erreur d'execution '438':
    Propriété ou méthode non gérée par cet objet

    il est tout simplement possible que la génération de l'erreur précédente face perdre de la boule au "With Selection", enfin, c'est ce que je penserais, à première vue.


    que faire ?


    cordialement.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Avez-vous la possibilité de mettre un fichier exemple (même partiel) en ligne contenant votre Userform et votre macro en indiquant ce que vous souhaitez faire ?

    Si votre fichier est du type xlsm, il vous faudra le ziper pour le mettre en ligne.

    Cordialement.
    Dernière modification par AlainTech ; 27/04/2014 à 02h12. Motif: Suppression de la citation inutile

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Par défaut
    Bonjour, et merci beaucoup de t'inquieter de mon sort


    il s'agit fort heureusement d'un projet pro ... pour la qualité de vie au service
    rien de "top secret" ni meme serieux, bien que de nombreuses section du code (dont celle qui m'importe ici) vont ou sont utilisé dans d'autres macro, plus serieuse.

    par contre, comme je pense que la facon de contourner le soucis est centralisé dans le bout de code sus cité, mais que la cause du bug est plus "abstraite", et du a "des échanges" avec l'ensemble du code, je ne vois pas trop comment "simplifier" le code pour le concentrer uniquement autour du bug. si j'en retire trop, il y a des chance qu'il se remette a fonctionner sans raison.
    j'en profite aussi pour noter que j'ai tenté un "on error resume next" (que vous retrouverez en commentaire) que je vous conseil de tester, tant les résultat sont ... interressant. le systeme ne bug plus (pas de message d'erreur) mais laaaaag énormement. il marche, mais ne fait pas de mise a l'echelle, puis fini a un moment (variable) par se tromper, selectionne la mauvaise forme, et ne va pas plus loin (toujours sans message d'erreur)



    je vous passe donc tout le fichier, directement. les dates et les noms de personne sont bidon, donc le fichier ne contient rien de "critique".
    il s'agit d'un planning integralement automatisé.
    je vous conseil de le tester dans l'etat (bouton actualiser sur l'onglet "fermeture"), il devrait marcher directement (en tout cas, moi, il tourne au poil).
    vous aurez a un moment une message box inutile (qui est faite pour "forcer" un refresh de la fenetre qui apparaitra juste apres. j'aurais pu corriger ce bug de maniere plus elegante, mais j'ai été au plus vite / bourrin la dessus). juste ensuite, vous aurez la liste des personnes, qui donne "l'offset" pour le début du calcul du "croissant" (qui amene le croissant vendredi ?)
    c'est ridicule , mais par facilité, c'est sur le "croissant" que je vais vous faire voir le bug, parce qu'il est plus facile d'identifier un point ou mettre un arret debug.
    mettez dans cette boite de dialogue une personne au pif, et laissez la macro finir son taf (sans bug)

    dans la configuration (qui marche) d'origine, les croissant sont symbolisé par des triangle jaune. tout fonctionne. la partie de la fonction en charge de la création de forme géométrique ne souffre donc d'aucun défaut particulier.


    maintenant que vous avez vu une fois la macro tourner, allez dans l'onglet "fermeture", et dans la liste déroulante "Croissant" (L10), changez "triangle" par une ou l'autre des "picture" (a priori, pour rester cohérent : Picture 8)
    cela "pilote" normalement la fonction graphique pour lui demander, au lieu de dessiner un triangle, de venir chercher la "picture 8" (logo vienoiserie) dans l'onglet "Fermeture" pour venir le "coller" dans "planning".

    relancez la macro, vous devriez cette fois ci avoir un message d'erreur apres un "lag".
    voila, vous savez ou est le soucis.

    pour les point de stop et les section du programme qui vous importe le plus :
    ligne 1479 : chargement des tableau de valeur pour calculer (via une gestion de pile visible dans le module 3) les croissants. a priori, ici, tout fonctionne. je vous deconseil un stop ici, ou vous allez vous payer de sacré boucle de programme !
    plus pertinant : 2391
    ca stoppera le programme en amon de l'appel de procédure graphique, en utilisant les dits tableau chargé précédement. ca le stoppera surtout JUSTE au PREMIER jour "croissant". vous n'aurez pas a faire du F8 pour laisser tout les calculs précédent (et y'en a !) etre fini !

    enfin, la fonction elle meme se situe :
    4639.
    vous pouvez y mettre un stop pour voir QUE la fonction graphique, mais vous risquez peut etre d'avoir des "stop" avant un appel de copie d'image (des création de forme géométrique, par exemple)
    c'est ici que se trouve le "on error resume next" que je vous conseil d'activer, juste pour voir.

    donc le plus pertinant est alors de mettre le stop dans la partie dédié au copie d'image :
    4654.

    votre propre fonction (que j'ai a peine retouché) se trouve en 4884.

    un stop sur une des lignes sus cité, suivit d'un appuit continue sur F8 déroule le programme SANS BUG. un F5, ou un lancement classique, sans stop, est sanctionné par une erreure 1004.


    voila, je sais plus trop quoi faire, et c'est quand meme dommage que cela ne fonctionne pas.
    surtout que j'aimerais utiliser cette fonction dans une macro bien plus grosse / puissante / importante que celle ci, et que si ici ca ne fonctionne pas ... y'a de grande chance que je ne parvienne pas a le faire marcher dans cet autre macro. et la, c'est plus génant.


    merci beaucoup en tout cas de t'interresser à mon cas.

    si tu as besoin de la moindre info sur le fonctionnement ... pas de soucis, je resterais à l'ecoute. mais je reste persuadé qu'il n'est pas necessaire de "debuggé" la macro dans son ensemble. la solution doit etre "locale".
    les select, que tu utilise toi meme toujours (With Selection), semblent etre la clé du problème. en tout cas, c'est sur ce type de ligne que le programme fige, et le fait, quand on fait un "on error resume next", qu'il finisse par selectionner un autre shape, pour le modifier (coef scaleheight) puis n'aille pas plus loin est très parlant :
    cela signifie qu'a un moment il perd les pédale, et selectionne non le shape qu'il vient de copier, mais un deja présent, puis il plante.
    et c'est un truc avec VBA, un peu comme les range, avec lequel je me fache souvent. je n'arrive pas, avec des "shape", a m'en passer totalement. c'est tout mon problème : meme identifié, je ne sais pas modifier des lignes de codes pour me débarrasser totalement de tout select.



    Pièce jointe 142682


    cordialement.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Par défaut
    désolé, j'ai oublié de supprimer dans les référence les controles suivant, inutile et pouvant causer des bugs sur des PC autre que le miens :

    Ref Edit Control
    Microsoft Commun dialog control 6.

    et SURTOUT

    caladapter 1.1 type library.

    désolé de ne pas avoir livré directement un fichier "propre"

    promis, je vais m'auto flageler.

    j'ai aussi noté que sur certains PC, tout se passe comme sur le miens avec un "on error resume next" : pas de bug franc, et parfois meme l'opération va jusqu'au bout.
    mais l'objet selectionné et modifié par la partie de la macroi en charge du déplacement et de la mise a l'echelle agis sur d'autres shape que celle qui vient juste d'etre collé. donc on a des "croissant" de grande taille, et des cercles ou autre forme completement déformé ailleurs sur le planning.
    bref, on sent "bien" le soucis "select".


    cordialement.

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

Discussions similaires

  1. Copie de plage sans .Select
    Par linkcr15 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/05/2012, 14h46
  2. [WD12] Bug sur table sans selection
    Par devste dans le forum WinDev
    Réponses: 2
    Dernier message: 05/09/2008, 09h51
  3. [Conception] Boucle select en autocompletion sans "SELECT"
    Par lodan dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 01/10/2006, 20h04
  4. [VBA] Copy d'une selection dans Word
    Par marsupoilu dans le forum VBA Word
    Réponses: 1
    Dernier message: 04/07/2006, 09h27
  5. Réponses: 3
    Dernier message: 13/06/2006, 08h29

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