Fonction vba qui plante

Calvus

XLDnaute Barbatruc
Bonsoir,

Je suis absolument incapable en vba, et j'essaie d'apprendre en ce moment.

Voici,

J'ai une macro réalisée il y a quelques années, je ne sais plus par quel miracle, que j'ai voulu copier dans un nouveau projet.
Or elle plante, sans que je comprenne pourquoi.
J'ai fait un copier coller afin de ne pas commettre d'erreurs.
A savoir que ça fonctionne dans mon fichier original, et pas dans l'exemple...

L'erreur pointe apparemment sur une fonction nommée Afficher_Colonnes_Feuilles

Merci de m'apporter un éclairage.
 

Pièces jointes

  • Test Vba.xlsm
    13.6 KB · Affichages: 71
  • Test Vba.xlsm
    13.6 KB · Affichages: 77
  • Test Vba.xlsm
    13.6 KB · Affichages: 76
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Fonction vba qui plante

Bonsoir.
Elles sont dans ThisWorkbook et Private par dessus le marché. Aucune chance que ça marche.
Les modules de la rubrique Microsoft Excel Objets doivent être réservés aux procédures évènements propres aux objet qui s'y rapportent.
Par ailleurs il n'y a pas de Worksheets("images") dans le classeur.
Cordialement.
 

Calvus

XLDnaute Barbatruc
Re : Fonction vba qui plante

Bonsoir,

Merci beaucoup de ta réponse.
En effet, je viens de remarquer que j'avais oublier de renommer une des feuilles en ("images")

Comment dois-je faire pour le reste ?
Les mettre dans un module ? J'ai essayé sans succès,mais il est fort possible que je fasse une mauvaise manip.

Ce que j'ai fait pour ce fichier,c'est copier les macros telles qu'elles étaient dans le fichier original, notamment les Privatesub dans ThisWorkbook. Bizarrement, ce fichier fonctionne correctement.

Que dois je faire donc pour corriger ?

Merci
 

Gelinotte

XLDnaute Accro
Re : Fonction vba qui plante

Bonsoir,

Mytå avait commencé à te répondre et comme il est bien meilleur que moi, je suis passé sous d'autres cieux.

M'enfin.

Ton code est bizarre, je n'y suis pas habitué. Comme tu mentionnais, il date de quelques années.

Les problèmes :
Les macros étaient situées dans ThisWorkBook. Je l'ai déplacé dans la feui1 comme la macro principale "Image1"
Les macros dans ThisworkBook contenaient 2 _ dans leurs noms. Mais leur appel dans "Image1" n'en comprend qu'un.

J'ai corrigé quelques bugs, tel : il y avait sélection de feuille puis traitement de par macro, et ensuite le Paste de l'image; ça posait problème. J'ai déplacé la ligne de Paste juste sous celle de Select la feuille.
Aussi à la fin, l'image copiée dans la feuil1 est effacée. Mais la feuil1 était verrouillée; donc impossible d'effacer l'image.

Examine cela.

Est-ce que tu lis l'anglais ? L'image que j'ai utilisée est une blague que j'ai trouvée bien bonne la première fois que je l'ai lu :rolleyes:


G
 

Pièces jointes

  • Test Vba(1).xlsm
    228 KB · Affichages: 82
  • Test Vba(1).xlsm
    228 KB · Affichages: 81
  • Test Vba(1).xlsm
    228 KB · Affichages: 71

Calvus

XLDnaute Barbatruc
Re : Fonction vba qui plante

Merci beaucoup Gelinotte,

Ca fonctionne parfaitement. Je vais donc prendre le temps pour essayer de comprendre comment ça fonctionne, et ce qui clochait dans mon fichier.
Merci pour tes explications.

Cordialement.

PS: Excellente ta blague ! ;)
 

Calvus

XLDnaute Barbatruc
Re : Fonction vba qui plante

Bonjour,

J'ai simplifié le code et modifié ce qui n'allait pas. La macro fonctionne donc maintenant.
Cependant, j'ai une nouvelle erreur à la répétition de la macro. Il semblerait, après recherches, que ce soit du au passage d'excel 2003 à 2007, cette macro fonctionnant auparavant sur 2003.

L'erreur est : " erreur d'exécution 21470248009 80070057 " élément introuvable.

En effet, après application de la 1ère macro, excel modifie le nom de l'image et ne la retrouve donc pas pour exécuter à nouveau.

J'ai ajouté un bouton en feuil1 pour l'exécution de la macro.

Il se passe le même problème avec le fichier modifié par Gelinotte.

Merci de votre aide.
 

Pièces jointes

  • Test Vba.xlsm
    773.6 KB · Affichages: 271
  • Test Vba.xlsm
    773.6 KB · Affichages: 278
  • Test Vba.xlsm
    773.6 KB · Affichages: 279

Gelinotte

XLDnaute Accro
Re : Fonction vba qui plante

Bonjour,

Quand on colle la première fois l'image dans la feuil1, elle se nomme "Image 1". Mais si on lance une 2e fois la macro, la nouvelle image se nomme "Imange 2", et change le nom à chaque lancement à moins de fermer le fichier et de le rouvrir.

Il faudrait faire une boucle afin d'incrémenter le nom de l'image pour trouver le bon nom et l'effacer. Ce matin, c'est le boulot. Je n'ai pas le temps. Peut-être ce soir, si un meilleur que moi ne t'a pas aider sur ce point entretemps.

A+

G
 

Dranreb

XLDnaute Barbatruc
Re : Fonction vba qui plante

Bonjour.
C'est peut être parce que la façon normale et moderne de travailler dans des contextes de ce genre consiste à passer par un contrôle Image de la boite à outils contrôles et non plus par des Shapes images.
Pour y affecter une image à partir d'un fichier c'est une instruction qui utilise une expression = LoadPicture(CheminEtFicher)
À +
 

Modeste

XLDnaute Barbatruc
Re : Fonction vba qui plante

Bonjour Calvus :), Gelinotte :)

Pas certain de comprendre le contexte général, mais juste après le
Code:
ActiveSheet.Paste

... pourquoi ne pas ajouter
Code:
Selection.Name = "Image 1"

Edit: Oooops, salut Bernard :) sorry pour le télescopage!
 

Calvus

XLDnaute Barbatruc
Re : Fonction vba qui plante

Bonjour Modeste, bonjour Dranreb,

Merci pour vos réponses. La tienne Modeste, est enfin claire comme de l'eau de roche.
Pour comprendre celle de Dranreb, c'est déjà plus compliqué....même si je perçois bien le concept, je ne suis pas encore habitué au vocabulaire ni aux notions de programmation.

Comme je le disais en début de post, je n'y connais absolument rien en vba, et j'essaie d'apprendre. J'ai déjà lu pas mal de choses, mais il y a beaucoup de notions que je ne maîtrise pas, n'étant pas programmeur ou informaticien.

Alors Shape ou boite à images de la boite à outils de contrôle, j'y perds carrément mon latin.

J'étais parti au début sur un fichier de mon cru pour tenter de comprendre comment fonctionnaient les différentes instructions, ainsi que les imbrications. Après quelques heures de galère, je suis parvenu à un résultat pour moi satisfaisant, mais j'ai buté sur cette histoire d'image. Je me suis donc tourné vers vous.

Cette macro, je l'ai copiée d'un autre fichier effectué il y 4 ans, avec plusieurs macros, comme impression couleur et noire et blanc cherchant l'imprimante par défaut, etc, qui fonctionnent. Je me dis que ça tient du miracle car ça fonctionne parfaitement, alors que je comprenais encore moins le vba à l'époque. J'avais trouvé plusieurs bouts de code et utilisé allègrement l'enregistreur, tout ça sous 2003.

Je vous joins donc le fichier avec la modification apportée par Modeste, ainsi que la version de mon fichier de travail initial, ou en attendant vos réponses j'avais réussi à obtenir un résultat en remplaçant la fonction Shape (parle t'on bien de fonction d'ailleurs ?) par DrawingObjects.

Je vous laisse ces deux fichiers afin de voir le code, et peut être pourrez vous m'aider à simplifier le code sur le fichier nommé Fichier Test VBA et me dire ce que vous en pensez, peut être y a t-il des erreurs grossières.

Par ailleurs, j'ai du mal à trouver les renseignements sur les endroits où il faut écrire le code, pourquoi à un moment dans un module, une autre fois dans une feuille, etc.
Si tout cela vous paraît simple, c'est un peu ardu pour un néophyte.

Merci encore pour votre aide et à très bientôt.
 

Pièces jointes

  • Test Vba 3.xlsm
    773.8 KB · Affichages: 210
  • Fichier Test VBA.xlsm
    153.6 KB · Affichages: 57

Modeste

XLDnaute Barbatruc
Re : Fonction vba qui plante

Bonsoir Calvus,

Je ne vais certainement pas prendre le risque de répondre à toutes tes questions: le sujet serait trop vaste et mon niveau de connaissance trop partiel. Une indication cependant: lorsqu'on utilise l'enregistreur de macro, le code généré est une belle source d'inspiration ... la seule chose c'est qu'ensuite, un solide "nettoyage" s'impose: on conseille très souvent d'éviter les instructions 'Select' ... chaque fois que c'est possible. Ainsi, dans ton code, cette partie:
VB:
        Worksheets("images").Visible = True
        Worksheets("images").Select

    '4
        ActiveSheet.Unprotect "dd"

        ActiveSheet.Shapes("Image 1").Select
        Selection.Copy

        ActiveSheet.Protect "dd", True, True, True

        Worksheets("images").Visible = False
        Sheets("feuil1").Select

       '5
       ActiveSheet.Paste

Pourrait être remplacée par:
VB:
With Worksheets("images")
        .Visible = True
        .Unprotect "dd"
        .Shapes("Image 1").Copy
        .Protect "dd", True, True, True
End With
Sheets("feuil1").Paste

Pour le reste, l'aide en ligne, ce sacré forum sont des sources inépuisables de réponses à toutes tes questions ;)

Bon amusement,
 

Statistiques des forums

Discussions
312 913
Messages
2 093 534
Membres
105 751
dernier inscrit
fred13340