VB Excel petite aide

Résolu/Fermé
Prince Mehdi Messages postés 34 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 10 mars 2011 - 13 janv. 2010 à 20:21
Prince Mehdi Messages postés 34 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 10 mars 2011 - 26 janv. 2010 à 09:54
Bonjour,

J'ai un petit soucis, je suis actuellement en stage chez GDF Suez en 1ère année DUT QLIO. Le technicien maintenance et le responsable du site m'ont demandé de réaliser deux programmes en VB. Ils y connaissent rien en programmation donc même si je débute en programmation VB j'essaie de me débrouiller d'apprendre petit à petit. J'ai des idées mais je n'arrive pas à écrire un programme correct.

Le premier programme

Le technicien maintenance du site a un problème, lorsqu'il doit changer de filtres et de courroies sur des centrales d'air, il faut qu'il se déplace pour voir quelles longueurs de filtres et de courroies il a besoin, puis qu'il aille les chercher dans les chaufferies. C'est une perte de temps inutile. Pour cela dans un premier temps j'ai crée un programme très simple qui en fonction du numéro de la CTA rentrée donne les longueurs de filtres et de courroies correspondantes:

PublicSub Filtres_et_courroies ( )

Dim CTA As Integer

CTA = inputbox ("Sur quelle Centrale de Traitement d'Air souhaitez vous intervenir ?")

If CTA = 1 then
MsgBox "Filtres : media en carton 180 * 50"
MsgBox "Courroies : Texrope VP2"
End If

If CTA = 2 etc...
...
End Sub

Bon ce premier programme est très simpliste mais il a l'avantage de marcher. ^^ Maintenant j'aimerai améliorer l'interface c'est-à-dire est-il possible d'avoir le message et la réponse dans le même bouton ? Le technicien n'entre pas seulement des chiffres pour les CTA mais aussi des noms: CTA 1 mais aussi CTA Auditorium, comment avoir un type qui fonctionne pour des chiffres mais aussi des caractères ?





Second programme:

Maintenant le technicien maintenance a besoin d'aller chercher ces filtres et ces courroies. J'ai crée sous Excel un fichier de gestion de stocks. J'aimerai que mon programme surligne la ligne ou les lignes correspondant à la référence rentrée par l'utilisateur. Par exemple, il rentre filca21050 pour un filtre en carton de 210*50 et le programme surligne la ligne correspondante dans la feuille excel qui indique notamment la quantité, le lieu.


Merci pour votre aide et je rappelle que je suis débutant j'ai commencé le VBA il y a 2 mois ^^"
A voir également:

41 réponses

tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
13 janv. 2010 à 23:09
bonjour,
alors premier truc, pr ta premiere procédure, tu peux aussi utiliser un structure select case..when... :
select case CTA
when 1 then MsgBox "Filtres : media en carton 180 * 50" & vbcrlf & "Courroies : Texrope VP2"
when 2 blablablabla
end select
(au passage j'ai tt mis ds une seule msgbox avec un retour charriot)
ensuite "avoir le message et la réponse sur un meme bouton" : là j'ai pas bien compris.... :s
qqes question spour le 2eme programme : qd ton utilisateur l'execute, dans quel classeur/feuille se trouve-t-il ?
derniere question : pourquoi ne pas faire "tout en un", un programme qui demande le CTA, affiche les ref en msgbox, ouvre ton fichier de stocks et mets la ligne en surbrillance (ou "filtre" cette ligne) ?
0
Prince Mehdi Messages postés 34 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 10 mars 2011 2
14 janv. 2010 à 09:45
Déjà merci pour votre réponse tompols.

Effectivement la structure select est plus intéressante et plus claire je ne la connaissais pas. Pour ce que vous n'avez pas compris, en fait je voulais savoir si l'utilisateur peut rentrer la CTA et les réponses s'affiche directement dans le même bouton mais c'est sans grand intérêt.

Pour l'idée du Tout en un c'est serait vraiment bien si j'arrivais à le faire c'est une bonne idée. Mais comment faire pour que le fichier de stock s'ouvre automatiquement après l'exécution de la première partie. Puis il faudrait que mon programme me permette de surligner la ligne dans le fichier de stock. En fait dans mon fichier de stocks, j'ai inscrit pour chaque élément une référence. Par exemple pour un filtre en carton de 180 * 56 la référence est filca18056. j'aimerai que l'utilisateur tape cetet référence et le programme surligne toute la ligne correspondante à cette référence.

Pour ma feuille de gestion de stocks c'est un fichier excel à part entière et j'ouvre une procédure à partir de ce fichier.
0
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
14 janv. 2010 à 10:22
re,
aucun mais une question encore : ds le fichier stock, l'utilisateur doit taper la ref et ça met la ligne en surbrillance => c pas tres pratique pour l'utilisateur ça, il va devoir parcourir le fichier pour retrouver sa ligne, en plus ça nous oblige à gere le retour en couleur normale....pourquoi pas juste un filtre automatique ? l'avantage que l'utilisateur n'a pas à saisir (pas de possibilité de faute de frappe) mais juste à choisir la ref ds une liste déroulante, et seule la ligne concernée sera affichée...
apres qd je te lis, jme dis qu'on peut aussi determiner la ref dès ton premier code, ensuite ouvrir ton fichier stock (Workbooks.Open Filename:="D:\magestiondestock.xls")et filtrer la ligne concernée non ? en mode Tout En Un....
ça ferait un truc du genre :
Select Case CTA
Case 1
    MsgBox "Filtres : media en carton 180 * 50" & vbCrLf & "Courroies : Texrope VP2"
    ref = filca18050
Case 2
    blablabla
End Select
Workbooks.Open Filename:="D:\messtock.xls"
Set feuilstock = Workbooks("mestocks.xls").Sheets("stock")
feuilstock.AutoFilterMode = True

'utilisation du filtre automatique à voir ds l'aide vba....
au passage dsl mais j'm'étais un peu mélangé avec la syntaxe du CASE...WHEN en SQL, la synjtaxe ci-dessus est correcte....
0
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 404
14 janv. 2010 à 10:48
pour le cas ou l'utilisateur saisirai soit un chiffre soit un mot genre auditorium tu remplace le type de CTA de integer vers string (un chiffre en string restera un chiffre mais laissera la possibilité a la variable d'avoir des lettres). par contre je ne sais pas si l'on peut utiliser un or dans un select case, si ce n'est pas possible tu peu utiliser tes if et mettre "if CTA="1" or CTA="auditorium" then ... "
0

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

Posez votre question
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
14 janv. 2010 à 11:07
re,
pas de pb pour evaluer des strings avec select case mais pas de OR (!?) plutot des CASE ( CASE 1 blablabla CASE "auditorium" blablabla etc)....
0
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 404
14 janv. 2010 à 11:14
le OR c'est pour que le 1 et le auditorium soit sur une même ligne et ai ainsi un seul message de retour (c'est juste par soucis d'économie de place ^^)

mais je doute qu'il n'y ai pas de probleme pour le string dans le select case si la variable est un integer (c'est peut etre qu'une répétition inutile de ma part)
0
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
14 janv. 2010 à 11:19
re,
pour la meme ligne :
Case "1", "bla" (separer les differents case par des virugules)
"mais je doute qu'il n'y ai pas de probleme pour le string dans le select case si la variable est un integer (c'est peut etre qu'une répétition inutile de ma part) " là le probleme n'est pas le select case mais est en amont, au niveau de la variable : essayer de stocker une string ds une variable integer renverra une erreur (incompatibilité de type)
0
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 404
14 janv. 2010 à 11:31
c'est bien on est sur la même longueur d'onde ^^
donc pour résumer:
- premiere question:
comment avoir un type qui fonctionne pour des chiffres mais aussi des caractères ? changer le type de CTA en string (et par la même occasion utiliser un select case)

- pour la deuxième question:
d'après ce que j'ai compris de la proposition de tompols ca serai de faire un tri

mais a ta place j'aurai fait une interface graphique (sur excel via vba) pour que l'utilisateur puisse choisir sa référence ou son cta par un combobox (liste déroulante), et ainsi lors du clic sur le bouton de validation, donner toutes les info juste en dessous
dans l'avenir ca pourrai permettre de rajouter des fonctionnalité aisément via des onglets ou des boutons supplémentaire, d'effectuer des tri sur un ou plusieurs critère, etc...
0
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
14 janv. 2010 à 11:46
re,
pour le 1, dsl j'avais pas vu l'histoire de typage....string c bien
pour le 2 ma propal était de faire un filtre pas un tri

apres j'essayais de faire simple, sinon on peut imaginer stocker les valeurs possibles de CTA ds une table (avec les refs correspondantes), une table des ref (code, description -type si nécessaire ?- ), un table stock, une table mouvement de stock etc....mais là on s'oriente vers du dev d'appli avec base de données (plus propre, plus "pro" mais plus long à faire et on repart à zéro)...y'a aussi la piste avec un userform et des tableaux excel, à mi-chemin entre les 2 (j'aime pas trop, pour moi soit on bricole, soit on fait une solution plus "industrialisée", un trop gros "bricolage" amène peu de retour sur investissement, et la maintenance pose souvent probleme.....)
0
Prince Mehdi Messages postés 34 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 10 mars 2011 2
14 janv. 2010 à 13:54
Merci garion28. L'idée du combobox est intéressante mais je ne sais pas comment elle fonctionne. Et d'après ce que j'ai compris tompols, une fois que le programme a ouvert mon fichier, il faut utiliser le filtre automatique pour pouvoir effectuer une recherche de la référence dans la feuille Excel.

Tompols:
"ds le fichier stock, l'utilisateur doit taper la ref et ça met la ligne en surbrillance => c pas tres pratique pour l'utilisateur ça, il va devoir parcourir le fichier pour retrouver sa ligne, en plus ça nous oblige à gere le retour en couleur normale....pourquoi pas juste un filtre automatique ? l'avantage que l'utilisateur n'a pas à saisir (pas de possibilité de faute de frappe) mais juste à choisir la ref ds une liste déroulante, et seule la ligne concernée sera affichée... "

Pour les références, en fait elles sont logiques, si le technicien maintenance a besoin d'un filtre 280 * 56, la référence est: 28056. Je pense que c'est plsu pratqieu de la chercher dans un menu déroulant puisqu'il n'y a pas besoin de chercher dans ce cas. Je pensais faire un programme qui en fonction de la référence rentrée surligne la ligne correspondante dans la feuille.

Pour mon second programme j'ai l'idée mais pas la structure...


PublicSub Recherche ( )

Dim ref As String

ref = inputbox ("Quelle est votre référence ?")

Select case ref

ref ...

ref ...

End Select

End Sub
Le problème c'est que mon fichier excel contient environ 200 références... -__-"
0
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 404
14 janv. 2010 à 14:04
pour manipuler un combobox c'est combobox.additem(item) tu peu trouver la syntaxe et d'autre aide pour ca facilement sur internet
le tout c'est de parcourir toutes les référence et les mettres dans la combobox a l'ouverture du fichier ou bien a un certain moment (après je ne sais plus si ca peu se faire direct ou bien si l'on doit utiliser un tableau

après pour le nombre de ref et le select case, je ne sais pas si tu peu mettre une boucle dans le select case afin de ne pas avoir a écrire tout les cases. mais pour moi ce n'est pas très pratique pour 200 ref puisque ca peu nécessiter une mise en page au cas par cas
0
Prince Mehdi Messages postés 34 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 10 mars 2011 2
14 janv. 2010 à 14:30
OK merci pour la réponse ^^ Est ce que un Fo pour des c ellules ça marche. Par exemple:
...
ref = inputbox ("Quelle référence ?")
For CellsB2 to CellsB156
Surligner la ligne de la référence rentrée
...

J'ai cette idée pour le moment sinon je pense qu'il faudra faire au cas par cas... TT_TT
0
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 404
14 janv. 2010 à 14:35
avec cette syntaxe ce n'est pas possible mais tu peu faire
for i=1 to 156
'ton traitement
fin for
0
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
14 janv. 2010 à 14:53
re, pour ton 2eme code, tu peux faire un truc comme ça :
Public Sub Recherche()
Dim ref As String
ref = InputBox("Quelle est votre référence ?")
derlig = Range("B65536").End(xlUp).Row
For i = 2 To derlig 'la premiere ligne contient les titres de colonnes
    If Range("A" & i).Value = ref Then
        Rows(i).Interior.ColorIndex = 6
    End If
Next i
End Sub

le probleme est qu'il va te falloir gerer le retour à une couleur normale à la fermeture du classeur....
avec un filtre :
Sub Recherche()
Dim ref As String
ref = InputBox("Quelle est votre référence ?")
Application.ScreenUpdating = False
If ActiveSheet.AutoFilterMode = True Then
    ActiveSheet.AutoFilterMode = False
End If
Rows("1:1").AutoFilter
Selection.AutoFilter Field:=1, Criteria1:=ref
Application.ScreenUpdating = True
End Sub
0
Prince Mehdi Messages postés 34 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 10 mars 2011 2
14 janv. 2010 à 15:44
Merci Tompols mais je ne comprends cette ligne du code:
derlig = Range("B65536").End(xlUp).Row

En fait le premier FOR permet de passer en revue toutes les références.
Le IF qui suit sert à quoi ?

pour le retour à la couleur normale, c'est une deuxième procédure associée à la première que tu asécrite ? Je ne comprends pas un gros passage du code:

Application.ScreenUpdating = False
If ActiveSheet.AutoFilterMode = True Then
ActiveSheet.AutoFilterMode = False
End If
Rows("1:1").AutoFilter
Selection.AutoFilter Field:=1, Criteria1:=ref
Application.ScreenUpdating = True

Merci pour ton aide ^^
0
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 404
14 janv. 2010 à 15:54
derlig = Range("B65536").End(xlUp).Row
sert a trouver la derniere ligne vide a partir de la fin du fichier, c'est une fonction de vba

Le IF qui suit sert à quoi ?
il sert a surligner la ligne quand elle correspond avec ref
0
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
14 janv. 2010 à 16:18
alors :
- "pour le retour à la couleur normale, c'est une deuxième procédure associée à la première que tu asécrite ?" => en fait je l'ai pas écrite mais il s'agirait de créer une procedure evenementielle (Private Sub Workbook_BeforeClose(Cancel As Boolean)) qui parcours les lignes avant la fermeture du classeur et si la couleur est celle définie ds la premiere macro(ColorIndex = 6), remet en non-colorisé...j'l'ai pasécrite parceque c'est vraiment pas ma piste préferée et puis fo bien que tu bosses un peu, sinon ds pas lgtps on te retrouve sur le forum avec les memes question :p
-explication du code
Application.ScreenUpdating = False ' => désactive le rafraichissement écran, du coup c plus rapide et ça clignote pas de partout :)
If ActiveSheet.AutoFilterMode = True Then '=>la je teste si le filtre auto est déjà activé
ActiveSheet.AutoFilterMode = False '=>si oui, je le désactive pour éviter des erreurs par la suite(ouaip jme suis pas cassé trop la tete desactiver plutot que gerer des erreurs....).
End If
Rows("1:1").AutoFilter '=> active le filtre automatique
Selection.AutoFilter Field:=1, Criteria1:=ref '=>filtre sur le premier champ du tableau avec la valeur de ref
Application.ScreenUpdating = True ' =>réactive l'affichage

voilà....
0
Prince Mehdi Messages postés 34 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 10 mars 2011 2
19 janv. 2010 à 08:43
Très bien merci pour vos réponses je vais déjà commencer par faire ces procédures pour voir ce que ça donne. Je vous iens au courant ;-) Merci encore. :)
0
Prince Mehdi Messages postés 34 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 10 mars 2011 2
19 janv. 2010 à 09:10
Voici les 2 procédures que j'ai tapées pour le moment:

Public Sub Filtres_courroies()

Dim CTA As String

CTA = InputBox("Sur quelle C.T.A. voulez-vous intervenir ?")

Select Case CTA

Case 1
MsgBox "FILTRES" & vbCrLf & "dimensions: 180*550" & vbCrLf & vbCrLf & "COURROIES" & vbCrLf & "désignation: 1900 SPZ"

Case 2
MsgBox "FILTRES" & vbCrLf & "dimensions: 1800*5500" & vbCrLf & vbCrLf & "COURROIES" & vbCrLf & "désignation: 1900 SPA"

End Select

End Sub



Public Sub recherche()

Dim ref As String

ref = InputBox("Quelle est la référence de l'élément que vous recherchez ?")


For i = 5 To 165 Step 1
For j = 2 To 12 Step 1
If Range("A" & i & j).Value = ref Then
Rows(i & j).InteriorColorIndex = 10
Cells(i, j).Interior.Color = RGB(185, 253, 208)
End If
Next
Next

End Sub

Mais ma deuxième procédure ne colorie pas la ligne de la référence... j'ai essayé de modifier ma procédure mais toujours rien T_T
0
Prince Mehdi Messages postés 34 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 10 mars 2011 2
19 janv. 2010 à 10:26
Public Sub Filtres_courroies()

Dim CTA As String

CTA = InputBox("Sur quelle C.T.A. voulez-vous intervenir ?")

Select Case CTA

Case 1
MsgBox "FILTRES" & vbCrLf & "dimensions: 180*550" & vbCrLf & vbCrLf & "COURROIES" & vbCrLf & "désignation: 1900 SPZ"

Case 2
MsgBox "FILTRES" & vbCrLf & "dimensions: 1800*5500" & vbCrLf & vbCrLf & "COURROIES" & vbCrLf & "désignation: 1900 SPA"

End Select

End Sub

Public Sub recherche()

Dim ref As String

ref = InputBox("Quelle est la référence de l'élément que vous recherchez ?")

derlig = Range("B65536").End(xlUp).Row

For i = 5 To derlig Step 1

If Range("C" & i).Value = ref Then

Rows(i).Interior.ColorIndex = 6

End If

Next i

End Sub





Sa a l'air de marcher !! Je tape la ou les références et c'est bon. Mais le problème c'est que ça me surligne toute la ligne ... Je voudrais que ça me surligne par exemple pour j = 2 To 11, j'ai rajouté un For j et un Next j à la fin mais ça marche pas. Quelqu'un peut m'aider ?
0