[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
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
je vais develloper un peu plus et inserer du code
voila le module
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
Voila mon userform5
A+ Edoir
voila le module
Private Sub laserxyzt()
Load UserForm1
UserForm1.Tag = "xyzt"
UserForm1.Show
End Sub
Private Sub ballbarxyzt()
Load UserForm2
UserForm2.Tag = "xyzt"
UserForm2.Show
End Sub
Private Sub Laser050390()
Load UserForm1
UserForm1.Tag = "050390"
UserForm1.Show
End Sub
Private Sub Ballbar050390()
Load UserForm2
UserForm2.Tag = "050390"
UserForm2.Show
End Sub
Private Sub Laser050391()
Load UserForm1
UserForm1.Tag = "050391"
UserForm1.Show
End Sub
Private Sub Ballbar050391()
Load UserForm2
UserForm2.Tag = "050391"
UserForm2.Show
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
Private Sub laserxyzt()
Load UserForm1
UserForm1.Tag = "xyzt"
UserForm1.Show
End Sub
Private Sub ballbarxyzt()
Load UserForm2
UserForm2.Tag = "xyzt"
UserForm2.Show
End Sub
Voila mon userform5
Private Sub CommandButton1_Click()
If ComboBox1.ListIndex = 0 Then
FileCopy quelfichier, "I:\toto\Ballbar\" + ressource + "xy.pdf"
Unload UserForm5
Unload UserForm3
End If
If ComboBox1.ListIndex = 1 Then
FileCopy quelfichier, "I:\toto\Ballbar\" + ressource + "xz.pdf"
Unload UserForm5
Unload UserForm3
End If
If ComboBox1.ListIndex = 2 Then
FileCopy quelfichier, "I:\toto\Ballbar\" + ressource + "yz.pdf"
Unload UserForm5
Unload UserForm3
End If
Sheets("ajout").Select
ActiveSheet.Buttons.Add(294.75, 166.5, 96.75, 48.75).Select
Selection.OnAction = "ballbar" + ressource
Selection.Characters.Text = "ballbar"
Range("H16").Select
MsgBox "Couper et coller le bouton"
'dire ecrit la valeur de ressource a la place de xyzt
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
Private Sub UserForm_Activate()
ComboBox1.AddItem "Plan XY"
ComboBox1.AddItem "Plan XZ"
ComboBox1.AddItem "Plan YZ"
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.
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.
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à :
Freeman, il est possible de créer, supprimer, ajouter du code à un module
Regarde ça :
Et voilà :
Private Sub UneSeuleSubPourTout(tag As String, formnum As Integer)
Dim form As Variant
Select Case formnum
Case 1: Set form = New UserForm1
Case 2: Set form = New UserForm2
Case Else
MsgBox "C'est quoi ce bourdel, y'a pas d'autr form que 1 ou 2 !!!!"
Exit Sub
End Select
Load form
form.tag = tag
form.Show
End Sub
Freeman, il est possible de créer, supprimer, ajouter du code à un module
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 ...
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
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
( Ouh qu'il m'énerve
http://atilf.atilf.fr/dendien/scripts/tlfiv5/visusel.ex...;s=267435585;r=1;nat=;sol=0; )
http://atilf.atilf.fr/dendien/scripts/tlfiv5/visusel.ex...;s=267435585;r=1;nat=;sol=0; )
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.
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
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 ...
+1 pour Zeb je dois bien l'avouer
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é.
If ComboBox1.ListIndex = 0 Then
FileCopy quelfichier, "I:\toto\Ballbar\" + ressource + "xy.pdf"
Unload UserForm5
Unload UserForm3
End If
If ComboBox1.ListIndex = 1 Then
FileCopy quelfichier, "I:\toto\Ballbar\" + ressource + "xz.pdf"
Unload UserForm5
Unload UserForm3
End If
If ComboBox1.ListIndex = 2 Then
FileCopy quelfichier, "I:\toto\Ballbar\" + ressource + "yz.pdf"
Unload UserForm5
Unload UserForm3
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 :
Dim a(3) As String
Dim i As Integer
...
a(0) = "xy"
a(1) = "xz"
a(2) = "yz"
i := ComboBox1.ListIndex
FileCopy quelfichier, "I:\toto\Ballbar\" + ressource + a(i) + ".pdf"
Unload UserForm5
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 :
Dim Axe(6) As Integer
Public Sub SetAxes(X As Integer, Y As Integer, Z As Integer, A As Integer, B As Integer, C As Integer)
Axe(0) = X
Axe(1) = Y
Axe(2) = Z
Axe(3) = A
Axe(4) = B
Axe(5) = C
End Sub
Là où tu appelles userformLaser, tu mets :
Sub ShowLaser(X As Integer, Y As Integer, Z As Integer, A As Integer, B As Integer, C As Integer)
Load UserForm1
UserForm1.SetAxes X, Y, Z, A, B, C
UserForm1.Show
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
Ensuite quand je veux afficher une fenetre userform ( que je doit renomer pour plus de comprehension
)
suis je obligé de mettre tout le temps
ou juste
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
par contre j'ai ecrit
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
load userform1
userform1.show
ou juste
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
dans Module2 en replacent xyzt par la valeur qui est dans ma variable public ressource
A+ Edoir
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
Private Sub laserxyzt()
Load UFlaser
ressource = "xyzt"
UFlaser.Show
End Sub
Private Sub ballbarxyzt()
Load UFballbar
ressource = "xyzt"
UFballbar.Show
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..
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
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
Lassé par la pub ? Créez un compte