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

Fermé
Nec - 28 mai 2009 à 15:54
necro27 Messages postés 160 Date d'inscription jeudi 28 mai 2009 Statut Membre Dernière intervention 11 février 2011 - 2 juin 2009 à 10:50
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.
A voir également:

24 réponses

NicoDisso Messages postés 230 Date d'inscription mardi 26 mai 2009 Statut Membre Dernière intervention 22 août 2009 32
28 mai 2009 à 18:30
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
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
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
NicoDisso Messages postés 230 Date d'inscription mardi 26 mai 2009 Statut Membre Dernière intervention 22 août 2009 32
29 mai 2009 à 10:30
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NicoDisso Messages postés 230 Date d'inscription mardi 26 mai 2009 Statut Membre Dernière intervention 22 août 2009 32
29 mai 2009 à 11:21
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
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
NicoDisso Messages postés 230 Date d'inscription mardi 26 mai 2009 Statut Membre Dernière intervention 22 août 2009 32
29 mai 2009 à 11:51
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
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
NicoDisso Messages postés 230 Date d'inscription mardi 26 mai 2009 Statut Membre Dernière intervention 22 août 2009 32
29 mai 2009 à 12:52
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
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
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
NicoDisso Messages postés 230 Date d'inscription mardi 26 mai 2009 Statut Membre Dernière intervention 22 août 2009 32
29 mai 2009 à 16:23
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
oui sa me cause plus que bien t génial je vai essayer de ce pas et te tenir au courant

merci :)
0
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
NicoDisso Messages postés 230 Date d'inscription mardi 26 mai 2009 Statut Membre Dernière intervention 22 août 2009 32
29 mai 2009 à 17:55
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
necro27 Messages postés 160 Date d'inscription jeudi 28 mai 2009 Statut Membre Dernière intervention 11 février 2011 8
30 mai 2009 à 16:03
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
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
NicoDisso Messages postés 230 Date d'inscription mardi 26 mai 2009 Statut Membre Dernière intervention 22 août 2009 32
2 juin 2009 à 09:39
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
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
NicoDisso Messages postés 230 Date d'inscription mardi 26 mai 2009 Statut Membre Dernière intervention 22 août 2009 32
2 juin 2009 à 09:52
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