[VB Excel 97] Macro evolutive

  • Auteur de la discussion edoir
  • Date de début

edoir

Habitué
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
 

zeb

Modérateur
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.
 

edoir

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

voila le module

[cpp]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[/cpp]

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

[cpp]Private Sub laserxyzt()
Load UserForm1
UserForm1.Tag = "xyzt"
UserForm1.Show
End Sub
Private Sub ballbarxyzt()
Load UserForm2
UserForm2.Tag = "xyzt"
UserForm2.Show
End Sub[/cpp]

Voila mon userform5

[cpp]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
[/cpp]

A+ Edoir
 

Freeman23

Expert
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.
 

zeb

Modérateur
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à :
Code:
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 :o Regarde ça :[fixed]MsgBox Workbooks("Classeur1").VBProject.VBComponents("module1").CodeModule.Lines(1, 1000000)[/fixed]Bon, je ne vais pas expliquer à Edoir comment faire, il va nous faire des bêtises. Mais toi, comme tu en dis ... :D :D
 

edoir

Habitué
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
 

zeb

Modérateur
[strike]( Ouh qu'il m'énerve :fou: http://atilf.atilf.fr/dendien/scripts/tlfiv5/visusel.exe?11;s=267435585;r=1;nat=;sol=0; )[/strike]
 

edoir

Habitué
heu mais la sub uneseulesubpourtout remplace quoi

je comprend pas se que fais ton code
 

zeb

Modérateur
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:
 

edoir

Habitué
oui mais les parametres agisses sur quoi precisement?

Car il y a a peu pres 120 machien donc 120 N° de ressource mais apres en fichier PDF sa en fait tout de suite plus
 

zeb

Modérateur
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.
 

edoir

Habitué
les X y z sont les axe des machines et les tag pour passer les parametres c'est pas moi qui a eu l'idée je suis parti d'un bout de programe existant l'ancienne version du catalogue
 

Freeman23

Expert
Freeman, il est possible de créer, supprimer, ajouter du code à un module :o Regarde ça :[fixed]MsgBox Workbooks("Classeur1").VBProject.VBComponents("module1").CodeModule.Lines(1, 1000000)[/fixed]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é.
 

zeb

Modérateur
Code:
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 :
Code:
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 :
Code:
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 :
Code:
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.
 

edoir

Habitué
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
[cpp]
i = ComboBox1.ListIndex
[/cpp]

Ensuite quand je veux afficher une fenetre userform ( que je doit renomer pour plus de comprehension ;) )
suis je obligé de mettre tout le temps
[cpp]
load userform1
userform1.show
[/cpp]
ou juste
[cpp]
userform1.show
[/cpp]

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


 

Freeman23

Expert
J'ai été confronté à ce problème et sur Excel le load n'est pas necessaire en tout cas sur la version XP, il me semble que ca sert surtout en VB pur.
 

zeb

Modérateur
Interdiction de passer trois minutes à poser une question quand 30 secondes suffisent à vérifier par soi-même. :o
 

edoir

Habitué
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
[cpp]Private Sub laserxyzt()
Load UFlaser
ressource = "xyzt"
UFlaser.Show
End Sub
Private Sub ballbarxyzt()
Load UFballbar
ressource = "xyzt"
UFballbar.Show
End Sub[/cpp]
dans Module2 en replacent xyzt par la valeur qui est dans ma variable public ressource

A+ Edoir
 

Freeman23

Expert
Pourquoi tu t'obstine à vouloir un bouton par document... Alors qu'il est plus simple et conviviable de créer un formulaire qui puisse ouvrir n'importe qu'elle type de documents...
 

edoir

Habitué
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..
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 126
Messages
6 717 807
Membres
1 586 365
Dernier membre
matiOs1
Partager cette page
Haut