Un débutant a besoin d'aide en Programmation VBA..

vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012 - 1 févr. 2011 à 16:51
vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012 - 5 févr. 2011 à 14:57
Bonjour à tous,
Je suis nouveau stagiaire dans une entreprise, et mon premier projet consiste à exploiter les données d’un classeur Excel qui se remplit au fur et à mesure des jours, en créant une macro qui me sortirait un graphe en fonction de certains paramètres. L’unique et tout petit problème c’est que je n’ai jamais utilisé Visual Basic de toute ma vie et que je dois rendre ce projet pour très bientôt !
C’est donc un peu désespéré que je m’adresse à vous !

Dans le détail :
Premièrement je travaille avec Excel 2003.

J’ai un classeur avec en colonne, appelons la A, l’heure à laquelle la mesure a été prise, et dans d’autres colonnes pleines de données de Température, de vitesse, de puissance. Notons que ce classeur se remplit quasi-automatiquement grâce à une première Macro de mon prédécesseur.

1. Donc ma première contrainte est de créer une boucle qui n’a pas de limite, qui s’arrêterait à la dernière ligne écrite lors de l’exécution de la macro.

2. Le graphe doit représenter en abscisse le temps, c'est-à-dire la colonne A, et en ordonnée une des autres colonnes, appelons la C.

3. Jusque là pas si compliqué, le problème c’est que je ne dois pas sélectionner toutes les valeurs de la colonne C (et donc de la colonne A) mais uniquement certaines en fonction des valeurs de la colonne B.
Par exemple, je veux sélectionner pour le graphe toutes les lignes pour lesquelles la valeur de la colonne B est comprise entre 108 et 112.

4. Et enfin comme ce programme est destiné à être utilisé par des ignorants de l’informatique, j’ai besoin de pouvoir rendre cela plus ergonomique avec des InputBox qui me permettraient de rentrer la colonne et les valeurs entre lesquelles doivent être comprises les valeurs de la colonne B.

Je sais c’est un peu compliqué expliqué comme cela mais je ne connais pas du tout le langage Visual Basic et les tutoriels que j’ai trouvé sont soit beaucoup trop théoriques, soit totalement inutile pour m’aider à créer une macro.

Mon idée première est de stocker dans une feuille cachée nommée Temporaire

Private Sub Worksheet_Activate()
InfoChargement.Caption = ""
' Sheets("Temporaire").Visible = True
Sheets("Temporaire").Visible = False
End Sub

Les valeurs qui m’intéressent (en fonction de la colonne B) avec une boucle qui testerait une par une les valeurs de la colonne B.
J’ai donc besoin d’aide pour la boucle puisque je ne connais pas le bon langage. En MAPLE, j’aurai voulu utiliser une boucle « While » pour ne pas être gêné par le nombre aléatoire de lignes dans le tableau.

Je déclare i comme un entier naturel de valeur 1 comme valeur de départ
Et Y[i], Z[i] comme valeurs positives pas forcément entières
Z[i] = Feuil1.Range(« C[i] »).Value
Y[i] = Feuil1.Range(« A[i] »).Value
Avec un « if » Feuil1.Range(« B[i] »).Value < 108 or Feuil1.Range(« B[i] »).Value >112
Then Do i = i + 1 Break
Else Do Temporaire.Range(“A[i]”).Value = Y[i]
And Temporaire.Range(“C[i]”).Value = Z[i]
End do
End if.

Comment la traduire en langage Excel???

Deuxième problème :
Les valeurs 108 et 112 sont ici choisies au hasard, comment faire pour les remplacer par les valeurs de mes paramètres ??

Excel me poserait la question : Quelle Feuille ?
Quelle Colonne ? (Colonne C)
Entre quelles valeurs de … ? (Colonne B)
Et là je suis totalement perdu parce que dans MAPLE je n’ai jamais fait ce genre de choses…
Pour les problèmes de syntaxe, genre déclaration des variables je pourrais corriger plus tard.
J'espère que vous pourrez m'aider, ou m'orienter vers le droit chemin.
J'ai deja lu quelques tutoriels faits pas certains internautes sur le site, je commence un peu à comprendre comment cela fonctionne, mais j'ai vraiment besoin d'un coup de pouces. S'il vous plait :-)

je vous en remercie d'avance

16 réponses

userrrqi115 Messages postés 181 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 4 février 2011
2 févr. 2011 à 11:45
Hello,
Petit coup de pouce pour la derniere ligne du classeur :
lastrow=cells(65536,1).end(xlup).row

Pour un boucle sur les cellules :
For each cell in range(sheets(1).cells(1,1), sheets(1).cells(lastrow,1)
If cell.offset(0,1).value > tmin and cell.offset(0,1).value < tmax then
'....
end if
Next cell


Pour recuperer tes variable de temperature, il sera plus ergonomigue d'utiliser une UserForm.

BR

USERRRQI115
Simple user
Great brain
0
vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012
2 févr. 2011 à 13:03
Merci beaucoup déja pour ça. Je vais essayer de trouver un tuto pour savoir utiliser une UserForm.

Quelqu'un saurait-il m'expliquer comment faire apparaitre une boite de dialogue ou je puisse selectionner la colonne et les paramètres qui vont bien.
0
vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012
2 févr. 2011 à 16:18
Je me suis renseigné sur les UserForms, j'ai créé un CommandButton_Click qui me fait apparaitre un USF où j'ai mis un ComboBox pour pouvoir faire défiler les différentes Rubriques que je voudrais faire rentrer en Ordonnée de mon graphe.

Mon probleme c'est que ces rubriques sont en lignes et non en colonnes donc impossible pour moi de les rentrer dans RowSource.
De plus, je voudrais pouvoir sélectionner toute une colonne (toute une rubrique) en sélectionnant dans le combobox uniquement le titre de la colonne. Comment faire ?

Userrrqi115, j'ai compris ton idée (ici apparemment tu testes les valeurs de la colonne 1) mais je ne sais pas comment coder le fait que je veuille récupérer la cellule qui vient à l'instant d'être testée..
Je ne peux pas en effet dire, si le test est positif,

Then Sheet(2).Range(B&i).Value=Sheet(1).Range(B&i)
puisque je ne sais pas du tout où on en est dans le test, et je ne veux pas laisser de blanc dans ma colonne . Comment demander de remplir la colonne au fur et à mesure que le test est positif?
0
userrrqi115 Messages postés 181 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 4 février 2011
2 févr. 2011 à 16:31
RE,
Je reprend mon code et le complete un peu :
r2=2 ' ce sera la ligne de la Feuil2 accueillant les données
For each cell in range(sheets(1).cells(1,1), sheets(1).cells(lastrow,1)'boucle sur la colonne A
If cell.offset(0,1).value > tmin and cell.offset(0,1).value < tmax then
'le test se fait sur la colonne B càd même ligne (0) et 1ère colonne suivante(1)
'....
sheets(2).cells(r,1).value=cell.value'récupere la valeur d'abscice à reprendre dans la colonne A
sheets(2).cells(r,2).value=cell.offset(0,1).value'récupere la valeur  t° à reprendre dans la colonne B
'... le plus simple est de reprendre toutes les données potentiellement selectionnables.
r2=r2+1' passage à la ligne suivante
end if
Next cell


BR
USERRRQI115
Simple user
Great brain
0

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

Posez votre question
vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012
2 févr. 2011 à 18:18
Merci beaucoup je vais essayer ca dès que possible.
Juste deux questions:
tu commences par r2=2, je ne comprend pas exactement ce que ca veut dire .
le "r" dans cells(r,2) je le déclare Integer? et à quoi correspond-il exactement? je comprend qu'il évolue au cours de la boucle mais je ne vois pas où il débute
0
userrrqi115 Messages postés 181 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 4 février 2011
2 févr. 2011 à 19:40
Re,
r2=2 pour commencer à la seconde ligne. Si tu as une ligne d'en-tête.
et plus bas en fait c'est :
sheets(2).cells(r2,1).value=cell.value

Le r2 est donc ton n° de ligne dans ta seconde feuille, et il s'incrémente (+1) à chaque fois qu'une cellule remplie la double condition (< et >
BR
USERRRQI115
Simple user
Great brain
0
vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012
2 févr. 2011 à 21:40
Merci beaucoup pour ces précisions.
Si je veux commencer à la troisième ligne par exemple, je dois écrire r2= 3 c'est ca?
0
vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012
3 févr. 2011 à 09:27
j'ai essayé ta formule en l'adaptant à mes colonnes

Sub Graphique()
lastrow = Cells(65536, 1).End(xlUp).Row
r2 = 2
For Each cell In Range(Sheets("LA Td").Cells(5, 3), Sheets("LA Td").Cells(lastrow, 3))
If cell.Offset(0, 1).Value > 106 And cell.Offset(0, 1).Value < 114 Then

Sheets("Feuil1").Cells(r2, 1).Value = cell.Value
Sheets("Feuil1").Cells(r2, 2).Value = cell.Offset(0, 23).Value
r2 = r2 + 1
Else
End If
Next cell

End Sub

Le probleme maintenant c'est qu'il m'affiche un message d'erreur dans une boite de dialogue où il est simplement écrit "400"..
0
vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012
3 févr. 2011 à 10:13
Correction:
Sub Graphique()
lastrow = Cells(65536, 1).End(xlUp).Row
r2 = 2
For Each cell In Range(Sheets("LA Td").Cells(5, 3), Sheets("LA Td").Cells(lastrow, 3))
If cell.Value > 106 And cell.Value < 114 Then

Sheets("Feuil1").Cells(r2, 1).Value = cell.Value
Sheets("Feuil1").Cells(r2, 2).Value = cell.Offset(0, 23).Value
r2 = r2 + 1
Else
End If
Next cell

End Sub

Je veux tester la colonne 3 à partir de la ligne 5.
Avec ce code, toujours message d'erreur 400... J'ai cherché une erreur mais je ne trouve toujours pas!
0
userrrqi115 Messages postés 181 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 4 février 2011
3 févr. 2011 à 17:53
Hello,
as-tu une ligne qui est surligné en jaune ?
Peut-être qu'au niveau de la détermination il faudrait indiquer la feuille :
lastrow = Sheets("LA Td").cells(65536,1).end(xlup).row
Ou alors le else qui ne sert à rien.
BR
USERRRQI115
Simple user
Great brain
0
vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012
3 févr. 2011 à 18:49
Ce n'est pas le Else prq je l'avais pas mis et ca marchait deja pas.
Le probleme c'est qu'il n'y a pas de ligne surlignée en jaune comme quand il y a une erreur dans le code.
J'ai essayé Option Explicit en déclarant toutes les variables mais ca ne change rien.
Je vais préciser le lastrow et je vais voir si ca change quelque chose.
Merci encore
0
vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012
3 févr. 2011 à 19:25
J'ai essayé ca ne fonctionne toujours pas.
Est-ce que la Feuille dans laquelle j'ai écrit la procédure compte? Je l'ai écrit dans une feuille autre que "LA Td" et autre que "Temporaire". En effet la feuille temporaire sera cachée dans le programme final pour ne pas surcharger le classeur.
Y-a-t-il une autre méthode que For each cell in range sinon?

J'ai une autre question pour la suite:
J'ai créé une Userform nommé Userform1 que je lance avec un bouton commande.

Dans la Userform1 j'ai un menu défilant où j'ai du rentrer manuellement le nom des colonnes parce que je n'arrive pas à mettre un argument du type F4:Z4. il n'accepte que le type F4:F26, j'ai également un bouton commande, et je voudrais qu'en cliquant dessus il déclenche la macro que j'essaie de faire marcher pour l'instant en vain. Comment lui affecter une macro sachant qu'il est dans une Userform? je n'arrive pas à trouver le code sur internet.

Comment utiliser mon choix dans le menu défilant? Je voudrais qu'il y ait un truc du genre:
If CommonBox1.Value = "Palier 1" Then
'Selectionne la colonne H correspondant au "palier 1".
Je pourrais créer une procédure préliminaire qui me donne une valeur à une variable i
en fonction de la colonne
et ensuite on remplace le cell(1,1) par cell(1,i).
le probleme c'est que je ne sais pas exploiter le choix de ma combobox.


Dans l'ordre, je clique sur mon premier bouton
Qui me fait apparaitre l'userform1
Je fais mon choix dans ma combobox
Je clique sur le bouton de l'userform1 une fois le choix fait.
Ca me lance ma procédure qui bug avec le bon "i" qui correspond au choix de la combobox.
0
userrrqi115 Messages postés 181 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 4 février 2011
3 févr. 2011 à 19:44
Re,
En fait ton code est à mettre dans un module.
Dans l'explorateur de projet tu cliques droit sur une element puis insertion module.
Ou alors dans Excel tu utilises l'enregistreur de macro, lorsque tu en enregistre une un module se crée.
Pour faire executer du code dans un bouton ou autre element :
Quand tu double cliques sur le control (element : commandbutton, combobox...) tu accedes aux evenement de ceux-ci, par defaut sur le bouton de commande, l'evennement est click.
Ici soit tu intègres ton code directement soit tu l'appel : application.run"MaMacro".
Macro que tu laisse dans un module.

Autre astuce : tu lances ton userform à partir d'un bouton. Il possible de la faire apparaitre à partir de l'ouverture du classeur : dans l'explorateur de projet, double cliques sur l'objet Workbook, il existe plusieurs evennement pour cet objet dont Open.
br
USERRRQI115
Simple user
Great brain
0
vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012
4 févr. 2011 à 11:59
J'ai copié ma procédure dans le module 2, maintenant il m'affiche un bug 1004 il me surligne la ligne Sheets("Temporaire").Cell(r2,1).Value=Cell.Value

J'ai remis r2=2 que j'avais oublié et la le message de bug disparait mais ca ne me lance pas la procédure. Rien n'apparait dans la feuille temporaire comme ca devrait se faire..

Je t'envoies le fichier ce soir userrrqi115 prq la je ne peux pas sur l'ordi pourri du boulot
0
userrrqi115 Messages postés 181 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 4 février 2011
4 févr. 2011 à 17:52
Hello,
il manque un s :
Sheets("Temporaire").Cells(r2,1).Value=Cell.Value

Cells est ce qui te permet d'identifier une cellule et cell est le nom de ma variable de type range que j'utilise pour la boucle. C'est vrai que ce nom peut générer un de confusion...
BR

USERRRQI115
Simple user
Great brain
0
vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012
5 févr. 2011 à 14:57
Ok je vais essayer ca. Mais je suis pas tout a fait sur d'avoir fait cette faute "d'orthographe". Je t'ai envoyé mon fichier normalement
0
Rejoignez-nous