Problème d'exécution de macro sous excel

Nec -  
necro27 Messages postés 125 Date d'inscription   Statut Membre Dernière intervention   -
Bonjourà tous,

Je suis stagiaire et j'ai pour mission de développer des macros excel. Mon problème est le suivant :

Suite à l'ouverture d'un fichier excel, une macro que j'ai moi-même réalisé s'exécute directement.
Il m'a été demandé de trouver une façon d'exécuter cette macro pour chaque fichier excel que l'on pourrait ouvrir.

En d'autres termes, j'ouvre un premier fichier où est contenu la macro dans le sub workbook_open. A partir de ce fichier qui est en faite le fichier général, je voudrais pouvoir ouvrir un autre fichier excel qui activerai directement la macro sans avoir à copier à chaque fois le code vb dans le sub workbook_open à chaque nouvelle page.

En clair, j'ouvre un fichier nommé 'fichier1', on me demande si je veux activer la macro, j'accepte et je voudrai à ce moment pouvoir ouvrir via 'fichier1' un deuxième fichier nommé 'fichier2' qui lancerai directement l'exécution de la macro.

Ce projet contient un nombre indéterminé de fichiers qui seront ouvert par plusieurs utilisateurs, qui ne maitrisent pas forcément la programmation. Il faudrait ainsi leur épargner si possible le 'copier-coller' du code pour chacun de leurs fichier dans le sub workbook_open.

Merci d'avance de m'accorder votre attention et de vous pencher sur le problème.
Configuration: Windows 2003 Internet Explorer 6.0

24 réponses

  • 1
  • 2
  1. NicoDisso Messages postés 231 Statut Membre 32
     
    pour moi, il faudrait la mettre en macro complémentaire et essayez de tester l'ouverture d'un classeur.
    Du coup, ta macro serait à un seul endroit et chargé dans excel sur chacun des postes...
    0
    1. Neccro27
       
      Bonjour NicoDisso et merci d'avoir répondu,

      J'ai essayé et mis en macro complémentaire la feuille ("test.xla"), mais j'ai l'impression de ne pas avoir compris exactement à quoi sert une macro complémentaire.

      Je me suis aidé du site https://support.microsoft.com/fr-fr/help/467061 pour la création de macro complémentaire.

      Lorsque j'exécute le fichier qui contient cette macro ("test.xla") il demande en effet si l'on veut ou non activer la macro. Je clique sur 'activer les macros' mais il me donne une erreur qui provient de mon code mais je ne vois pas comment faire autrement.

      Sheets("Feuil1").Select
      Range("A1").Select
      While ActiveCell.Range("C2") <> Empty
      'code
      Wend

      L'erreur est en effet le fait qu'à l'ouverture du fichier il n'y a pas de feuille ouverte donc le 'curseur' ne peut pas se positionner sur la cellule A1 de la feuille 1. Le but de mon projet est de faire un tri sur un tableau en feuille 1 et extraire les données recherchées pour les afficher en feuille 2 et 3. La macro fonctionne mais le but est d'effectuer directement la recherche sur ouverture d'un quelconque autre classeur.

      Je pensais ainsi ouvrir la feuille ("test.xla") puis de ce fichier ouvrir les autres afin d'activer la macro..en vain cela m'ouvre un autre classeur pluto que de le lancer sur celui-ci, cela aurait été trop simple.

      Je suis désolé si je me répète mais j'ai l'impression de ne pas être clair donc j'explique un maximum. Si vous avez besoin d'informations supplémentaires, n'hésitez pas merci beaucoup.
      0
  2. Neccro27
     
    Je suis désolé j'ai eu un souci avec le premier message d'hier et en le refaisant j'ai changé de pseudo...première utilisation d'un forum je ne me ferai plus avoir:) mé nec et neccro27 c bien moi

    désolé
    0
  3. NicoDisso Messages postés 231 Statut Membre 32
     
    soit fait un test sur le nombre de feuilles,

    soit mets un message au debut de ta macro du style ( je pense que c'est le mieux )
    if msgbox("Voulez vous lancer la macro...",vbquestion+vbyesno,"Question") = vbyes then

    et la tu mets ton code

    end if
    0
  4. Neccro27
     
    Merci mais j'ai toujours le même problème. La macro ne s'exécute pas puisqu'il n'y a pas de feuille à l'ouverture.
    Le message box fonctionne bien en effet mais renvoi sur une erreur une fois avoir coché 'oui'.

    Je lance mon fichier.
    Il me demande si je veux activer les macros. J'active.
    Ensuite le msgbox aparaît ("voulez vous lancer la macro?") Je répond 'oui'.
    Message d'erreur renvoyé :
    "Erreur d'exécution '1004':
    La méthode 'range' de l'objet '_Global' a échoué."

    Ou alors existe t'il un code afin d'ouvrir un fichier directement après le msgbox? Ce qui me permettrai d'ouvrir le navigateur, aller chercher puis ouvrir un fichier pour ensuite activer la macro? j'ai déjà cherché à ce sujet mais sans résultat.

    Je précise que je suis limité dans excel, je ne suis pas un pro ('malheureusement') ainsi j'ai un peu (beaucoup) de mal...merci
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. NicoDisso Messages postés 231 Statut Membre 32
     
    si je reprends ton post du debut tu as deux classeurs, donc dans ta macro complémentaire, tu li dis de rien faire tant qu'il n'y a pas 2 classeurs
    if workbooks.count <= 2 then exit sub
    et sinon elle s'execute sur le classeur actif
    0
  7. Neccro27
     
    En effet à présent il n'y a plus d'erreur. Je peux donc aller ouvrir un fichier excel par ce classeur. Mais, je ne voit toujours pas comment activer cette maudite macro sur le nouveau classeur sans avoir à copier le code à nouveau dans le workbook_open... :-( je vais finir par croire que je ne suis vraiment pas doué.

    J'ouvre le fichier 'test.xla' (qui contient la macro complémentaire), jactive la macro, je répond au msgbox et ensuite je fais ouvrir fichier 'exemple.xls' (qui contient le tableau à trier). C'est bien sa? Cela devrait fonctionner?

    merci
    0
  8. NicoDisso Messages postés 231 Statut Membre 32
     
    il faudrait arriver à mettre un test qui se déclenche sur

    Workbook_WindowDeactivate avec un compteur qui compte les fenetres ouvertes et le stocke dans ton fichier 1

    comme ca lorsque qu'une nouvelle fenetre apparait en testant ton compteur
    elle désactive ton premier fichier et ladu coup ca marche ...
    0
  9. Neccro27
     
    Donc je remplace le sub Workbook_Open par sub Workbook_WindowDeactivate c'est bien sa? et pour le compteur par exemple je met un nbfenetre que jincrémente à quel niveau? Je suis largué désolé...

    ou alors je crée un deuxième sub mé est-ce possible dans le workbook?

    et comment tu fait pour compter le nombre de fenêtre ouverte? Je vois comment faire la condition mais c'est le vocabulaire vb qui vient à manquer -_-' sheet.count?
    0
  10. NicoDisso Messages postés 231 Statut Membre 32
     
    le sub c'est un procedure, tu en mets autant que tu veux
    tu as aussi les function qui sont des fonctions ( eh ouais ) qui elles te renvoient un resulat

    pour moi, tu peux te creer une variable compteur qui s'initialise lorsque tu ouvres ton fichier n°1 ( celaui dans lequel tu vas appelé tes autres fichiers )

    Quand je relis ton post du tout debut je me demande quand meme s'il n'y as pas plus simple.
    Du style un bouton qui executerai ta macro complémentaire manuellement quand l'utilisateur clique sur le bouton et qui s'effectuerai sur le fichier actif à l'écran...
    0
  11. Neccro27
     
    En faite de base j'avais attaché la macro à un bouton (trouvant également cela beaucoup plus simple), mais le problème est toujours le même puisque le bouton n'aparaîtra pas sur les nouveaux fichiers. Ou du moins l'affectation de la macro au bouton. A chaque fois le problème est que l'on doit réinscrire le code dans le visual basic, que ce soit dans le workbook ou dans un module.

    De plus mon maitre de stage m'a demandé s'il été possible de supprimer le bouton afin de passer directement sur l'ouverture d'un nouveau fichier.. Il m'a de plus montrer un fichier excel qui dès son lancement, demande d'activer les macros, et en réponse favorable à cette question offre la possibilité d'ouvrir un nouveau fichier qui prendrai en compte la macro en saisissant le racourci ctrl+i qui lance la macro sur la feuille active....seul problème, c'est que ce n'est pas mon maitre de stage qui a effectué la macro mais une personne extérieure...qui a mis des mots de passe.....forcément sa limite la chose. Et je ne trouve aucune trace de ce genre de problème sur internet. A croire que je sois le premier à poser la question..

    et ofète merci pour la partie cour ^^ c utile de le savoir. je conaissais les fonctions, mais ce qui me poser problème c'était en faite de savoir si dans le workbook il pouvait y avoir plusieur sub. c'est bon je le sait maintenant.

    Voila mon code peut être comprendras-tu mieux.

    Private Sub Workbook_open()

    Dim nbcode, numligne, numligne2, As Integer

    If MsgBox("Voulez-vous lancez la macro?", vbQuestion + vbYesNo, "Question") = vbYes Then

    numligne = 2 'Représente le numéro de ligne de la feuille 1.
    numligne2 = 3 'Représente le numéro de ligne de la feuille 2.
    numligne3 = 3 'Représente le numéro de la ligne de la feuille 3.

    Sheets("Feuil1").Select
    Range("F2").Select
    If Workbooks.Count <= 2 Then Exit Sub
    While ActiveCell.Range("C2") <> Empty

    If Mid(Cells(numligne, 1), 1, 1) = "S" Or Mid(Cells(numligne, 1), 1, 1) = "G" Then
    If Mid(Cells(numligne, 35), 1, 1) <> "C" And Mid(Cells(numligne, 35), 1, 1) <> "D" Then
    If Cells(numligne, 2) <> 3440 Then
    If Feuil2.Cells(numligne2, 2) = "" Then

    Feuil2.Cells(numligne2, 1) = nbarticle
    [...]
    Feuil2.Cells(numligne2, 36) = Feuil1.Cells(ActiveCell.Row, 35)

    numligne = numligne + 1

    End If
    End If

    If Mid(Cells(numligne, 2), 1, 2) = 46 Then
    If Sheets("feuil3").Cells(numligne3, 2) = "" Then

    Sheets("feuil3").Cells(numligne3, 1) = nbarticle2
    [...]
    Sheets("feuil3").Cells(numligne3, 36) = Feuil1.Cells(ActiveCell.Row, 35)

    numligne2 = numligne2 + 1

    End If
    End If
    End If
    End If
    nbcode = nbcode + 1
    ActiveCell.Offset(1, 0).Activate

    Wend
    End If
    End Sub

    Voila mon désastre.. mais n'existerai t'il pas juste un code comme par exemple un inputbox qui renverai l'utilisateur vers l'explorateur afin d'ouvrir son fichier, ou du moins qui aurai la même fontion que le bouton 'ouvrir' à ta connaissance? en tout cas merci beaucoup du temp que tu consacres à mon souci.
    0
  12. Neccro27
     
    Enfaite j'ai donné une partie de la réponse dans ma dernière argumentation..il sufit de mettre un racourci ctrl + touche au choix.

    En effet j'ouvre un fichier 1 qui contient une macro (qui n'est pas complémentaire). La macro est placée dans un module auquel j'attribue un raccourci (ctrl+o). je sauvegarde le programme et le réouvre

    le fichier me demande si je veux activer la macro je répon oui. une page vierge est alors ouverte.
    j'ouvre un fichier 2 par l'intermédiaire du fichier 1. la feuille 1 contient les donnée a trier. je presse le raccourci et le tri se fait sur la page en cours qui est la feuille 1 du fichier 2. Donc génial sa marche!!

    Mais (je hai ce mot -_-), petit problème :

    les page 2 et 3 qui devrai contenir les information extraites sont vides, ou du moins seul les en-tete de colonne (A1,B1,...) sont visiblent. En effet le while vérifie bien tan ke la colonne n'est pa vide sur la feuille 1 du
    fichier 2..mais importe les données de la feuille 1 du fichier 1....qui est une page vierge et par conséquent copie les cellules vide.

    j vai me tuer ^^

    donc g plu ka trouver la solution pour nommé un fichier. comme lon peu faire pour
    feuille --> sheets("feuil1")
    cellule --> range("A1")
    fichier --> ?

    aurait tu une idée?

    en tout cas je cherche ^^

    merci
    0
  13. NicoDisso Messages postés 231 Statut Membre 32
     
    je repense à ton appli existante, peut etre que le gars en question a fait un userform avec une boite de dialogue ouvrir et que du coup c'est cette boite de dialoque qu'il utilise et la du coup c'est plus facile car il intègre tout dans sa macro de base...

    pour le reste, tu peux te referer à une feuille dans un classeur en particulier du style
    workbook("Classeur02").sheets("Feuill1").cells(1,1).value= workbook("Classeur01").sheets("Feuill1").cells(1,1).value

    par contre pour faire cela il faut connaitre le nom des classeurs.
    Si tu en as que 2 c'est facile ( en sachant que tu connais forecement le premier ), apres c'est plus dur...

    dis moi si ca te cause ou pas
    0
  14. Neccro27
     
    oui sa me cause plus que bien t génial je vai essayer de ce pas et te tenir au courant

    merci :)
    0
  15. Neccro27
     
    if Workbooks("classeur1.xls").Sheets("Feuil1").Mid(Cells(nbcode, 35), 1, 1) <> "C"

    cette ligne ne veu pas fonctionner, il me met une erreur "propriété ou méthode non géré par cet objet"...je me doute que c'est a cause du mid mais je pense que je doi préciser le classeur sur cette ligne

    sinon g inséré

    Workbooks("classeur1.xls").Sheets("Feuil1").Range("F2").Select

    jute avt la boucle while ainsi que

    Workbooks("classeur1.xls").Sheets("Feuil2").Cells(numligne, 2) = Workbooks("test.xls").Sheets("Feuil1").Cells(ActiveCell.Row, 1) en ce qui concerne l'exportation des données...en vain cela ne fonctionne pas.

    j'ai toujours mes pages blanches en pages 2 et 3 du classeur 2.

    Et le petit souci c'est que je doi kiter mn poste..mais je me conecterai sur le forum kan mem de chez moi pour suivre..

    en tout cas je te remerci beaucoup, encor une foi, g enfin l'impression d'avoir avancé dans le projet..depui ier matin je sui desu je comence a désespérer lol mé c en bonne voi il me reste plu ka gérer ces fameux affichages.mais je reste néamoin à l'écoute si tu a une idée

    encore merci
    0
  16. NicoDisso Messages postés 231 Statut Membre 32
     
    pour If Workbooks("classeur1.xls").Sheets("Feuil1").Mid(Cells(nbcode, 35), 1, 1) <> "C"
    il vaut mieux mettre en variable
    variable_01 = Workbooks("classeur1.xls").Sheets("Feuil1").Cells(nbcode, 35).value

    et ensuite tu fais ton test...
    If Mid(variable_01, 1, 1) <> "C"
    d'ailleurs autant faire left(variable_01,1) le resultat doit etre le meme ;-)

    Je ne sais pas si tu es autorisé à diffuser ton fichier, mais je pense que je le comprendrai mieux si je vyais tourner le code...
    0
  17. necro27 Messages postés 125 Date d'inscription   Statut Membre Dernière intervention   8
     
    bonjour NicoDisso,

    je ne retourne que mardi sur mon poste de travail ainsi n'ai-je aucun document sur moi, et en effet il me parai peu probable que la diffusion du fichier soit possible. mais je demanderai quand même. Sinon dakor pour ton code je l'essaierai dès mardi matin et te tiendrait au courant.

    merci :) et bon week-end
    0
  18. neccro27
     
    Bonjour, c'est bon cela fonctionne enfin !!

    En faite j'avais fais une erreur bête :(

    Au lieu de noter
    Workbooks("classeur1.xls").Sheets("feuil2").Cells(numligne, 3)
    = Workbooks("classeur1.xls").Sheets("Feuil1").Cells(ActiveCell.Row, 2)

    J'avais noté
    Workbooks("classeur1.xls").Sheets("feuil2").Cells(numligne, 3)
    = Workbooks("test.xls").Sheets("Feuil1").Cells(ActiveCell.Row, 2)

    Donc forcément cela ne recopier pas les bonnes cellules.....

    Par contre la mise en variable ne fonctionne pas, mais je pense que c'est dû à sa déclaration, puisque je ne vois pas en quoi je doit la déclarer. j'ai essayer integer, string.

    Enfin en tout cas merci beaucoup tu m'a été d'une grande aide.

    j'ai encore 2 petites choses à demander mais je vais poster un nouveaux message pour recentrer le sujet.. encor merci
    0
  19. NicoDisso Messages postés 231 Statut Membre 32
     
    a mon avis, il faudrait la déclarer en "public" dans ton classeur

    Public Variable as string

    Du coup elle devrait etre accessible en faisant

    Workbooks("classeur1.xls").Variable
    0
  20. necro27
     
    il ne reconai pas 'public'

    il m'affiche comme erreur :
    erreur de compilation.
    attribut incorrect dans une procédure sub ou fonction.

    voici mes lignes de code :

    Dim nbcode, numligne, numligne2, nbarticle, nbarticle2 As Integer
    Public variable1 As String
    0
  21. NicoDisso Messages postés 231 Statut Membre 32
     
    oui c'est parce que Public doit etre directementdans le code de module ou de feuille
    Une variable public ne peut pas etre dans une procedure ou une fonction.

    Moi je les mets en tete de module, ou si j'en ai beaucoup je fait meme un module "Declaration" dans lequel je mets mes variables publiques par ordre alphabétique
    0
  • 1
  • 2