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 :

Séquence avec plantage aléatoire (ou pas) [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut Séquence avec plantage aléatoire (ou pas)
    Bonjour
    j'ai la séquence suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                 For Each shap In catalogue.Shapes
                    If shap.TopLeftCell.Address = "$D$" & i1 Then
                        catalogue.Shapes(shap.Name).Height = haut ' dimensionne la photo
                        catalogue.Shapes(shap.Name).Copy
                        pdfS.Range("B" & Delta1 + 2).Select
                        pdfS.Paste
                        Exit For
                    Else
                    End If
                Next
    Si je lance plusieurs fois de suite la macro qui contient cette séquence, j'ai un résultat aléatoire :

    Soit ça marche bien, soit ça plante à des endroit différents avec le message
    Erreur d'exécution 1004
    La méthode "Paste" de l'objet _Worksheet a échoué
    J'ai fait de multiples tests sans explications (à mon niveau)

    en fait je voulais redimensionner la photo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     catalogue.Shapes(shap.Name).Height = haut
    après la copie, mais je n'y parviens pas. Je ne pense pas que le plantage vienne de là de toutes façons

    Avez-vous une idée de ce qui peux donner ce plantage aléatoire (et aussi le bon fonctionnement aléatoire !) dans cette séquence

    Nouveaux tests :
    1er clic : plantage ligne 53
    2eme clic : plantage line 149
    3eme clic : ok

    Il y a 168 lignes à traiter

    Une autre façon de faire peut être ?
    merci
    Il ne savait pas que c'était impossible, donc il l' a fait...

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 183
    Points : 5 515
    Points
    5 515
    Par défaut
    Bonjour,

    Essayer ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                For Each shap In catalogue.Shapes
                    If shap.TopLeftCell.Address = "$D$" & i1 Then
                        shap.Height = haut ' dimensionne la photo
                        shap.Copy
                        pdfS.Select
                        pdfS.Range("B" & Delta1 + 2).Select
                        pdfS.Paste
                        Exit For
                    End If
                Next
    Cordialement.

  3. #3
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    Bonjour

    j'ai le même résultat ou ça marche ou pb de plantage aléatoire, cette fois sur
    avec le code proposé
    Il ne savait pas que c'était impossible, donc il l' a fait...

  4. #4
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 183
    Points : 5 515
    Points
    5 515
    Par défaut
    Bonjour,

    Eventuellement ceci:
    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 LaSub()
        '...
                For Each shap In catalogue.Shapes
                    If shap.TopLeftCell.Address = "$D$" & i1 Then
                         On Error GoTo Panne
    Copier:
                        shap.Copy
                        On Error GoTo 0
                        Application.Goto pdfS.Range("B" & Delta1 + 2)
                        ActiveSheet.Paste
                        ActiveSheet.Shapes(ActiveSheet.Shapes.Count).Height = haut '--- modifie hauteur de ce qui vient d'être copié
                        Exit For
                    End If
                Next
        '...
        Exit Sub
    Panne:
        If MsgBox("Réessayer?", vbYesNo, "Oui/Non?") = vbYes Then
            Resume Copier
        End If
    End Sub
    Cordialement.

  5. #5
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    Je viens d'essayer

    à un moment donné j'ai bien le message réessayer

    je réponds oui puis même plantage

    Je ne saisi pas le côté aléatoire du pb
    Il ne savait pas que c'était impossible, donc il l' a fait...

  6. #6
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 183
    Points : 5 515
    Points
    5 515
    Par défaut
    Oui, bizarre. Essayer récupérer le n° de l'erreur pour en savoir plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        If MsgBox("Erreur " & Err.Number & vbLf & _
                   Err.Description & vbLf & _
                   "Réessayer?", vbYesNo, "Oui/Non?") = vbYes Then
    Cordialement.

  7. #7
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    En faisant cela

    j'ai d'abord erreur 0
    Voulez-vous ressayer ?

    Yes

    Erreur d'exécution 20
    Il ne savait pas que c'était impossible, donc il l' a fait...

  8. #8
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 183
    Points : 5 515
    Points
    5 515
    Par défaut
    Essayer d'ajouter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.CutCopyMode = False
    Exit For
    juste avant le Exit For

    Cordialement.

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 763
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je ne suis pas un grand spécialiste des images mais j'ai dû déjà en manipuler de temps en temps
    A mon avis, vos erreurs n'étaient pas aléatoires mais tout simplement que lorsque la feuille source ou une autre était active, il y avait erreur mais pas lorsque la feuille cible l'était.
    Ce qu'Eric a tenté de détourner par un Goto

    Les Select ne sont pas une bonne idée.

    Le problème est toujours pareil pour les copies, que ce soit des feuilles, des cellules, des images, nous avons une source et une cible
    Si j'ai bien compris, vous souhaitez copier une image si elle touche la cellule D2 de la feuille catalogue et vous voulez la copier sur la feuille PdfS au dessus d'une cellule dont l'adresse m'est inconnue puisque il manque des bouts de code

    Règle numéro 1 en programmation : Découper le problème pour chaque étape à réaliser et créer des fonctions qui font le job (ici la copie de l'image d'une source vers une cellule cible)
    La lecture de votre programme mais surtout la maintenance n'en sera que simplifiée

    J'ai écrit en vitesse, une fonction qui fait cela mais incomplète et les tests effectués très basiques

    La fonction incomplète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function CopyShape(oShape As Shape, oRange As Range)
      oShape.Copy                   ' Copie d'image
      With oRange.Worksheet
      .Paste                        ' Colle l'image sur la feuille de la cellule cible
       With .Shapes(.Shapes.Count)  ' Positionne l'image sur la feuille par rapport à la cellule cible
       .Left = oRange.Left '
       .Top = oRange.Top
       ' etc.
       End With
      End With
    End Function
    et votre procédure allégée qui copie l'image se trouvant en D2 de la feuille catalogue et la colle en G4 de la feuille pdfS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub t()
      Dim shap As Shape
      Dim i1 as long
      i1 = 2
      For Each shap In Catalogue.Shapes
        If shap.TopLeftCell.Address = "$D$" & i1 Then
         CopyShape shap, pdfS.Range("G4")
        End If
      Next
    End Sub
    Et si vous avez plusieurs images à copier, créer également une fonction générique qui renverra True ou False si la condition est remplie et prévoyez éventuellement une table de conversion (Mapping) qui indique le nom des cellules où se trouve les images et l'endroit où elles devront être copiées.
    Pensez toujours maintenance.

    Une fonction bien testée, ne bouge plus et on ne la retravaille que dans le seul but d'être améliorée.
    Les tables de mapping permettent de changer les paramètres nécessaire à la bonne marche des programmes sans plus avoir à toucher au code VBA
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  10. #10
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    Bonjour,

    n'arrivant pas à résoudre le problème j'ai fait de multiples essais et un de mes essais a été fructueux.

    Au lieu de tout faire dans la même boucle, j'ai fait une 1ere boucle pour redimensionner les images et une seconde identique pour les copier

    Et là curieusement je n'ai plus le problème (j'ai fait de nombreux tests avec cette solution, tout est ok)

    J'ai repris la première version de mon code pour en avoir le cœur net, et le pb est revenu

    Je n'ai aucune idée du pourquoi des choses mais ça marche

    Merci de votre participation
    Il ne savait pas que c'était impossible, donc il l' a fait...

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

Discussions similaires

  1. Plantage aléatoire sur Requete avec REGEX
    Par weboniric dans le forum Requêtes
    Réponses: 7
    Dernier message: 06/11/2018, 11h25
  2. Réponses: 0
    Dernier message: 22/04/2016, 14h51
  3. [PC fixe] Plantage aléatoire avec son métallique/électronique désagréagle
    Par baxou087 dans le forum Ordinateurs
    Réponses: 4
    Dernier message: 18/03/2014, 21h55
  4. Plantage aléatoire avec JNI
    Par legentil dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 29/10/2011, 21h06
  5. Plantage aléatoire avec intellde
    Par arnaud_verlaine dans le forum Windows XP
    Réponses: 4
    Dernier message: 30/06/2007, 13h37

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