VB Excel petite aide

Résolu
Prince Mehdi Messages postés 44 Statut Membre -  
Prince Mehdi Messages postés 44 Statut Membre -
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 ^^"
Configuration: Mac OS X
Safari 531.21.10

41 réponses

  • 1
  • 2
  • 3
Résumé de la discussion

Un stagiaire DUT QLIO développe deux programmes VBA pour automatiser des tâches; le premier calcule les longueurs de filtres et de courroies selon le numéro ou le nom d’une CTA. Le deuxième programme cherche à mettre en évidence une référence dans un fichier Excel de stocks, afin d’indiquer la quantité et le lieu, mais limiter le surlignage à une ligne pose problème. Parmi les retours, la structure Select Case et l’usage d’InputBox ont été proposés, avec des conseils sur le typage et l’ouverture du fichier de stock, ainsi que l’emploi d’un ComboBox. En cas de besoin, des pistes évoquées incluent l’utilisation d’un filtre automatique ou d’un formulaire réutilisant des listes déroulantes pour afficher directement la ligne correspondante sans saisie.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    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
  2. Prince Mehdi Messages postés 44 Statut Membre 2
     
    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
  3. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    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
  4. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    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
  7. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  8. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    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
  9. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  10. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    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
  11. Prince Mehdi Messages postés 44 Statut Membre 2
     
    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
  12. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  13. Prince Mehdi Messages postés 44 Statut Membre 2
     
    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
  14. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    avec cette syntaxe ce n'est pas possible mais tu peu faire
    for i=1 to 156
    'ton traitement
    fin for
    0
  15. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    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
  16. Prince Mehdi Messages postés 44 Statut Membre 2
     
    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
  17. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  18. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    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
  19. Prince Mehdi Messages postés 44 Statut Membre 2
     
    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
  20. Prince Mehdi Messages postés 44 Statut Membre 2
     
    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
  21. Prince Mehdi Messages postés 44 Statut Membre 2
     
    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
  • 1
  • 2
  • 3