Se connecter avec
S'enregistrer | Connectez-vous

[VB Excel 97] Macro evolutive

Dernière réponse : dans Programmation

Bonjour,
Voilà a cette période de l'année beaucoup de monde en stage les entreprise vous prennes vous pigeonne normale on est étudiant.
Bref je fais des études de Génie mécanique et productique je me retrouve en stage a faire plus du secrétariat ( aller relever des caractéristiques technique sur des machines les noté sur une feuille puis les recopier sur Excel) et de la programmation en Visual basic dans des macro Excel.

Voilà j'ai présenté le contexte :) 

Mon Problème

Je cherche a faire évolué ma macro automatiquement quand des personnes ajouterons des fichiers.

Ces fichiers sont ajouté par l'intermédiaire d'une macro et du code dans un Userform.

Je voudrais que mon userform rajoute du code dans un module c'est toujours le même il doit juste écrire la valeur de certaine variable.

En espérant être assez claire en gros comment dire a Userform d’écrire dans un module.

Plus de précision n’hésiter pas

A+ Edoir

P.S. rien a voir avec le sujet mais pour l’anecdote ma config ;) 

Un P II avec 64 Mo de Ram sous NT 4 Marque IBM Personal Computer 300 PL écran 15 pouces

Autres pages sur : excel macro evolutive

Lassé par la pub ? Créez un compte
Expert Programmation

A priori, modifier le code d'une macro est une mauvaise façon de procéder. Il faut que tu repenses ta macro et que tu prévois plutôt un paramétrage.

Ou alors que tu justifies un peu plus ton besoin.

je vais develloper un peu plus et inserer du code ;) 

voila le module

  1. Private Sub laserxyzt()
  2. Load UserForm1
  3. UserForm1.Tag = "xyzt"
  4. UserForm1.Show
  5. End Sub
  6. Private Sub ballbarxyzt()
  7. Load UserForm2
  8. UserForm2.Tag = "xyzt"
  9. UserForm2.Show
  10. End Sub
  11. Private Sub Laser050390()
  12. Load UserForm1
  13. UserForm1.Tag = "050390"
  14. UserForm1.Show
  15. End Sub
  16. Private Sub Ballbar050390()
  17. Load UserForm2
  18. UserForm2.Tag = "050390"
  19. UserForm2.Show
  20. End Sub
  21. Private Sub Laser050391()
  22. Load UserForm1
  23. UserForm1.Tag = "050391"
  24. UserForm1.Show
  25. End Sub
  26. Private Sub Ballbar050391()
  27. Load UserForm2
  28. UserForm2.Tag = "050391"
  29. UserForm2.Show
  30. End Sub


le userform2 sert pour l'utilisation en suite il n'influence en rien la suite

en gros sur ma feuille excel des boutons et quand on clique dessu sa renvoye vers l'une de c'est private sub

Moi se que je veux c'est que a chaque fois que mon userform5 est executer il modifie le module en copiant et remplacant xyzt par la valeur d'une variable ressource

  1. Private Sub laserxyzt()
  2. Load UserForm1
  3. UserForm1.Tag = "xyzt"
  4. UserForm1.Show
  5. End Sub
  6. Private Sub ballbarxyzt()
  7. Load UserForm2
  8. UserForm2.Tag = "xyzt"
  9. UserForm2.Show
  10. End Sub


Voila mon userform5

  1. Private Sub CommandButton1_Click()
  2. If ComboBox1.ListIndex = 0 Then
  3. FileCopy quelfichier, "I:\toto\Ballbar\" + ressource + "xy.pdf"
  4. Unload UserForm5
  5. Unload UserForm3
  6. End If
  7. If ComboBox1.ListIndex = 1 Then
  8. FileCopy quelfichier, "I:\toto\Ballbar\" + ressource + "xz.pdf"
  9. Unload UserForm5
  10. Unload UserForm3
  11. End If
  12. If ComboBox1.ListIndex = 2 Then
  13. FileCopy quelfichier, "I:\toto\Ballbar\" + ressource + "yz.pdf"
  14. Unload UserForm5
  15. Unload UserForm3
  16. End If
  17. Sheets("ajout").Select
  18. ActiveSheet.Buttons.Add(294.75, 166.5, 96.75, 48.75).Select
  19. Selection.OnAction = "ballbar" + ressource
  20. Selection.Characters.Text = "ballbar"
  21. Range("H16").Select
  22. MsgBox "Couper et coller le bouton"
  23. 'dire ecrit la valeur de ressource a la place de xyzt
  24.  
  25. End Sub
  26.  
  27. Private Sub CommandButton2_Click()
  28. Unload Me
  29. End Sub
  30.  
  31. Private Sub UserForm_Activate()
  32. ComboBox1.AddItem "Plan XY"
  33. ComboBox1.AddItem "Plan XZ"
  34. ComboBox1.AddItem "Plan YZ"
  35. End Sub


A+ Edoir

Je ne comprends pas trop comment tu arrives à un problème aussi complexe. Et je comprends pas trop non plus ton explication.

Tout ce que je peux dire c'est que modifié un module en direct est impossible. Peut etre qu'il est possible d'exporter le module en bas, modifier le module en mode texte puis le réimporter, mais j'en doute.

A mon avis tu dois pouvoir trouver une autre solution moins complexe.
Expert Programmation

Bingo ! Je savais bien que ce qu'il voulait c'était une procédure paramétrée. tag et formnum sont les paramètres de la fonction.

Et voilà :
  1. Private Sub UneSeuleSubPourTout(tag As String, formnum As Integer)
  2. Dim form As Variant
  3.  
  4. Select Case formnum
  5. Case 1: Set form = New UserForm1
  6. Case 2: Set form = New UserForm2
  7. Case Else
  8. MsgBox "C'est quoi ce bourdel, y'a pas d'autr form que 1 ou 2 !!!!"
  9. Exit Sub
  10. End Select
  11.  
  12. Load form
  13. form.tag = tag
  14. form.Show
  15. End Sub



Freeman, il est possible de créer, supprimer, ajouter du code à un module :o  Regarde ça :
MsgBox Workbooks("Classeur1").VBProject.VBComponents("module1").CodeModule.Lines(1, 1000000)
Bon, je ne vais pas expliquer à Edoir comment faire, il va nous faire des bêtises. Mais toi, comme tu en dis ... :D  :D 

en gros mon fichier Excel est un catalogue avec les caractéristique des machine
chaque machine a une colonne et chaque machine a un N° de ressource
Pour chaque machine il y a des fichiers PDF avec des relever laser un par axe de la machine ( x y z a b c ) plus un relever ballbar un par plan ( xy xz yz)
Donc dans ma colonne on arrive sur un bouton laser et un ballbar qui lance la macro laser ou ballbar +N° de ressource
un menu s'ouvre on choisit l'axe on fait OK adobe acrobat reader se lance et mon fichier et charger a l’écran.
Idem pour les ballbar

tous ces fichiers sont stockés dans I: /toto/laser ou ballbar/N°ressource plan ou axe .pdf

Mon problème est que des technicien de maintenance doivent ajouté des fichier quand il mette a jours ces relevés.
Donc j'ai crée une macro il choisit son fichier a un endroit quelconque, indique se que c'est ballbar ou laser plus donne le numéro de la ressource.
Deuxième fenêtre sélection du plan ou de l'axe.
Copie + renommage du fichier initial dans l'endroit de stockage.
Création d'un bouton (laser ou ballbar) qui pointe directement vers la macro de lancement
Il lui reste plus qu'a déplacer le bouton au bon endroit.

Mon problème est donc ajouter la code de la macro de lancement dans le module1

A+ edoir
Expert Programmation

NON, IL NE FAUT PAS MODIFIER LE CODE DE TON MODULE, IL FAUT LE PARAMETRER.

Mais si tu veux t'entêter, libre à toi.
EDIT:Bon, on poste en même temps, du coup, ça ne veut rien dire :sarcastic: 
Expert Programmation

Ben ça remplace les deux. Le formnum, c'est le numéro de form, soit 1, soit 2. Si tu préfère mettre laser/babar c'est comme tu veux. A la rigueur, tu peux créer deux subs. L'une pour laser, l'autre pour babar.

FYI: L'utilisation de tag pour passer des paramètres est la pire des horreurs en programmation Windows

Donc pour utiliser la procédure proposée, il faut aller voir dans ta feuille excel quels sont les x, y, etc, et les lui passer en paramètres. C'est tout.

Si tu ne comprends pas le code proposé, prends quelques instants pour l'étudier. Il n'est pas si compliqué. Pose des questions précises si tu as besoin d'aide.

Citation :
Freeman, il est possible de créer, supprimer, ajouter du code à un module :o  Regarde ça :
MsgBox Workbooks("Classeur1").VBProject.VBComponents("module1").CodeModule.Lines(1, 1000000)
Bon, je ne vais pas expliquer à Edoir comment faire, il va nous faire des bêtises. Mais toi, comme tu en dis ... :D  :D 

+1 pour Zeb je dois bien l'avouer :pfff: 

Pour ton problème pourquoi tu ne fais pas un formulaire d'ouverture générique ?

Après tu as juste à gérer une base de documents existant :
Type : ballbar ou laser
Ressource : n° machine
Plan ou axe : selon sélection
Emplacement : Stockage du clavier

Tout ca est géré par tes userform actuel en gérant simplememnt un onglet bdd caché.
Expert Programmation

  1. If ComboBox1.ListIndex = 0 Then
  2. FileCopy quelfichier, "I:\toto\Ballbar\" + ressource + "xy.pdf"
  3. Unload UserForm5
  4. Unload UserForm3
  5. End If
  6. If ComboBox1.ListIndex = 1 Then
  7. FileCopy quelfichier, "I:\toto\Ballbar\" + ressource + "xz.pdf"
  8. Unload UserForm5
  9. Unload UserForm3
  10. End If
  11. If ComboBox1.ListIndex = 2 Then
  12. FileCopy quelfichier, "I:\toto\Ballbar\" + ressource + "yz.pdf"
  13. Unload UserForm5
  14. Unload UserForm3
  15. End If


En regardant ça, je me dis, et si tu avais eu 12352423 cas différents, tu aurais fait 12352423 blocs ?

Regarde, plus c'est clair, mieux on s'y retrouve :
  1. Dim a(3) As String
  2. Dim i As Integer
  3.  
  4. ...
  5.  
  6. a(0) = "xy"
  7. a(1) = "xz"
  8. a(2) = "yz"
  9.  
  10. i := ComboBox1.ListIndex
  11.  
  12. FileCopy quelfichier, "I:\toto\Ballbar\" + ressource + a(i) + ".pdf"
  13. Unload UserForm5
  14. Unload UserForm3



Pour passer un paramètre à un UserForm, définis-y des variables de type Public ou mieux, une fonction spéciale. C'est mille fois plus propre.



Alors pour faire correctement les choses, le UserFormTruc, tu l'appelles userformLaser, et l'autre userformBabar.
Comme ça, on sait de quoi on parle.
Dans le code de userformLaser, tu mets ce genre de truc :
  1. Dim Axe(6) As Integer
  2.  
  3. Public Sub SetAxes(X As Integer, Y As Integer, Z As Integer, A As Integer, B As Integer, C As Integer)
  4. Axe(0) = X
  5. Axe(1) = Y
  6. Axe(2) = Z
  7. Axe(3) = A
  8. Axe(4) = B
  9. Axe(5) = C
  10. End Sub


Là où tu appelles userformLaser, tu mets :
  1. Sub ShowLaser(X As Integer, Y As Integer, Z As Integer, A As Integer, B As Integer, C As Integer)
  2. Load UserForm1
  3. UserForm1.SetAxes X, Y, Z, A, B, C
  4. UserForm1.Show
  5. End Sub


Je ne sais pas si ce sont des Integer ou pas, à toi de voir.

tout d'abord zeb Merci pour l'astuce du a(i) j'ai modifier plein d'endroit de mon code qui etait de la meme structure je me retrouvais des fois avec 9 serie de if end if
par contre j'ai ecrit
  1. i = ComboBox1.ListIndex


Ensuite quand je veux afficher une fenetre userform ( que je doit renomer pour plus de comprehension ;)  )
suis je obligé de mettre tout le temps
  1. load userform1
  2. userform1.show

ou juste
  1. userform1.show


car dans l'aide ils disent load charge et show affiche mais show implique t il par defaut un load ?

bon je vais etudier la deuxieme partie du message

A+ Edoir


Bon mais mon problème n’est toujours pas résolut .
Pour le moment le code a juste été optimisé.

Comment faire pour que sa créé automatiquement mes macros
C’est pas bien compliquer si ? ?
se que je veux c'est inserer
  1. Private Sub laserxyzt()
  2. Load UFlaser
  3. ressource = "xyzt"
  4. UFlaser.Show
  5. End Sub
  6. Private Sub ballbarxyzt()
  7. Load UFballbar
  8. ressource = "xyzt"
  9. UFballbar.Show
  10. End Sub

dans Module2 en replacent xyzt par la valeur qui est dans ma variable public ressource

A+ Edoir

je suis bien d'accord avec toi freeman23 mais le problème c'est que le fichier Excel et fais de la manière suivante et quand on est stagiaire ... c'est facile de proposé mais pas évident de faire appliqué surtout a bac+2

Les lignes sont différents types caractéristiques
Les colonne sont les valeurs pour une machine et un moment dans la ligne caractéristique il y a laser, ballbar et a se moment la il y a un bouton


mechine1 machine2 machine 3
course x 10 20 15
y 5 23 85
z 45 100 39
vitesse
... ... ... ..
... ... .... ...
Laser btn1 btn2 btn3
Ballbar btn 4 btn5 btn6

En espérant eclaircir la situation

A+ Edoir


Edit Je veux bien comprendre que cela parait aberant comme technique...
120 machine 2 boutons par machine 240 boutons 240 micro macro de 3 lignes..

a defaut de reponse je cherche sur une autre piste mais qui n'a l'air de ne pas etre possible techniquement

Le lancement de macro avec des argument
exemple quand je clik sur btn1 sa lance la macro laser(N°ressource) mais excel me met une erreur comme quoi c'est trop compliquée pôur etre affecter a un objet ...

Sinon est il possible d'affecter un bouton a une case pressise exemple
mon btn1 est a la ligne 20 et quand je clik dessu il va lire la valeur de la ligne 5 pour la stocker toujours dans une variable toujour en restant dans la meme colonne

A+ Edoir
Expert Programmation

Le code pour un bouton, c'est toujours un Sub dans paramètre.
Donc pour le bouton btn1, il faut mettre le code suivant :
  1. Sub btn1_Click()
  2. Laser( <les bonnes valeurs> )
  3. End Sub

bon ba je vais me resigner a faire un bouton pour toute les machine oui l'on choisit l'axe et le numero de la ressource... car a chaque fois la macro d'jout de fichier sera obliger d'ecrire dans le code de la macro ...


Bouton qui fait une ligne haut et 20 cellules de large ...
Lassé par la pub ? Créez un compte